2016-06-09 75 views
3

这个问题听起来很容易,但它让我发疯。 我在IB中创建了一个名为iBag的白色视图,并且它的大小取决于屏幕大小。如何设置UIView大小,以编程方式无约束地匹配parrent

enter image description here

现在我想以编程方式创建一个新的UIView,并通过此代码相同的大小和位置的子视图添加到IBAG

let newView = UIView() 
newView.frame = (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height)) 
newView.backgroundColor = UIColor.redColor() 
iBag.addSubview(newView) 

enter image description here

我也试过界限但没没有帮助。 我可以使用约束来解决这个问题,但我想知道什么是错的。

+2

你在哪里实例化ViewWillAppear中的新视图? –

+0

@SandeepBhandari In viewDidLoad – Seifolahi

+0

你可以在ViewDidAppear中试试吗? –

回答

12

所以很多答案,没人解释什么是错。

我会尽力的。 您在之前通过超视框设置您的newView的框架,自动布局引擎开始工作以确定视图位置。所以,当你使用newViewsuperview帧时,你会使用初始帧,这在大多数情况下都不正确。你有3种方法可以做正确的事情:为你的newView使用自动布局(约束),或者在viewDidLayoutSubviews方法中设置newView的帧(它在自动布局引擎结束它的时候调用,所以帧变成实际的;注意这个方法可以被称为多重或者设置自动调整掩码为newView

0

可能是这将工作: -

subview.bounds.size = parentView.bounds.size 

subview.center = parentView.center 

但在你的情况下,widthheight在里面的CGRect应

width: parentView.bounds.size.width 
height: parentView.bounds.size.height 

,然后添加到它的父为子视图。

+0

不,结果相同。 – Seifolahi

8

试试这个:

斯威夫特1和2:

newView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] 

斯威夫特3+:

newView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 

如果它不工作,也这样:

iBag.autoresizesSubviews = true

+0

第一行works.tnx – Seifolahi

1

可能,这将帮助你

override func viewDidLayoutSubviews() { 

    let newView = UIView() 
    newView.frame = iBag.bounds 
    newView.addConstraints(iBag.constraints) 
    newView.backgroundColor = UIColor.redColor() 
    iBag.addSubview(newView) 

} 

希望这会帮助你。

+0

我现在编辑我的答案检查。 –

+0

对不起,但仍然没有结果 – Seifolahi

+0

您是否在故事板或约束布局中使用自动调整大小? –

0

试试这个代码:

let newView = UIView() 
newView.frame = (frame: CGRect(x: iBag.frame.origin.x, y: iBag.frame.origin.y, width: iBag.frame.size.width, height: iBag.frame.size.height)) 
newView.backgroundColor = UIColor.redColor() 
iBag.addSubview(newView) 
4

试试这个

subview.frame = parentView.bounds

subview.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

parentView.addSubview(subview)

0

不使用约束可能是什么错误。如果您的故事板/笔尖设置为使用AutoLayout(默认情况下处于启用状态),则AutoLayout系统会覆盖设置帧/边框,并且您必须使用约束来使布局看起来正确。 (或设置自动调整大小面具转换为约束的旗帜。我不记得是什么标志被称为似乎并不能在此刻找到它。)

1

试试这个,

override func viewDidLayoutSubviews() { 


    newView.frame = (frame: CGRect(x: 0, y: 0, width: iBag.frame.width, height: iBag.frame.height)) 

} 

或者您可以使用viewWillAppearviewDidAppear来设置框架。

因为在viewDidload你的iBag的框架是相同的,这是在你的界面生成器(故事板)。现在它将根据您运行的约束和设备大小进行更改。所以,在viewDidload你的新视图变旧帧不改帧。所以,最好使用viewDidLayoutSubviewsviewWilAppear

第二件事,无论是使用自动布局还是无处不在。在父视图中使用自动布局是不好的做法,而不是在子视图中使用。

+0

这不是一个好的解决方案,因为viewDidLayoutSubviews被多次调用。所以会创建许多“新视图”。 –

+1

对呀@ jn-se编辑我的答案!现在,我觉得很好 – Lion

相关问题