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
Wenn ich die app im Simulator laufen, erscheint es nicht ok:
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?
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
Vielleicht hilft Ihnen diese Lösung: http://stackoverflow.com/questions/2504151/calayers-didnt-get-resized-on-its-uiviews-bounds-change-why –
Danke, ich habe es versucht, aber immer noch nicht gut: (Wenn Sie noch etwas haben, lassen Sie es mich bitte wissen. Danke! – JEL