使用堆栈视图时帧值不正确

时间:2015-07-26 22:34:46

标签: swift2 xcode7 ios9 uistackview

我将两个图像放入一个堆栈视图中。我想以编程方式将这两个方形图像转换为圆形,因此我使用以下代码。

class ProfileViewController: UIViewController {
    @IBOutlet weak var image1: UIImageView!
    @IBOutlet weak var image2: UIImageView!

    override viewDidLoad(){
        // Convert image one into circle
        self.image1.layer.cornerRadius = self.image1.frame.height/2
        self.image1.clipsToBounds = true

        // Convert image two into circle
        self.image2.layer.cornerRadius = self.image2.frame.height/2
        self.image2.clipsToBounds = true

        // Print the frames of these two images
        print(self.image1.frame)
        print(self.image2.frame)
    }
}

在示例中,帧的x和y值并不重要,但奇怪的是,尽管检查器选项卡上有值,但宽度和高度值都最终为零。

如果我在屏幕上添加一个按钮然后打印出两个图像的帧,我会得到预期的宽度和高度值。因此,我假设堆栈视图在viewDidLoad()方法触发后确定对象的尺寸。在这种情况下,获得实际帧尺寸以完善两个图像的最佳方法是什么?或者使用框架以外的值是更好的解决方案吗?

1 个答案:

答案 0 :(得分:4)

在您的情况下,因为您尝试访问图像视图的框架并使用UIStackView,所以框架实际上将首先布置在viewDidLayoutSubviews()中。因此,要获得所需的圆形图像,您需要首先为堆栈视图创建一个出口:

class ProfileViewController: UIViewController {
    @IBOutlet weak var verticalStackView: UIStackView!

    ...

然后在viewDidLayoutSubviews()方法中,访问堆栈视图的arrangedSubviews的索引以获取图像所在的视图(索引可以从Stack View层次结构中确定,在底部)然后像你一直那样得到圆角:

class ProfileViewController: UIViewController {
    @IBOutlet weak var verticalStackView: UIStackView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidLayoutSubviews() {
        let myImage = verticalStackView.arrangedSubviews[1] //in my test my image was the second view in the stack view hierarchy

        myImage.layer.cornerRadius = myImage.frame.height/2
        myImage.clipsToBounds = true
    }

希望这有帮助!