iPhone - UIViews的布局管理器?

时间:2010-02-04 21:41:21

标签: iphone layout

我不确定“布局管理器”是否是正确的术语,但我正在寻找一种让UIViews流入其父视图的方法,就像HTML页面中的左浮动div一样。有没有一种简单的方法可以通过iPhone api或外部的东西来做到这一点?

4 个答案:

答案 0 :(得分:2)

经过一些搜索,我发现了这一点:http://code.google.com/p/layoutmanagers/ Last Development是在2009年12月,但乍一看,它似乎仍然适用于当前版本的iOS。

答案 1 :(得分:1)

没有像这样的东西真正构建到sdk中,但是不应该太难以获得你所追求的行为。只需致电

NSArray *subs = [parentView subviews];

获取所有已存在的子视图。像这样循环遍历

CGRect leftMostViewsFrame = nil;
for(UIView *cur in subs){
  CGRect where = cur.frame;
  //find the left most frame for a given X coord
}

并将新视图放在旁边

newView.frame = CGRectMake(leftMostViewsFrame.origin.x + leftMostViewsFrame.size.width, 
[parentView addSubview:newView];

......

你可以写得比这更干净,并且你需要做更多的检查和推理来获得浮动的所有行为,但这是我将采取的基本方法。我不知道是否有你可以使用的第三方库。

答案 2 :(得分:1)

这是一个完整的解决方案(基于the answer by Joe Cannatti):

  1. 在您的情节提要中添加UIView ,并以某个名称将其链接到您的ViewController,例如container。 (如果您的容器视图是整个视图,则可以在self.view中使用container而不是ViewController.m。)

  2. 创建并添加UI元素container。例如,您可以使用以下内容创建UILabelcontainer并添加

    UILabel* label = [[UILabel alloc] init];
    label.text = @"Foo";
    [label sizeToFit];
    [container addSubview:label];
    
  3. 最初,每当您在container中添加/删除/修改UI元素时,您都可以将它们重新排列为流程布局,其中包含:

    float x = 0, y = 0, width = container.frame.size.width, rowHeight = 0;
    for (UIView* view in container.subviews) {
      // only re-arrange user-added views (change condition as required)
      if (![view isKindOfClass:UILabel.class]) continue;
      float w = view.frame.size.width, h = view.frame.size.height;
      bool fitsInRow = x + w <= width;
      if (!fitsInRow) {x = 0; y += rowHeight; rowHeight = h;}
      view.frame = CGRectMake(x, y, w, h);
      x += w;
      rowHeight = MAX(rowHeight, h);
    }
    // if container is a UIScrollView, change content size
    container.contentSize = CGSizeMake(width, y + rowHeight);
    

答案 3 :(得分:0)

我不知道要执行此操作的API。 Mac上的核心动画有一些布局,但我认为它不包含在iPhone中。

你所描述的并不是非常困难。开源吗? : - )