2016-04-27 8 views
0

Ich erstellte eine benutzerdefinierte UIView Unterklasse. Darin habe ich eine CAShapeLayer als Maske für eine CAGradientLayer erstellt. Ich benutze Storyboards und mit @IBDesignable sieht alles gut im Storyboard aus. Dies ist, wie es aussieht, das ist perfekt:Center CAShapeLayer in benutzerdefinierte UIView Unterklasse

enter image description here

Wenn ich die app im Simulator laufen, erscheint es nicht ok:

enter image description here

Dies ist der Code, der diese einrichtet :

@IBDesignable 
class ProgressView: UIView { 

let progressLayer = CAShapeLayer() 
let gradientLayer = CAGradientLayer() 

override func layoutSubviews() { 
    super.layoutSubviews() 
    setup() 
} 

func setup() { 

    // Setup progress layer. 
    progressLayer.lineWidth = 3.0 
    progressLayer.fillColor = nil 
    progressLayer.strokeEnd = 1 
    progressLayer.strokeColor = UIColor.blackColor().CGColor 
    progressLayer.anchorPoint = CGPoint(x: 0.5, y: 0.5) 

    let radius = CGFloat(self.frame.height/2.5) 
    let startAngle = CGFloat(-M_PI/2) 
    let endAngle = CGFloat(3 * M_PI/2) 
    let path = UIBezierPath(arcCenter: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true) 

    progressLayer.path = path.CGPath 

    layer.addSublayer(progressLayer) 


    // Setup gradient layer mask. 
    gradientLayer.colors = [Constants.ColorPalette.teal.CGColor, Constants.ColorPalette.orange.CGColor, Constants.ColorPalette.pink.CGColor] 
    gradientLayer.startPoint = CGPoint(x: 0.5, y: 0) 
    gradientLayer.endPoint = CGPoint(x: 0.5, y: 1) 
    gradientLayer.frame = self.frame 
    gradientLayer.mask = progressLayer 

    layer.addSublayer(gradientLayer) 
} 

..... 

ich habe zu ändern versucht, die frames und mit awakeFromNib und required init?(coder aDecoder: NSCoder) zum Einrichten der Ansicht, aber es scheint nicht zu funktionieren. Ich möchte alles innerhalb der UIView Unterklasse und nicht ein UIViewController tun.

Irgendwelche Ideen?

Antwort

0

Haben Sie versucht, statt Selbstschicht-Rahmen zu verwenden: für die Beantwortung

let radius = CGFloat(layer.frame.height/2.5) 
    .... 
    gradientLayer.frame = layer.frame 
+0

Dank! Ich habe gerade Ihren Vorschlag ausprobiert, aber er erscheint immer noch nicht an der richtigen Stelle. Es ist seltsam, weil '@ IBDesignable' es im Storyboard korrekt anzeigt, aber im Simulator funktioniert es nicht. Irgendwelche anderen Ideen? – JEL

+0

Vielleicht hilft Ihnen diese Lösung: http://stackoverflow.com/questions/2504151/calayers-didnt-get-resized-on-its-uiviews-bounds-change-why –

+0

Danke, ich habe es versucht, aber immer noch nicht gut: (Wenn Sie noch etwas haben, lassen Sie es mich bitte wissen. Danke! – JEL