【发布时间】:2015-04-24 18:22:40
【问题描述】:
我的 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。
谁能解释为什么超级视图的中心似乎会根据变量的初始化方式改变位置?
【问题讨论】:
标签: ios swift uiview initialization cs193p