2016-08-22 2 views
1

J'ai créé une classe dans Swift pour animer le chargement du cercle en utilisant ce tutoriel https://www.raywenderlich.com/94302/implement-circular-image-loader-animation-cashapelayer, tout a bien fonctionné, mais quand j'essaie de changer la couleur de la course dans le contrôleur de vue dans lequel Je veux utiliser la classene peut pas changer une propriété de classe circulaire rapide Loader

class CircularLoaderView: UIView { 
let circlePathLayer = CAShapeLayer() 
var circleRadius: CGFloat = 20.0 
var strokeColor = UIColor.whiteColor() 


override init(frame: CGRect) { 
    super.init(frame: frame) 
    configure() 
} 

required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder)! 
    configure() 
} 

func configure() { 
    progress = 0 
    circlePathLayer.frame = bounds 
    circlePathLayer.lineWidth = 10 
    circlePathLayer.fillColor = UIColor.clearColor().CGColor 
    circlePathLayer.strokeColor = strokeColor.CGColor 
    layer.addSublayer(circlePathLayer) 
    backgroundColor = UIColor.clearColor() 
} 

Puis je définir les propriétés

//LoadingRing 
    progressIndicatorView.removeFromSuperview() 
    progressIndicatorView.frame = actionView.bounds 
    progressIndicatorView.circleRadius = (recordButtonWhiteRing.frame.size.height - 10)/2 
    progressIndicatorView.progress = 0.0 
    progressIndicatorView.strokeColor = UIColor.init(red: 232/255.0, green: 28/255.0, blue: 45/255.0, alpha: 1) 

Mais la course apparaît toujours blanche au lieu de la couleur nécessaire, S'il vous plaît toute aide!

+0

Essayez 'UIColor (rouge: 232/255,0, etc.' au lieu de 'UIColor.init (Vous finissez par mettre à nouveau le terme 'progressIndicatorView' dans votre hiérarchie de vue visible? –

+0

Oh, vous n'appelez' configure() 'que lorsque votre' CircularLoaderView' est * initialisé *, et c'est le bit que Définit 'circlePathLayer.strokeColor' en changeant la valeur de' strokeColor' après que cela n'affecte pas les valeurs de 'CAShapeLayer' sous-jacentes –

+1

Vous devez généralement implémenter' didSet' sur 'circleRadius' et' strokeColor' de telle sorte qu'ils mettre à jour 'circlePathLayer'. (Je recommanderais aussi Mend rendre 'circlePathLayer' une propriété' private', pour empêcher les classes externes de le modifier.) – Rob

Répondre

0

par la valeur de circlePathLayer.strokeColor est déterminée la couleur de la course, que vous modifiez en configure() lorsqu'une instance de votre indicateur de progression est créé - et quand votre instance est créée, son strokeColor est UIColor.whiteColor().

Vous pouvez brancher un écouteur pour synchroniser de votre vue strokeColor avec celle de son sous-jacent circlePathLayer:

var strokeColor = UIColor.whiteColor() { 
    didSet { 
    circlePathLayer.strokeColor = strokeColor.CGColor 
    } 
} 

ou tout simplement utiliser getters/setters pour exposer directement la strokeColor importante.

var strokeColor: UIColor { 
    get { 
    guard let cgColor = circlePathLayer.strokeColor else { 
     return UIColor.whiteColor() 
    } 
    return UIColor(CGColor: cgColor) 
    } 
    set (strokeColor) { 
    circlePathLayer.strokeColor = strokeColor.CGColor 
    } 
} 

(Edit: comme Rob a souligné, CGColor moulages sont nécessaires pour faire de ce bon-ish.)

+0

'strokeColor' de la couche de forme est un' CGColor', vous avez donc besoin de 'didSet {circlePathLayer.strokeColor = strokeColor.CGColor}'. Vous avez également besoin de modifications équivalentes dans votre exemple de propriété calculée. – Rob

+0

En outre, s'il utilise l'approche de la propriété calculée, il pourrait vouloir modifier sa méthode 'configure' (il est peu logique de définir le' strokeColor' du calque de forme à une valeur qui est juste calculée pour être le 'strokeColor' de la même couche de forme). – Rob