【问题标题】:Laying Out UIView Subviews with Size Constraints使用大小约束布局 UIView 子视图
【发布时间】:2010-03-04 08:45:36
【问题描述】:

给定一个看起来像这样的视图层次结构:

ContainerView
  UIScrollView
    ModuleView
    ModuleView
    ModuleView
    ...

我希望ContainerView 以任意方式(列表、网格等)放置ModuleViews。为此,我将实现-[ContainerView layoutSubviews],它会遍历ModuleViews,在每一个上调用-[ModuleView sizeToFit],然后根据所需的布局将它们相对定位。

我的问题是与实现-[ModuleView sizeThatFits:]-[ModuleView layoutSubviews] 的最佳方式有关,以尽量减少重复并允许ModuleViews 在正确保持布局的同时更改大小。

以最简单的情况为例,ModuleView 是带有多行 UILabel 子视图的 UIView,并且两边都有填充。它可能看起来像这样:

@implementation ModuleView

- (CGSize)sizeThatFits:(CGSize)size {
  CGFloat padding = 10.0f;
  CGSize labelMaxSize = CGSizeMake(superview.size.width - (2 * padding), CGFLOAT_MAX);
  CGSize labelSize = [self.label.text sizeWithFont:self.label.font constrainedToSize:labelMaxSize lineBreakMode:self.label.lineBreakMode];
  return CGSizeMake(superview.width, labelSize.height + (2 * padding));
}

- (void)layoutSubviews {
  [super layoutSubviews];

  CGFloat padding = 10.0f;
  CGSize labelMaxSize = CGSizeMake(self.size.width - (2 * padding), CGFLOAT_MAX);
  CGSize labelSize = [self.label.text sizeWithFont:self.label.font constrainedToSize:labelMaxSize lineBreakMode:self.label.lineBreakMode];
  self.label.frame = CGRectMake(padding, padding, labelSize.width, labelSize.height);

  CGRect frame = self.frame;
  frame.size.height = self.label.frame.size.height + (2 * padding);
  self.frame = frame;
}

@end

如您所见,子视图的大小在sizeThatFits: 中计算一次,在layoutSubviews 中再次计算。这可行,但当视图更复杂时,很快就会变得一团糟。

有没有办法简化这个?我找不到其他人如何解决这个问题的好例子。

【问题讨论】:

  • 嗨,Nathan,有针对这种情况的新解决方案吗?

标签: iphone cocoa-touch uikit


【解决方案1】:

我遇到了同样的问题,视图层次结构非常复杂。我最终创建了一个 UIView 子类,它只充当包含我的有用视图的包装器。

因为我需要从层次结构的顶部调用 -(void)sizeToFit,所以我需要一种从下到上应用此 sizing 的方法。我通过调用 -(void)sizeToFit;在父视图的子视图上 -(CGSize)sizeThatFits:(CGSize)size;方法。

然后这是递归完成的。

我非常纠结于如何以正确的顺序实现这一目标,所以我给自己写了一张便条,希望给其他人。希望这可以帮助:http://jchatard.com/understanding-uiview-layout-mecanism

【讨论】:

    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多