初始化UIView子类属性如何影响superview的中心?

时间:2015-04-24 18:22:40

标签: ios swift uiview initialization cs193p

我的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)
    }

}

Graph Is Centered

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)
    }
}

Graph Not Centered

所以我改变的只是初始化graphOrigin属性并在初始化器中计算它。在编辑此代码时,我根本没有碰过StoryBoard。

我尝试初始化内联变量:

var graphOrigin = convertPoint(center, fromView: superview)

但这是不允许的,因为在计算属性时未初始化隐式self

有人可以解释为什么superview的中心似乎根据变量的初始化方式改变位置吗?

1 个答案:

答案 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