2017-04-15 6 views
2

ImagePickerControllerで画像を追加するUITextViewがあります。UITextViewは追加された画像でスクロールします

テキストがある場合はスムーズですが、3つまたは4つの画像を追加すると、そのコンテンツ内のスクロールで遅くなります。

画像を追加するときに画像を圧縮するのは最低の画質ですが、3枚目の画像よりもまだ遅れているので、何か間違っている必要があります。

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にEDIT

感謝を支援するための

おかげで私は、全体の遅れを削除し、画像をたくさんレンダリングのパフォーマンスを向上させることができました。私は交換してきたということで

私の次の内容の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

一つのこと、私はImageViewのに検索された画像を設定していないよ、私はNSAttributedStringへの添付ファイルとして、それを追加しています。どのように私はそれをaspectFitすることができますか? –

+0

答えをありがとう私はあなたの説明で私の問題を解決すると確信しています –

+0

ああ、私はその部分を見ませんでした。あなたは 'attach.image = ... 'というコードを持っています。イメージを拡大/縮小した後、attachment.imageに割り当てます。 –

1

そのないことを行うためのベストプラクティス。 UITextViewsは、すべてのビューではなく、テキストを意味します。

多数の画像に対して1、textview 2、UICollectionViewで構成されるカスタムUIViewを作成する必要があります。あなたもプロジェクト全体多くの場所で、このカスタムビューを再利用することができます。このように

+0

うーん...それは実際には素晴らしいヒントです。ありがとう –

+0

あなたがこの答えをマスクすると本当に感謝します:) – chetan

関連する問題