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

时间:2016-07-26 18:12:56

标签: ios objective-c iphone uiview

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

-(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环绕其子视图并根据其子视图更改其框架?因为它目前总是使用固定帧而不管其子视图。

2 个答案:

答案 0 :(得分:0)

我会仔细检查您的约束,以确保它们对视图的顶部,底部,左侧和右侧进行约束,然后按照布局here进行大小调整。

答案 1 :(得分:0)

我强烈反对改变.frame的任何内容。大多数情况下,修改约束是最佳选择。

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

请注意使用以下命名:

  • view =您尝试调整大小的视图。
  • subviews =您尝试调整大小的特定视图中包含的子视图

第1步:

您的观点应该定位,但不是"尺寸"。我的意思是它不应该在视图和它的超级视图之间有任何约束,例如" Equal width"或" Top&底&#34 ;.你只需要将它放在X&是明智的。例如,顶部约束&左左约束,或者可能是中心X&是的。我不知道,这取决于你想要实现的目标。

仅添加这些约束将显示错误,表示"您的视图没有足够的csontraints,无法计算宽度/高度"。那是因为我们尚未进入第2步。

第2步:

我们正在做的是定义高度和高度。具有其子视图约束的视图宽度。要么你可以对它们进行硬编码(我通常建议反对),要么将这些子视图限制在两侧。经典的4面约束建筑,从左到左,从上到下,从下到下,从右到右连接。有或没有保证金,但这无关紧要。

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

子视图中的任何内容都会强制视图相应地调整自身大小。

如果其内容是动态生成的,但您希望不具有大小为0,0的视图,则可以自己添加高度约束,对值进行硬编码,然后选中“"在构建时删除"。约束将有助于.xib在视觉上正确或更接近现实,同时不会扰乱流程。

所以,总结一下:

第1步:定位视图,不要给它一个大小,忽略错误。

第2步:为子视图提供约束,内容将强制视图 从内部成长/缩小

第3步:获利。