【问题标题】:Center CAShapeLayer within custom UIView Subclass在自定义 UIView 子类中居中 CAShapeLayer
【发布时间】:2016-08-22 08:01:03
【问题描述】:

我创建了一个自定义 UIView 子类。在其中,我创建了一个CAShapeLayer 作为CAGradientLayer 的掩码。我正在使用情节提要和@IBDesignable,情节提要中的一切看起来都很好。这是完美的外观:

当我在模拟器中运行应用程序时,它看起来不正常:

这是设置它的代码:

@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)
}

.....

我尝试更改frames 并使用awakeFromNibrequired init?(coder aDecoder: NSCoder) 来设置视图,但它似乎不起作用。我想在 UIView 子类而不是 UIViewController 中做所有事情。

有什么想法吗?

【问题讨论】:

    标签: ios swift uiview core-animation frame


    【解决方案1】:

    您是否尝试过使用图层框架而不是自我:

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

    【讨论】:

    • 感谢您的回复!我刚刚尝试了您的建议,但它仍然没有出现在正确的位置。这很奇怪,因为@IBDesignable 在情节提要中正确显示它,但在模拟器中它不起作用。还有其他想法吗?
    • 也许这个解决方案会对你有所帮助:stackoverflow.com/questions/2504151/…
    • 谢谢,我试过了,但还是不行:(如果你还有什么,请告诉我。谢谢!
    • 你用 layer.frame 试过了吗?
    • 是的,我在layoutSubviews() 中做了progressLayer.frame = layer.boundsprogressLayer.frame = self.bounds。这是你的意思吗?
    猜你喜欢
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    相关资源
    最近更新 更多