首页 > 解决方案 > 自动布局完成后调用的 Swift 方法

问题描述

我有一种方法可以在按下按钮时通过在滑块顶部添加 ImageView 来绘制图钉。这是代码:

    var loopStartImageView : UIImageView = UIImageView()


    func addLoopDrawing(at time: CMTime, for loop: Int) {

        let imgHeight : CGFloat = 30
        let imgWidth: CGFloat = 30

        var pinImg : UIImage = UIImage(named: "pin2x")!

        let inset = slider.frame.origin.x
        let width = slider.bounds.width

        let xPos : CGFloat = CGFloat((Float(time.seconds) / slider.maximumValue)) * width + inset - (imgWidth / 2)
        var yPos : CGFloat = slider.frame.origin.y - (slider.frame.height / 2) - 3

        let imgV = UIImageView(frame: CGRect(x: xPos, y: yPos, width: imgWidth, height: imgHeight))
        imgV.image = pinImg

        loopStartImageView = imgV
        view.addSubview(loopStartImageView)
        view.sendSubviewToBack(loopStartImageView)
    }

当我不使用自动布局来设置滑块的位置时,绘图是正确的,但是一旦我这样做,它就会显示在实际定位的下方。

此方法在 viewDidLoad 中调用。我的猜测是,由于某种原因,调用 viewDidLoad 时未设置自动布局定位。

我想知道是否有一种方法可以在自动布局完全调整后调用?

//

这应该是这样的:

它应该是什么样子

但这就是视图的加载方式(即使在 viewDidLayoutSubviews 中调用 addLoopDrawing 函数时)

在此处输入图像描述

标签: swiftuikitios-autolayout

解决方案


我想知道是否有一种方法可以在自动布局完全调整后调用?

那将是viewDidLayoutSubviews。这是一个非常好的时间来做一些依赖于具有正确框架的事情的事情,但要注意:它可以被多次调用。因此,通常的做法是与 Bool 属性一起实现它以检查这是第一次。

另一方面,最好不要问这样的 xy 问题。滑块顶部的图像视图的想法似乎是错误的。描述你真正想做的事情可能会更好。


推荐阅读