2017-04-15 5 views
2

J'ai un UITextView dans lequel j'ajoute des images, avec ImagePickerController.UITextView retarde le défilement avec des images ajoutées

S'il n'y a que du texte dedans, c'est lisse, mais après avoir ajouté 3 ou 4 images il devient laggy on scroll dans son contenu.

Je compresse l'image en l'ajoutant, à sa qualité la plus basse, mais je dois faire quelque chose de mal parce qu'elle traîne toujours après la troisième image.

Voici le code:

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) } 
} 

Ce qui peut être à l'origine de cette question et toute astuce comment puis-je outrepasser cela?

Merci pour aider

EDIT

Merci à Duncan C J'ai réussi à éliminer le retard entier et augmenter les performances de rendu des images beaucoup.

par que j'ai remplacé mon imagePickerController avec le contenu suivant:

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) 

Répondre

1

Vous abusant du facteur d'échelle. Cela est destiné à gérer la mise à l'échelle 1x, 2x et 3x des images rétine normales, rétiniennes et @ 3x.

La façon dont vous le faites, le système doit rendre les images en taille réelle dans vos rectangles de limites chaque fois qu'il veut en dessiner un. Si les images sont considérablement plus grandes que la taille que vous les affichez, vous perdez beaucoup de temps de mémoire et de traitement. Commencez simplement par régler le contentMode de votre vue d'image sur .scaleAspectFit et installez l'image originale en mode d'image sans déraper avec le facteur d'échelle. Voyez comment cela fonctionne. Si les performances ne sont pas acceptables, vous devez convertir vos images de départ en un contexte graphique hors écran correspondant à la taille cible de votre image et installer l'image ré-rendue dans vos vues d'image. Vous pouvez utiliser UIGraphicsBeginImageContextWithOptions() ou d'autres techniques pour redimensionner vos images à afficher.

Jetez un oeil à ce lien pour obtenir des informations sur l'image mise à l'échelle et le redimensionnement:

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

+0

Une chose, je ne suis pas mettre l'image récupérée à un imageView, je l'ajouter en pièce jointe à la NSAttributedString; comment puis-je l'aspectFit it? –

+0

Merci pour la réponse, je suis sûr que je vais résoudre mon problème avec votre explication –

+0

Oh, je n'ai pas vu cette partie. Vous avez le code 'attachment.image = ...' Après avoir mis votre image à l'échelle, assignez-la à attachment.image. –

1

Son pas la meilleure pratique de le faire. UITextViews est destiné au texte et non à toutes les vues.

Vous devez créer un UIView personnalisé composé d'un 1, textview 2, UICollectionView pour de nombreuses images.

De cette façon, vous pouvez réutiliser cette vue personnalisée à de nombreux endroits trop long du projet

+0

Hmm ...C'est en fait un bon conseil cependant; merci –

+0

J'apprécierais vraiment si vous masquez cette réponse comme utile :) – chetan