J'utilise le très pratique UIColor(patternImage:)
pour créer quelques CAShapeLayer
s avec des motifs en mosaïque dans une application iOS 10 avec Xcode 8.2. La mosaïque commence toujours à l'origine de la vue, ce qui peut être gênant si vous voulez qu'elle commence ailleurs. Pour illustrer, voici une capture d'écran du simulateur (le code ci-dessous):Comment changer la phase de UIColor patternImage dans Swift?
Le CAShapeLayer
à gauche commence à (0,0), donc tout va bien. Celui de droite est à (110,50), donc il est divisé en deux. Voici le code:
let firstBox = CAShapeLayer()
firstBox.fillColor = UIColor(patternImage: UIImage(named: "test-image")!).cgColor
view.layer.addSublayer(firstBox)
firstBox.path = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 100, height: 100)).cgPath
let secondBox = CAShapeLayer()
secondBox.fillColor = UIColor(patternImage: UIImage(named: "test-image")!).cgColor
view.layer.addSublayer(secondBox)
secondBox.path = UIBezierPath(rect: CGRect(x: 110, y: 50, width: 100, height: 100)).cgPath
Je veux régler la phase du motif de la CAShapeLayer
droite de sorte que les deux tuiles montrent un visage plein. Apple documentation pour UIColor (patternImage :) fait référence à une fonction obligeamment à cet effet:
Pour modifier la phase, rendre la couleur la couleur actuelle puis utilisez la fonction setPatternPhase(_:) pour changer la phase.
Sons simples! Mais j'ai du mal à le mettre en œuvre. Je ne suis pas vraiment sûr de ce que signifie «faire la couleur de la couleur actuelle». J'ai essayé d'obtenir le contexte actuel et appelant setPatternPhase
sur, à la fois avant et après l'attribution de la couleur de remplissage à la couche:
UIGraphicsGetCurrentContext()?.setPatternPhase(CGSize(width: 25, height: 25))
Aucun effet notable. J'ai essayé de sous-classer le UIView
contenant et en plaçant la phase dans sa méthode drawRect:
, comme suggéré dans this answer. Mais drawRect:
n'existe pas dans Swift, donc j'ai essayé à la fois draw(_ rect:)
et draw(_ layer:, in:)
. Les deux fonctions sont appelées, mais il n'y a pas d'effet notable.
class PatternView: UIView {
override func draw(_ rect: CGRect) {
UIGraphicsGetCurrentContext()?.setPatternPhase(CGSize(width: 25, height: 25))
super.draw(rect)
}
override func draw(_ layer: CALayer, in ctx: CGContext) {
ctx.setPatternPhase(CGSize(width: 25, height: 25))
super.draw(layer, in: ctx)
}
}
À la suggestion de Dave Weston, j'ai utilisé UIImage
« s .set()
pour régler la course en cours et remplir le contexte actuel avant d'appeler setPatternPhase
. Malheureusement, la sortie n'est pas affectée. Voici le code que j'ai essayé:
let secondBoxColor = UIColor(patternImage: UIImage(named: "test-image")!)
secondBoxColor.set()
UIGraphicsGetCurrentContext()?.setPatternPhase(CGSize(width: 50, height: 50))
let secondBox = CAShapeLayer()
secondBox.fillColor = secondBoxColor.cgColor
view.layer.addSublayer(secondBox)
secondBox.path = UIBezierPath(rect: CGRect(x: 110, y: 50, width: 100, height: 100)).cgPath
Comment puis-je changer la phase du motif qui est dessiné dans un CAShapeLayer
?
Merci pour votre aide. J'ai essayé d'utiliser 'set()' avant 'setPatternPhase()', mais cela ne fait pas de différence dans la sortie. J'ai édité ma question pour inclure le nouveau code (à la fin). Qu'est-ce que je fais mal? – Robert