2014-10-26 35 views
15

在Swift中,如何获得在运行时使用自动布局约束条件创建的UIView的宽度(或高度)?在运行时访问UIView宽度

我试过view1.frame.size.widthview1.frame.width,但都返回0

我一直在下面通过MakeAppPie自动布局教程,并添加view1.layer.cornerRadius = view1.bounds.width/2如下,但是这并没有影响,所以我做了保安view1.bounds.width,得到了0

class ViewController: UIViewController { 

func makeLayout() { 

    //Make a view 
    let view1 = UIView() 
    view1.setTranslatesAutoresizingMaskIntoConstraints(false) 
    view1.backgroundColor = UIColor.redColor() 


    //Make a second view 
    let view2 = UIView() 
    view2.setTranslatesAutoresizingMaskIntoConstraints(false) 
    view2.backgroundColor = UIColor(red: 0.75, green: 0.75, blue: 0.1, alpha: 1.0) 

    //Add the views 
    view.addSubview(view1) 
    view.addSubview(view2) 


    //--------------- constraints 

    //make dictionary for views 
    let viewsDictionary = ["view1":view1,"view2":view2] 

    //sizing constraints 
    //view1 
    let view1_constraint_H:Array = NSLayoutConstraint.constraintsWithVisualFormat("H:[view1(>=50)]", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary) 
    let view1_constraint_V:Array = NSLayoutConstraint.constraintsWithVisualFormat("V:[view1(50)]", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary) 

    view1.addConstraints(view1_constraint_H) 
    view1.addConstraints(view1_constraint_V) 

    //view2 
    let view2_constraint_H:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("H:[view2(50)]", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary) 
    let view2_constraint_V:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("V:[view2(>=40)]", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary) 

    view2.addConstraints(view2_constraint_H) 
    view2.addConstraints(view2_constraint_V) 

    //position constraints 

    //views 
    let view_constraint_H:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("H:|-100-[view2]", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary) 
    let view_constraint_V:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("V:|-136-[view1]-100-[view2]-100-|", options: NSLayoutFormatOptions.AlignAllTrailing, metrics: nil, views: viewsDictionary) 

    view.addConstraints(view_constraint_H) 
    view.addConstraints(view_constraint_V) 

    view1.layer.cornerRadius = view1.bounds.width/2 

    } 

override func viewDidLoad() { 
    super.viewDidLoad() 

    func supportedInterfaceOrientations() -> Int { 
     return Int(UIInterfaceOrientationMask.All.rawValue) 

    } 

    // Do any additional setup after loading the view, typically from a nib. 

    view.backgroundColor = UIColor(red: 0.9, green: 0.9, blue: 1, alpha: 1.0) 
    makeLayout() 

    } 
} 
+1

view1.frame.width应该可以工作。你能发布更多的代码吗? – 2014-10-26 21:52:52

+1

感谢您的回复史蒂夫 - 添加了上面的代码。 – gemello 2014-10-26 22:15:03

+0

您在那里获得0,因为此时自动布局机制尚未开始调整视图大小。 – JDS 2014-10-26 22:28:55

回答

45

添加这一点,你是很好去:

override func viewDidLayoutSubviews() { 
     println(self.view1.frame.size) 
    } 

你可以看看你的宽度或高度。

+0

完美 - 谢谢史蒂夫! – gemello 2014-10-27 20:43:52

+2

这也为我打印出0,0。 – kakubei 2015-07-10 08:37:32

+0

@kakubei我发现我的问题是当调用类初始化程序时,我忘了实际传递帧,因此在类初始化中返回0,0。 XCode也没有给出任何错误。 – 2015-09-01 16:46:57

3

,你只能使用此

self.view1.frame.size.width 
self.view1.frame.size.height 
5

一两件事有关这些字段:

self.view1.frame.size.width 
self.view1.frame.size.height 

是如果视图都被吸引到屏幕只有实际的用户设备的大小,否则他们是什么都你将它们设置在故事板中。因此,如果您在绘制视图之前尝试执行某种计算,则必须以另一种方式计算宽度或高度!

+0

和什么是方式?在Xcode 7及以下版本中,我没有任何问题。但是现在在Xcode 8中,我遇到了这个问题。我的UIImageView尺寸打印500,但我认为它只有50尺寸。 – jo3birdtalk 2016-09-25 08:55:30