代码之家  ›  专栏  ›  技术社区  ›  Nathan de Vries

使用大小约束布局UIView子视图

  •  5
  • Nathan de Vries  · 技术社区  · 15 年前

    ContainerView
      UIScrollView
        ModuleView
        ModuleView
        ModuleView
        ...
    

    我想要 ContainerView 铺设 ModuleViews 以某种任意的方式(列表、网格等)。为此,我将实施 -[ContainerView layoutSubviews] 模块视图 ,呼叫 -[ModuleView sizeToFit] 在每一个上,然后根据所需的布局将它们相对放置。

    我的问题是如何实施 -[ModuleView sizeThatFits:] -[ModuleView layoutSubviews] 尽量减少重复并允许 模块视图

    举个最简单的例子 ModuleView UIView 多行 UILabel

    @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 . 这是可行的,但是当视图更复杂时,很快就会变得一团糟。

    1 回复  |  直到 15 年前
        1
  •  1
  •   jchatard    11 年前

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

    因为我需要从层次结构的顶部调用-(void)sizeToFit,所以我需要一种方法来应用这个 尺寸

    然后递归地完成。

    我被困在如何以正确的顺序实现这一点上,所以我给自己和其他人写了一封信。希望这能有所帮助: http://jchatard.com/understanding-uiview-layout-mecanism