【问题标题】:How does initializing UIView subclass properties affect superview's center?初始化 UIView 子类属性如何影响 superview 的中心?
【发布时间】: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


    【解决方案1】:

    这个功能

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        graphOrigin = convertPoint(center, fromView: superview)
    }
    

    表示你正在从xib加载视图,此时视图尺寸为600:600(看你的xib)。这样你的graphOrigin = 300:300。这就是你看到第二张照片的原因。

    要解决这个问题,您应该在viewDidLayout 中的视图完成布局之后计算graphOrigin

    【讨论】:

    • 谢谢!这些方法的执行顺序非常令人沮丧,这使得调试变得相当困难。有没有办法在视图子类中做到这一点,只有在视图控制器中?从另一个类中设置视图似乎是一种不好的做法。
    • 您可以在视图中执行此操作。只需覆盖layoutSubviews,调用它的超级然后你修改。
    猜你喜欢
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多