J'ai utilisé pinchGesture
pour effectuer un zoom avant et un zoom arrière textView
en utilisant le code ci-dessous.
a ajouté pinchGesture
à textView
@IBAction func handlePinch(recognizer:UIPinchGestureRecognizer) { if let textView = recognizer.view as? UITextView { let font = textView.font! var pointSize = font.pointSize let fontName = font.fontName pointSize = ((recognizer.velocity > 0) ? 1 : -1) * 1 + pointSize; if (pointSize < 13) { pointSize = 13 } if (pointSize > 100) { pointSize = 100 } textView.font = UIFont(name: fontName, size: pointSize) } }
delagate
@IBAction func handlePinch(recognizer:UIPinchGestureRecognizer) { if let view = recognizer.view as? UITextView { view.transform = view.transform.scaledBy(x: recognizer.scale, y: recognizer.scale) recognizer.scale = 1 } }
Résultat strong >
Voici la solution possible que j'ai appliquée mais je n'arrive toujours pas à trouver la solution parfaite.
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(self.handlePinch)) pinchGesture.delegate = self view.addGestureRecognizer(pinchGesture)
Résultat
En utilisant la solution ci-dessus, je parviens à augmenter la taille de la police mais le cadre textView ne se met pas à jour donc le texte est coupé car le cadre textView est plus petit.
Résultat attendu
La police sera augmentée et le cadre sera également mis à jour pour ressembler à zoom avant et arrière simples mais sans flou.
Vous cherchez la meilleure solution possible pour augmenter la taille de la police avec un cadre comme instagram et snapchat fait .
Merci.
3 Réponses :
Que faire si vous essayez d'activer le défilement au début de votre méthode handlePinch
et de le désactiver à nouveau à la fin du pincement?:
@IBAction func handlePinch(recognizer:UIPinchGestureRecognizer) { if let textView = recognizer.view as? UITextView { textView.isScrollingEnabled = true let font = textView.font! var pointSize = font.pointSize let fontName = font.fontName pointSize = ((recognizer.velocity > 0) ? 1 : -1) * 1 + pointSize; if (pointSize < 13) { pointSize = 13 } if (pointSize > 100) { pointSize = 100 } textView.font = UIFont(name: fontName, size: pointSize) let width = view.frame.size.width textView.frame.size = textView.sizeThatFits(CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)) textView.isScrollingEnabled = false } }
Oui, mais cela ne changera pas le cadre textView, donc lorsque la police est augmentée, il ne sera pas visible car le cadre textView est identique à l'ancien
J'ai modifié ma réponse, que faire si vous appelez sizeToFit sur le textView après avoir changé la police?
textView.sizeToFit () n'augmentera pas la largeur
Oui, vous avez raison, je pense que cela peut être résolu par la méthode sizeThatFit. Pouvez-vous vérifier ma réponse mise à jour?
Oui, mais c'est une solution de contournement uniquement parce que lorsque le niveau de zoom atteindra la largeur de la vue principale, la position du texte changera donc cela ne ressemblera pas à un zoom avant, un zoom arrière
Et si vous animiez ce processus? Pouvez-vous essayer? Ce ne serait toujours pas parfait, mais cela aurait peut-être l'air bien.
Non, je veux que cela paraisse beaucoup plus simple que le zoom avant, le zoom arrière, mais cela ne devrait pas être flou
Voici le code pour redimensionner la taille de la police avec le cadre sur le zoom avant / arrière à l'aide de UITextView et isScrollEnabled = false
@objc func pinchRecoginze(_ pinchGesture: UIPinchGestureRecognizer) { guard recognizer.view != nil, let view = recognizer.view else {return} if view is UITextView { let textView = view as! UITextView if recognizer.state == .began { let font = textView.font let pointSize = font!.pointSize recognizer.scale = pointSize * 0.1 } if 1 <= recognizer.scale && recognizer.scale <= 10 { textView.font = UIFont(name: textView.font!.fontName, size: recognizer.scale * 10) let textViewSiSize = textView.intrinsicContentSize textView.bounds.size = textViewSiSize } } }
Réponse mise à jour pour compatible avec UITextView
Je suis également capable de faire de même en utilisant UILabel, c'est pourquoi j'ai mentionné que je devais y parvenir en utilisant textView avec isScrollEnabled = false
@PinkeshGjr Vérifier la réponse mise à jour pour UITextView
essayez d'utiliser plusieurs lignes
J'ai essayé et testé avec plusieurs lignes de texte et cela fonctionne très bien. S'il vous plaît laissez-moi savoir si cela ne fonctionne pas avec votre configuration.
Voici le pour redimensionner la police et le cadre avec pinchGesture
lorsque textView
isScrollEnabled = false
.
@IBAction func handlePinch(recognizer:UIPinchGestureRecognizer) { if let view = recognizer.view { if view is UITextView { let textView = view as! UITextView if textView.font!.pointSize * recognizer.scale < 90 { let font = UIFont(name: textView.font!.fontName, size: textView.font!.pointSize * recognizer.scale) textView.font = font let sizeToFit = textView.sizeThatFits(CGSize(width: UIScreen.main.bounds.size.width, height:CGFloat.greatestFiniteMagnitude)) textView.bounds.size = CGSize(width: textView.intrinsicContentSize.width, height: sizeToFit.height) } else { let sizeToFit = textView.sizeThatFits(CGSize(width: UIScreen.main.bounds.size.width, height:CGFloat.greatestFiniteMagnitude)) textView.bounds.size = CGSize(width: textView.intrinsicContentSize.width, height: sizeToFit.height) } textView.setNeedsDisplay() } else { view.transform = view.transform.scaledBy(x: recognizer.scale, y: recognizer.scale) } recognizer.scale = 1 } }
p>
Cela crée un problème d'extension du cadrage tout en augmentant la taille de la police avec un zoom par pincement avec une seule ligne de texte.
@BhavikModi Comment pouvons-nous résoudre ce problème?
Merci @BhavikModi
En regardant vos commentaires dans la réponse, je suppose que vous rencontrez un problème avec
UIFont
et comment les vecteurs d'une police personnalisée sont implémentés. (Je sais juste assez que la création d'une police personnalisée est dangereuse.) Deux réflexions: (1) Savez-vous que vos sources de solution utilisent en fait un codeUIFont "en conserve" >? Est-il possible qu'ils aient créé leur propre police personnalisée - ils ont les effectifs et les ressources pour faire une telle chose. (2) Si ce n'est pas le cas, est-il possible qu'ils «contournent»
UIFont
en utilisantUIImage
et en animant? Bonne chance pour comprendre cela.Non, je veux juste faire un zoom avant, un zoom arrière sur le texte
Je comprends ça. Mais je suis curieux - vous faites-vous une fausse hypothèse? Pensez-vous qu'Instagram et SnapChat font ce que vous pensez ... animer un changement de taille de police sans flou ... mal? Si vous pensez que vous vous trompez, pourquoi? Connaissez-vous - encore une fois, je connais juste assez pour être dangereux - les éléments internes de
UIFont
au point que vous savez que cela peut être fait? C'est ce que je vois, c'est votre hypothèse «de base».Alors comment peuvent-ils implémenter ce type de fonctionnalité?
Voir ma modification de mes commentaires et les combiner avec mon premier commentaire. Peut-être qu'ils utilisent un
UIFont
personnalisé - ils ont sûrement les ressources nécessaires pour créer un alphabet pixellisé qui peut le faire - ou peut-être qu'ils ont trouvé un moyen plus simple - en utilisant uneUIImage
pour " Développer / réduire "le champ de texte sans flou a alors montrant le champ de texte" terminé ". Vous posez une excellente question - je l'ai votée pour - et je pense juste "en dehors de la boîte" parce que jusqu'à présent, personne n'a de réponse.