如何根据其子视图调整UIViews框架

问题描述:

我一直在努力解决这个问题,整天都需要一些帮助。我想要做的是创建一个视图,其框架基于它的子视图进行调整。根据某些业务规则,我必须添加和删除子视图。下面是一些示例代码:如何根据其子视图调整UIViews框架

-(void)createLinkedAccountDetailsHeaderView { 
    CGRect frame = CGRectMake(0, 0, 600, 220); 
    CDPAccountDetailsView *accountDetailsView = [[CDPAccountDetailsView alloc ] initWithFrame:frame withViewModel:self.viewModel isInEditState:self.isInEditState]; 
    self.tableView.tableHeaderView = accountDetailsView; 
} 

- (instancetype)initWithFrame:(CGRect)frame withViewModel:(CDPDebitOrderDetailsReviewViewModel *)viewModel isInEditState:(BOOL) isInEditState { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.viewModel = viewModel; 
     self.isInEditState = isInEditState; 

     [self initialiseView]; 
     [self configureWithAccountsView]; 
    } 
    return self; 
} 

(void)initialiseView { 
    NSString *nibName = NSStringFromClass([self class]); 
    UINib *nib = [UINib nibWithNibName:nibName bundle:[SBResourcesBundle bundleWithName:[CDPResourceBundle bundleName]]]; 
    [nib instantiateWithOwner:self options:nil]; 
    [SBViewUtility addSubview:self.mainView withConstraintsToParentView:self]; 
    [self layoutIfNeeded]; 

    self.circleView.layer.cornerRadius = self.circleView.bounds.size.width /2; 

    //A lot of subview initialisation is done 

    [self layoutIfNeeded]; 
} 

我怎样才能获得的UIView基于其子视图环绕它的子视图,并改变其框架?因为它现在总是使用固定框架而不管其子视图。

+0

如果您的目标> ios 9堆栈视图是您的最佳选择。 –

+0

不幸的是,我必须针对ios 8 – user481610

+0

这可能有助于http://*.com/questions/19170053/resize-superview-after-subviews-change-dynamically-using-autolayout –

我会仔细检查一下您的约束条件,以确保它们约束您的视图的顶部,底部,左侧和右侧,然后调整大小以适合here

我强烈建议不要更改.frame的任何东西。大多数情况下,修改约束是要走的路。

如果我正确理解你的问题,你希望你的视图根据其内容增长/缩小。如果是这样,它应该是相当微不足道的。

注意有关命名我使用:

  • 视图=你要调整的观点。
  • 子视图=包含在特定视图中的子视图你想调整

第1步:

你认为应定位,而不是“大小”。我的意思是它不应该在视图和它的超级视图之间有任何约束,如“等宽”或“顶部&底部”。你只需要把它定位在明智的X &。例如,顶端约束条件为左左约束,或者可能是中心X & Y.我不知道,这取决于您要实现的目标。

仅添加这些约束将显示一个错误,指出“您的视图没有足够的csontraints,无法计算宽度/高度”。那是因为我们还没有进入第二步。

第2步:

我们正在做的是定义其子视图的约束视线的高度&宽度。要么你可以对它们进行硬编码(我通常建议不要这样做),或者将这些子视图限制在边上。经典的四边约束建筑,从左到左,从上到下,从下到上,从右到左。有或没有保证金,但那是不相关的。

你现在应该拥有一个有效的视图+子视图约束构建,肯定的(如果你使用.xibs/.storyboard)黄色警告,如果你解决了,最终会缩小你的视图到一个大小为0/0。这是因为你当前的.xib没有任何内容。如果您只是为了测试而添加一个标签,则会看到另一个黄色的重新调整大小警告,如果解决该问题,视图将根据该标签调整其自身大小。

子视图内的任何东西都会强制视图相应地调整其自身。

如果它的内容是动态生成的,但是您不希望有大小为0,0的视图,那么您可以自己添加一个Height约束,对一个值进行硬编码,并选中“在构建时删除”框。约束条件将有助于.xib在视觉上正确或接近现实,同时不会干扰流动。

因此,要总结:

step 1:把视图位置,不给它一个大小,忽略错误。

第2步:给约束子视图,内容将迫使以 成长/从里面

第3步收缩:利润。