【问题标题】:@IBDesignable UiView draw(_ rect: CGRect) works in IB but not on device@IBDesignable UiView draw(_ rect: CGRect) 在 IB 中有效,但在设备上无效
【发布时间】:2016-11-14 23:02:51
【问题描述】:

我在 UIControl 的子类 draw rect 函数中有一个圆形进度。斯威夫特 3,Xcode 8。

看起来像这样:

override func draw(_ rect: CGRect) {
        super.draw(rect)

        guard let ctx = UIGraphicsGetCurrentContext() else {
            return
        }

        let center = CGPoint(x:rect.size.width/2.0,y:rect.size.height/2.0)
        ctx.setStrokeColor(UIColor.cyan.cgColor)
        ctx.setLineWidth(40)
        ctx.setLineCap(.round)
        ctx.addArc(center: center, radius: radius, startAngle: 0, endAngle: CGFloat(M_PI * 2), clockwise: true)
        ctx.drawPath(using: .stroke)
}

这个视图正在以编程方式添加到@IBDesignable UIViewSubclass

override func awakeFromNib() {
        super.awakeFromNib()
        self.backgroundColor = UIColor.yellow

        self.circleTest = TestCircle(frame: self.bounds)
        self.addSubview(circleTest!)
        setupConstraints() //pins subview to edges of self.
    }

我哪里出错了?

【问题讨论】:

  • radius 在哪里设置?
  • 我建议结合使用视图调试器(确保圆形视图在您认为应该在的位置)和普通的调试器/日志记录(确保 rectcenterradius 是您认为应该是的)。这可能是一个约束错误。这可能是radius 问题。根据提供的信息很难确定。
  • 顺便说一句,使用rect 参数来推断圆的大小/中心有点危险。我建议您改为参考bounds。由于documentation says:rect 是“需要更新的视图边界部分。第一次绘制视图时,此矩形通常是视图的整个可见边界。但是,在后续的绘制操作中,矩形可能只指定视图的一部分。”
  • 半径在init函数中设置。半径 = self.frame.size.width/2。这显然是我的问题。不知道我是怎么错过的。

标签: swift3 core-graphics drawrect


【解决方案1】:

问题在于radius 的设置。在 cmets 中,您指出您将其设置在 init 中,并且您显然必须允许框架中的后续更改(尤其是在使用自动布局时),因此您可以将 radius 的分配移动到 draw(_:) (或者,如果您不使用draw(_:),而是使用CAShapeLayer 等,您可以在layoutSubviews() 中使用。

【讨论】:

  • 抢!这是一个“Rob 更好地了解这一点......”的案例 stackoverflow.com/questions/57364895 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 2018-03-28
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多