我的UIView子类中的graphOrigin属性存在问题。当我将graphOrigin
定义为计算变量时,它会将超视图的中心点转换为此视图的中心点,并在屏幕中央显示图形。当变量未被计算时,这不会发生。请参阅工作案例的代码和屏幕截图:
class GraphX_YCoordinateView: UIView {
var graphOrigin: CGPoint {
return convertPoint(center, fromView: superview)
}
@IBInspectable var scale: CGFloat = 50 {
didSet {
setNeedsDisplay()
}
}
override func drawRect(rect: CGRect) {
// Draw X-Y axes in the view
let axesDrawer = AxesDrawer(contentScaleFactor: contentScaleFactor)
axesDrawer.drawAxesInRect(bounds, origin: graphOrigin, pointsPerUnit: scale)
}
}
AxesDrawer是一个在当前视图中绘制轴的类,这里是drawAxesInRect的方法签名:
drawAxesInRect(bounds: CGRect, origin: CGPoint, pointsPerUnit: CGFloat)
以下是不起作用的案例的代码和屏幕截图:
class GraphX_YCoordinateView: UIView {
var graphOrigin: CGPoint! {
didSet {
setNeedsDisplay()
}
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
graphOrigin = convertPoint(center, fromView: superview)
}
@IBInspectable var scale: CGFloat = 50 {
didSet {
setNeedsDisplay()
}
}
override func drawRect(rect: CGRect) {
// Draw X-Y axes
let axesDrawer = AxesDrawer(contentScaleFactor: contentScaleFactor)
axesDrawer.drawAxesInRect(bounds, origin: graphOrigin, pointsPerUnit: scale)
}
}
所以我改变的只是初始化graphOrigin属性并在初始化器中计算它。在编辑此代码时,我根本没有碰过StoryBoard。
我尝试初始化内联变量:
var graphOrigin = convertPoint(center, fromView: superview)
但这是不允许的,因为在计算属性时未初始化隐式self
。
有人可以解释为什么superview的中心似乎根据变量的初始化方式改变位置吗?
答案 0 :(得分:1)
此功能
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
graphOrigin = convertPoint(center, fromView: superview)
}
表示您正在从xib加载视图,此时视图维度为600:600
(查看您的xib)。那样你的graphOrigin = 300:300
。这就是你看第二张照片的原因。
要解决该问题,您应该在graphOrigin
中的视图完成布局后计算viewDidLayout
。