为什么UIViewController几乎总是需要layoutSubViews?

时间:2014-01-08 12:13:09

标签: ios uiview uiviewcontroller layoutsubviews

在iOS7之前,无论我为UIView的框架定义了什么CGRect,它都在工作。

例如:

imageView.frame=CGRectMake(20,20,80,80);

完全在屏幕左上方留下20 x 20的边距。

有趣的是,如果我添加另一个UIView:

nextView.frame=CGRectMake(imageView.frame.origin.x+imageView.frame.size.width+10,20,100,100);

nextView出现在imageView附近,所以它以某种方式接受第二个视图的X参数,但它也不接受该视图的Y坐标。

现在,我必须使用viewWillLayoutSubviews来安排所有这些坐标。否则,例如,imageView的框架会自动变为0,0,80,80。 (它快照左上角)

我没有使用任何笔尖,我甚至尝试使用自定义UIViewController方法创建initWithFrame,以便在CGRectloadView之前设置viewDidLoad,但它没关系。

是否有某些内容会自动覆盖视图中的x,y?像自动布局系统等?我不想使用viewWillLayoutSubviews方法重新排列所有这些坐标。

这里发生了什么?

更新1

- (id)initWithFrame:(CGRect) frame
{
    self = [super init];
    if (self) {

        self.frame=frame; //frame is custom variable to hold it until loadViews method

    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
}
-(void)loadView{
    UIView *view=[[UIView alloc]initWithFrame:_frame];

    view.backgroundColor=[UIColor blackColor];
    self.imageView=[[UIImageView alloc]initWithFrame:CGRectMake(20, 20, 80,80)];
    self.imageView.backgroundColor=[UIColor redColor];

    [view addSubview:_imageView];

    self.textView=[[UITextView alloc]initWithFrame:CGRectMake(self.imageView.frame.origin.x+self.imageView.frame.size.width+10, self.imageView.frame.origin.y, view.frame.size.width-20-(self.imageView.frame.origin.x+self.imageView.frame.size.width+10), view.frame.size.height-self.imageView.frame.origin.y-20)];
    [view addSubview:_textView];

    self.view=view;
}

我在initWithFrame和viewDidLoad中尝试过类似的代码。结果是一样的。

更新2

我在问题中错误地写了“layoutSubviews”而不是“viewWillLayoutSubviews”,所以我修复了它:我没有创建自定义UIView而是UIViewController,所以它必须是问题中的“viewWillLayoutSubviews”。

2 个答案:

答案 0 :(得分:0)

我的猜测是你正在将状态栏反转为左上角,但在iOS7中状态是透明的,顶点是屏幕的实际左上角。

您可以更改坐标或将其添加到视图控制器:

 if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
    {
        [self setEdgesForExtendedLayout:UIRectEdgeNone];
    }

这会将您的左上角重置为状态栏的底部。

无论如何,我相信将您的布局代码放在这些方法中:

- (void)viewWillLayoutSubviews 
- (void)viewDidLayoutSubviews

答案 1 :(得分:0)

每当添加子视图时,都会滚动UIScrollView,为View设置Frame,layoutSubViews?被称为,