添加子视图后,UIViews会恢复到之前的位置

时间:2013-12-19 00:09:00

标签: ios objective-c uiview uiviewcontroller

面对一个非常奇怪的问题,试图动态地将左侧导航面板添加到View Controller,(应该能够支持应用程序中的任何视图控制器,模糊地类似于Facebook导航)我的想法似乎相当简单,但我'我真的没有看到它在哪里崩溃。我所做的是使用以下方法在UIViewController上创建了一个类别,我认为这会将所有子视图移动到右侧,然后添加新视图。

-(void)addLeftView:(UIView *)newView
{
   newView.frame=CGRectMake(0, 0, newView.frame.size.width, self.view.frame.size.height);

   for(UIView *view in [self.view subviews])
   {
     view.frame=CGRectMake(view.frame.origin.x + newView.frame.size.width, view.frame.origin.y, view.frame.size.width, view.frame.size.height);
   }

   [self.view addSubview:newView];
}

但实际发生的是视图已添加,但子视图不会向右移动。但是,如果您对addSubview进行评论,则所有内容实际上都会按预期完全向右移动。

为了使事情变得更加奇怪,如果你将视图移动包裹在[UIView animateWithDuration:completionHandler:]中,其中完成处理程序添加了子视图,动画实际发生 - 所有视图都向右移动,但是当子视图被添加时,他们跳回到他们的起始位置。

我认为这是一个古怪的auto-layout问题,所以只是为了看看发生了什么,我清除了该视图控制器的所有约束,并得到了相同的结果。

1 个答案:

答案 0 :(得分:0)

在类似但不相关的线程中找到答案。 Can I disable autolayout for a specific subview at runtime?

基本上它是自动布局还原我的定位,所以通过在问题的UIViews上设置此用户变量来解决我的问题。

您可以在xib / storyboard中所需的UIView的用户定义运行时属性中将 translatesAutoresizingMaskIntoConstraints 类型布尔值设置为“是”。