5
votes

Redimensionner la police et le cadre avec pinchGesture lorsque textView isScrollEnabled = false

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 >

 entrez la description de l'image ici entrez la description de l'image ici

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

 entrez la description de l'image ici

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.


5 commentaires

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 code UIFont ? 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 utilisant UIImage 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 une UIImage 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.


3 Réponses :


0
votes

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


7 commentaires

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



7
votes

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

 Taille de police plus petite

 Pincez le zoom pour agrandir la taille de la police

Réponse mise à jour pour compatible avec UITextView


4 commentaires

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.



1
votes

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>


3 commentaires

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