[Résolu] applyTransform sur scale d'une view ne fonctionne pas?
Salut,
j'aimerais déplacer un rectangle bleu dans un rectangle arrondi aux bords orange. J'ai un problème avec le scale du rectangle bleu, j'aimerais le mettre à 100% par défaut, puis jouer sur son scale, avec une animation.
Pour l'instant, le applyTransform ne fonctionne pas, j'ai testé de mettre le .fill() après le applyTransform mais il n'apparaà®t plus dans ce cas là .
Si je laisse tel quel, le rectangle bleu ne prend pas en compte le scale. Sauriez-vous pourquoi?
override func drawRect(rect: CGRect) {
let w = self.frame.size.width
let h = self.frame.size.height
var orange = UIBezierPath(roundedRect:
CGRectMake(w/2, h/2, 100, 40),
cornerRadius: 20)
orange.lineWidth = 10
UIColor.orangeColor().setStroke()
orange.stroke()
orange.addClip()
blue = UIBezierPath(rect: CGRectMake(w/2, h/2, 200, 80))
UIColor.blueColor().setFill()
blue.fill()
let scale : CGFloat = 0.5
blue.applyTransform(CGAffineTransformMakeScale(scale, scale))
//blue.fill()
}
Merci
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Crée une deuxième UIView enfant ou une CALayer enfant. Tu pourras facilement et efficacement l'animer avec les méthodes de UIView, ou avec Core Animation.
Normal. fill() remplit le BézierPath. Donc, si tu le fais après, forcément, ça ne marche pas!
Non. La syntaxe me semble correcte.
Merci Céroce, comment ferais-tu les classes avec le drawRect? Pour l'instant, le rectangle ne se met pas à la frame du parent, le 0,0 est en haut gauche de l'écran plutôt que d'être dans la view orange (qui se trouve au centre), et le rectangle arrondi orange n'est plus visible. Voici le code des 3 classes :
Le problème est que les deux vues ont exactement la même frame.
Ceci crée deux problèmes:
1) la frame est relative à la vue parente
C'est à dire que si tu écris frame = 100, 100, 300, 200
alors la vue enfant commence en 100, 100, _relativement_ à la vue parente.
2) le fond de la vue est noir
Quand tu vas ajouter la vue fille, son fond noir va masquer ce qui est dessiné dans la vue parente.
Solution: faire en sorte que les vues remplissent entièrement leur rectangle bounds (et non frame). Régler les frames, et pas les coordonnées passées à UIBezierPath. De toute façon, c'est la frame que tu animeras ensuite.
Merci, j'ai réussi à m'en sortir avec le code suivant. Pas sûr d'avoir compris l'histoire avec les bounds, mais en effet en jouant sur la frame et en bougeant la vue bleu, ça marche Avec un offset pour les cornerRadius aussi. Et bien vu pour le background color En mettant en clearColor ça marche bien. Voici le code :
drawRect ne doit absolument servir qu'à dessiner sur le contexte graphique, genre avec des méthodes de CGContextXXX()
Si au lieu de ça tu veux faire des formes avec des CALayer, c'est tout à fait possible, mais ça n'a rien à faire dans le drawRect() (qui est appelé à chaque frame ayant à être dessiné). Assembler des CALayer comme tu le fais ici, avec des CAShapeLayer et tout c'est très bien, mais c'est un peu comme quand on ajoute des UIViews en subview à d'autres UIView : c'est à faire une fois pour toutes (genre dans le init() par exemple) à la création de ta vue ; certainement pas à faire dans le drawRect, ce n'est pas sa place.
OK, bien noté