当相对于superview中的其他元素添加约束时,Bezier drawRect子视图不可见

时间:2016-03-24 19:43:15

标签: ios swift uibezierpath ios-autolayout

我已将一个带有自己的UIView类LogoLineView.swift的子视图添加到superview ViewController.swift中。

在我的故事板中的superview中,我有3个UI元素:

  • 带有一些彩色文字的标签,用于模拟徽标“Hello World”
  • 然后,我有大约5个高度的子视图,并且我想要绘制一条半蓝色和半红色的水平线的宽度
  • 最后,我有另一个标签只有一些灰色文字

enter image description here

现在,在我的子视图类(LogoLineView.swift)中,我将覆盖drawRect,如下所示:

class LogoLineView: UIView {

var lineWidth: CGFloat = 0.5 {didSet { setNeedsDisplay() } }
var blueLineColor: UIColor = UIColor.blueColor() { didSet { setNeedsDisplay() } }
var redLineColor: UIColor = UIColor.redColor() { didSet { setNeedsDisplay() } }
var subViewCenter: CGPoint {
    return convertPoint(center, fromView: superview)
}
override func drawRect(rect: CGRect) {

    var blueLinePath = UIBezierPath()
    blueLinePath.moveToPoint(subViewCenter)
    blueLinePath.addLineToPoint(CGPoint(x: bounds.minX, y: bounds.midY))
    blueLinePath.lineWidth = lineWidth;
    blueLineColor.set()
    blueLinePath.stroke()
    var redLinePath = UIBezierPath()
    redLinePath.moveToPoint(subViewCenter)
    redLinePath.addLineToPoint(CGPoint(x: bounds.maxX, y: bounds.midY))
    redLinePath.lineWidth = lineWidth;
    redLineColor.set()
    redLinePath.stroke()
}

}

我遇到的问题是,当我在子视图中添加与超视图中其他元素相关的约束时,我绘制的线条不可见。

enter image description here

但是,如果我删除了我的超级视图中的所有其他元素并只留下子视图,那么我能够按照我想要的方式看到我的线条。 enter image description here

我希望在“Hello World”文本和“这是我第一次使用Core Graphics和Bezier Paths”之间绘制我的线条。我希望这条线能够适应任何屏幕尺寸。

我正在使用的限制如下:

  • “Hello World”约束: enter image description here
  • 绘制线条约束的子视图: enter image description here
  • 灰色文本“这是我第一次使用Core Graphics和Bezier Path”约束: enter image description here
你可以帮我找一下缺少的东西吗?我很擅长使用Core Graphics和Bezier Paths。谢谢。

1 个答案:

答案 0 :(得分:1)

自动布局系统会折叠您绘制线条的视图。文本视图未折叠的原因是它们具有内在高度。为您的线视图提供固定的高度约束,或覆盖视图子类中的intrinsicContentSize(),以便该视图也具有内在大小。