Question

J'ai un UIView qui contient une rangée de sous-classes de UIView . La sous-classe a remplacé drawRect : et a défini contentMode = UIViewContentModeRedraw .

Lorsque l'utilisateur écrase et étend le conteneur parent, vues d'enfant est écrasé et étiré. Au fur et à mesure du changement de forme, j'aimerais que drawRect soit appelé à plusieurs reprises pour modifier le contenu des vues enfants . Jusqu'à présent, j'ai échoué. Quelle est la bonne façon de faire cela?

A bientôt,

Doug

Était-ce utile?

La solution

Dans Cocoa, vous appelez rarement (voire jamais) drawRect. Il vous suffit de marquer la région ou la vue comme nécessitant une mise à jour. Le redessinage est planifié. Cela permet de redessiner plusieurs retraits pour plusieurs invalidations.

Pour Cocoa Touch, vous souhaitez soit [afficher le setNeedsDisplay] ou setNeedsDisplayinRect: (CGRect)

Autres conseils

Vous devez appeler [view setNeedsLayout] pour que les sous-vues reçoivent un appel drawRect: si la présentation change. Je n'ai toutefois pas testé cela.

Cette solution est un peu folle, mais elle a un sens logique et donne un excellent résultat visuel. Je travaille avec un NSLayoutManager et un couple de NSTextContainer , affichant le texte sur deux colonnes. Comme j'utilise plusieurs conteneurs de texte (et que je ne suis pas sûr de vouloir plusieurs UITextView ), je remplace la méthode draw (rect: CGRect) de MyDrawingView: UIView .

Le problème est que l'utilisation de self.contentMode = .redraw entraîne toujours un étirement mineur lors de la rotation - suffisamment important pour faire foncer les choses.

J'ai remarqué que définir contentMode = .left ou même contentMode = .scaleAspectFit était proche de ce que je voulais, en termes de rotation parfaitement pixelée. Mais évidemment, je n'ai pas eu l'appel du tirage dont j'avais besoin.

Donc, j'ai substitué layoutSubviews () , remplacé le contentMode par .scaleAspectFit , appelé super.layoutSubviews () , puis l'a changé. : P

override func layoutSubviews() {
    self.contentMode = .scaleAspectFit

    super.layoutSubviews()
    self.contentMode = .redraw
}

C'est ... parfait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top