@IBDesignable UiView draw(_ rect: CGRect) 在 IB 中有效,但在设备上无效

Posted

技术标签:

【中文标题】@IBDesignable UiView draw(_ rect: CGRect) 在 IB 中有效,但在设备上无效【英文标题】:@IBDesignable UiView draw(_ rect: CGRect) works in IB but not on device 【发布时间】: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。这显然是我的问题。不知道我是怎么错过的。 【参考方案1】:

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

【讨论】:

抢!这是一个“Rob 更好地了解这一点......”的案例 ***.com/questions/57364895 :)

以上是关于@IBDesignable UiView draw(_ rect: CGRect) 在 IB 中有效,但在设备上无效的主要内容,如果未能解决你的问题,请参考以下文章

UIView 初始化覆盖导致 IBDesignable 崩溃

如何在 UIView 和 UIImageView 中重用相同的 IBDesignable 代码

如何从 UIBezierPath 创建 IBDesignable 自定义 UIView?

层的 UIView 的子层在 Storyboard 中显示为 @IBDesignable,但在模拟器中却没有

@IBDesignable UIView 不在情节提要中调用 init

渐变不填充 IBDesignable UIView