2017-04-15 10 views
2

ImagePickerController를 사용하여 이미지를 추가하는 UITextView이 있습니다.UITextView가 추가 된 이미지로 스크롤하는 데 뒤쳐집니다.

텍스트가있는 경우 부드럽지만 3 개 또는 4 개의 이미지를 추가하면 내용 내에서 스크롤시 뒤떨어집니다.

이미지를 추가 할 때 이미지를 압축 할 때 품질이 가장 낮지 만 이미지가 세 번째 이미지보다 뒤떨어져 있기 때문에 잘못 처리해야합니다.

이 문제 및 팁을 일으킬 수있는 어떤
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

    guard let _image = info[UIImagePickerControllerOriginalImage] as? UIImage else { return } 

    self.dismiss(animated: true, completion: nil) 

    // Compress the retrieved image 
    let compressedImage = UIImage(data: _image.lowestQualityJPEGNSData!) 

    //create and NSTextAttachment and add your image to it. 
    let attachment = NSTextAttachment() 
    let oldWidth = compressedImage?.size.width // scales it within the UITextView 
    let scaleFactor = oldWidth!/(bodyEditText.frame.size.width - 10); // adjusts the desired padding 
    attachment.image = UIImage(cgImage: (compressedImage?.cgImage!)!, scale: scaleFactor, orientation: .up) 

    //put your NSTextAttachment into and attributedString 
    let attString = NSAttributedString(attachment: attachment) 

    //add this attributed string to the current position. 
    bodyEditText.textStorage.insert(attString, at: bodyEditText.selectedRange.location) 
} 

extension UIImage { 
    var uncompressedPNGData: Data?  { return UIImagePNGRepresentation(self)  } 
    var highestQualityJPEGNSData: Data? { return UIImageJPEGRepresentation(self, 1.0) } 
    var highQualityJPEGNSData: Data? { return UIImageJPEGRepresentation(self, 0.75) } 
    var mediumQualityJPEGNSData: Data? { return UIImageJPEGRepresentation(self, 0.5) } 
    var lowQualityJPEGNSData: Data?  { return UIImageJPEGRepresentation(self, 0.25) } 
    var lowestQualityJPEGNSData:Data? { return UIImageJPEGRepresentation(self, 0.0) } 
} 

가 어떻게이 육교 수 있습니다 여기에

코드인가? 던컨 C에 편집

감사를 돕는

덕분에 나는 전체 지연을 제거하고 이미지를 많이 렌더링 성능을 향상시키기 위해 관리했습니다. 내가 대체 한 그함으로써

내 다음과 같은 내용으로 imagePickerController :

let size = __CGSizeApplyAffineTransform(_image.size, CGAffineTransform.init(scaleX: 0.3, y: 0.3)) 
    let hasAlpha = false 
    let scale: CGFloat = 0.0 // Automatically use scale factor of main screen 

    UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale) 
    _image.draw(in: CGRect(origin: CGPoint.zero, size: size)) 

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    let att = NSTextAttachment() 
    att.image = scaledImage 

    //put your NSTextAttachment into and attributedString 
    let attString = NSAttributedString(attachment: att) 

    //add this attributed string to the current position. 
    bodyEditText.textStorage.insert(attString, at: bodyEditText.selectedRange.location) 

답변

1

당신은 스케일 인자를 남용하고 있습니다. 이는 정상, 망막 및 @ 3x 망막 이미지의 1x, 2x 및 3x 스케일링을 처리하기위한 것입니다.

당신이하고있는 방식대로, 시스템은 풀 사이즈 이미지를 그릴 때마다 경계 사각형에 렌더링해야합니다. 이미지가 표시된 크기보다 이미지가 더 크다면 많은 메모리와 처리 시간을 낭비하게됩니다.

먼저 이미지 뷰의 contentMode.scaleAspectFit으로 설정하고 배율 인수를 사용하지 않고 이미지 뷰에 원본 이미지를 설치하십시오. 그것이 어떻게 수행되는지보십시오.

성능이 만족스럽지 않으면 시작 이미지를 이미지의 타겟 크기 인 오프 스크린 그래픽 컨텍스트로 렌더링하고 이미지 렌더링에 다시 렌더링 된 이미지를 설치해야합니다. UIGraphicsBeginImageContextWithOptions() 또는 다양한 다른 기술을 사용하여 표시 할 이미지의 크기를 조정할 수 있습니다.

이미지 크기 조정 및 크기 조정에 대한 자세한 내용은이 링크에서보세요 :

http://nshipster.com/image-resizing/

+0

한 가지, 내가 이미지 뷰에 검색된 이미지를 설정하고 있지 않다, 나는 NSAttributedString은에 첨부 파일로 추가 해요; 어떻게 aspectAit 할 수 있습니까? –

+0

답변 주셔서 감사합니다. 귀하의 설명에 문제가 해결 될 것이라고 확신합니다. –

+0

오, 그 부분을 보지 못했습니다. 당신은'attachment.image = ...'코드를 가지고 있습니다. 이미지를 스케일 한 후에 attachment.image에 할당하십시오. –

1

아니고 가장 좋은 방법이 할 수 있습니다. UITextViews는 모든보기가 아닌 텍스트 용입니다.

많은 이미지에 대해 1, textview 2, UICollectionView로 구성된 사용자 지정 UIView를 만들어야합니다. 당신이 너무 프로젝트 전반에 걸쳐 다양한 장소에서이 사용자 정의보기를 재사용 할 수 있습니다 이런 식으로

+0

음 ...그것은 실제로 좋은 팁입니다. 덕분에 –

+0

정말이 답변을 마스크로 유용하게 감사하겠습니다 :) – chetan