【问题标题】:How adjust a UIViews frame based on its subviews如何根据子视图调整 UIViews 框架
【发布时间】:2016-11-30 12:39:42
【问题描述】:

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

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

【问题讨论】:

  • 如果您的目标是 >ios 9 堆栈视图是您的最佳选择。
  • 不幸的是我必须针对 ios 8
  • 你能添加一些你的.xib的截图,或者你想要实现的小图吗?现在我正在重新阅读它,我不确定我的回答是否与您的问题有关。

标签: ios objective-c iphone uiview


【解决方案1】:

我会仔细检查您的约束,以确保它们限制在您的视图的顶部、底部、左侧和右侧,然后调整大小以适应 here 的布局。

【讨论】:

    【解决方案2】:

    我强烈建议不要更改 .frame 的任何内容。大多数时候,修改约束是可行的方法。

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

    关于我使用的命名的注意事项:

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

    第一步:

    您的视图应该被定位,而不是“调整大小”。我的意思是它不应该在视图和它的父视图之间有任何约束,比如“等宽”或“顶部和底部”。您只需将其定位为 X 和 Y 明智。例如,顶上约束和左左约束,或者可能是中心 X 和 Y。我不知道,这取决于您要实现的目标。

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

    第 2 步:

    我们正在做的是使用其子视图的约束来定义视图的高度和宽度。您可以对它们进行硬编码(我通常不建议这样做),或者将这些子视图限制在侧面。经典的 4 面约束构建,从左到左、从上到上、从下到下、从右到右链接。有无边距,但这无关紧要。

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

    子视图中的几乎所有内容都会强制视图相应地调整自身大小。

    如果它的内容是动态生成的,但您不想看到大小为 0,0 的视图,您可以自己添加一个高度约束,硬编码一个值,然后选中“在构建时删除”框。约束将帮助 .xib 在视觉上正确或更接近现实,同时不干扰流程。

    所以,总结一下:

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

    第 2 步:给子视图施加约束,内容将强制视图 从内部增长/收缩

    第 3 步:盈利。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多