当相对于父视图中的其他元素添加约束时,Bezier drawRect 子视图不可见
Bezier drawRect subview not visible when constraints are added in relation to other elements in the superview
我已经添加了一个带有自己的 UIView class LogoLineView.swift 的子视图到父视图 ViewController.swift。
在故事板的超级视图中,我有 3 个 UI 元素:
- 带有一些彩色文本的标签来模拟徽标 "Hello World"
- 然后,我的子视图高度约为 5 点,宽度尽可能宽,我打算在其中绘制一条半蓝半红的水平线
- 最后,我有了另一个只有一些灰色文本的标签
现在,在我的子视图 class (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()
}
}
我遇到的问题是,当我相对于父视图中的其他元素向子视图添加约束时,我绘制的线不可见。
但是,如果我删除父视图中的所有其他元素并只保留子视图,那么我就可以看到按照我想要的方式绘制的线条。
我想在文本 "Hello World" 和文本 "This is my first time using Core Graphics and Bezier Paths" 之间画线。我希望这条线能够适应任何屏幕尺寸。
我使用的约束如下:
- "Hello World" 约束:
- 画线约束的子视图:
- 灰色文字"This is my first time using Core Graphics and Bezier Path"约束条件:
你能帮我找到丢失的东西吗?我对使用 Core Graphics 和 Bezier Paths 很陌生。谢谢。
自动布局系统折叠了您绘制线条的视图。您的文本视图未折叠的原因是它们具有固有高度。给你的线视图一个固定的高度约束,或者在你的视图子类中覆盖 intrinsicContentSize()
以便该视图也有一个固有的大小。
我已经添加了一个带有自己的 UIView class LogoLineView.swift 的子视图到父视图 ViewController.swift。
在故事板的超级视图中,我有 3 个 UI 元素:
- 带有一些彩色文本的标签来模拟徽标 "Hello World"
- 然后,我的子视图高度约为 5 点,宽度尽可能宽,我打算在其中绘制一条半蓝半红的水平线
- 最后,我有了另一个只有一些灰色文本的标签
现在,在我的子视图 class (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()
}
}
我遇到的问题是,当我相对于父视图中的其他元素向子视图添加约束时,我绘制的线不可见。
但是,如果我删除父视图中的所有其他元素并只保留子视图,那么我就可以看到按照我想要的方式绘制的线条。
我想在文本 "Hello World" 和文本 "This is my first time using Core Graphics and Bezier Paths" 之间画线。我希望这条线能够适应任何屏幕尺寸。
我使用的约束如下:
- "Hello World" 约束:
- 画线约束的子视图:
- 灰色文字"This is my first time using Core Graphics and Bezier Path"约束条件:
你能帮我找到丢失的东西吗?我对使用 Core Graphics 和 Bezier Paths 很陌生。谢谢。
自动布局系统折叠了您绘制线条的视图。您的文本视图未折叠的原因是它们具有固有高度。给你的线视图一个固定的高度约束,或者在你的视图子类中覆盖 intrinsicContentSize()
以便该视图也有一个固有的大小。