我一整天都在努力解决这个问题,真的需要一些帮助。我想要做的是创建一个视图,其框架根据子视图进行调整。根据某些业务规则,我必须添加和删除子视图。以下是一些示例代码:
-(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 :(得分:0)
我会仔细检查您的约束,以确保它们对视图的顶部,底部,左侧和右侧进行约束,然后按照布局here进行大小调整。
答案 1 :(得分:0)
我强烈反对改变.frame
的任何内容。大多数情况下,修改约束是最佳选择。
如果我正确理解您的问题,您希望您的视图根据其内容增长/缩小。如果就是这样,它应该是非常微不足道的。
请注意使用以下命名:
第1步:
您的观点应该定位,但不是"尺寸"。我的意思是它不应该在视图和它的超级视图之间有任何约束,例如" Equal width"或" Top&底&#34 ;.你只需要将它放在X&是明智的。例如,顶部约束&左左约束,或者可能是中心X&是的。我不知道,这取决于你想要实现的目标。
仅添加这些约束将显示错误,表示"您的视图没有足够的csontraints,无法计算宽度/高度"。那是因为我们尚未进入第2步。
第2步:
我们正在做的是定义高度和高度。具有其子视图约束的视图宽度。要么你可以对它们进行硬编码(我通常建议反对),要么将这些子视图限制在两侧。经典的4面约束建筑,从左到左,从上到下,从下到下,从右到右连接。有或没有保证金,但这无关紧要。
你现在应该拥有的是一个有效的视图+子视图约束构建,最肯定的是(如果你正在使用.xibs / .storyboard)一个黄色警告,如果你解决了,最终会缩小你的观点到大小为0/0。这是因为您当前的.xib中没有任何内容。如果您只是为了测试而在其中添加标签,您会看到另一个黄色警告,如果您解决它,您的视图将根据该标签重新调整大小。
子视图中的任何内容都会强制视图相应地调整自身大小。
如果其内容是动态生成的,但您希望不具有大小为0,0的视图,则可以自己添加高度约束,对值进行硬编码,然后选中“"在构建时删除"。约束将有助于.xib在视觉上正确或更接近现实,同时不会扰乱流程。
所以,总结一下:
第1步:定位视图,不要给它一个大小,忽略错误。
第2步:为子视图提供约束,内容将强制视图 从内部成长/缩小
第3步:获利。