@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
在哪里设置?
我建议结合使用视图调试器(确保圆形视图在您认为应该在的位置)和普通的调试器/日志记录(确保 rect
和 center
和radius
是您认为应该是的)。这可能是一个约束错误。这可能是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,但在模拟器中却没有