2010-02-04 72 views
6

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

+3

只是在想同样的事情。如果您真的不想使用InterfaceBuilder,但也不想处理手动定位所有事情的复杂性,那么像Java Swing中的LayoutManagers集合将会非常有用。 – ra9r 2010-05-12 16:41:39

+0

如果您只想显示内容,那么只有webkit视图。我一直在搞嵌入HTML的很好的布局信息屏幕的东西。 – morgancodes 2010-05-14 16:27:34

+0

这在iOS 5或更早版本中并不存在。关于iOS 6的信息,请咨询您的NDA保护的文档,这是我们不能公开讨论在这里。 – 2012-07-07 23:57:03

回答

0

我不知道一个API来做到这一点。 Mac上的核心动画有一些布局的东西,但我认为它不包含在iPhone中。

虽然你所描述的听起来并不难。开源吗? :-)

+1

是的!我一般是太马虎了/懒惰/自私的我的任何开放源代码的意图去任何地方。但是,也许这将是不同的:) – morgancodes 2010-02-04 21:56:55

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]; 

......

可以远不止于此干净写它,有一个你需要做更多的检查和推理来获得float的所有行为,但这是我将采取的基本方法。我不知道是否有可以使用或不使用的第三方库。

+1

感谢乔,我会继续前进,做到这一点。 – morgancodes 2010-02-04 22:23:18

+0

@morgancodes我写了一个完整的解决方案基于这样的回答:http://stackoverflow.com/a/11379438/974531 – 2012-07-08 08:56:32

2

经过一番搜索,我发现这个:http://code.google.com/p/layoutmanagers/ 上次开发是在2009年12月,但乍一看,它似乎仍然可以适用于当前版本的iOS。

+0

我创建的上述的在GitHub上叉:https://github.com/RefuX/LayoutManagers-Fork并添加了GridLayout。我在iPhone和iPad用户界面上使用过它。对于iOS 4和5.我喜欢它:) – RefuX 2012-01-27 19:51:38

1

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

  1. 添加UIView你的故事板,并在一些名字,例如,它链接到您的ViewControllercontainer。 (如果你的容器视图是全视图,您可以用self.view而不是containerViewController.m内。)

  2. 创建并添加UI元素container。例如,您可以创建并添加UILabelcontainer有:

    UILabel* label = [[UILabel alloc] init]; 
    label.text = @"Foo"; 
    [label sizeToFit]; 
    [container addSubview:label]; 
    
  3. 起初,每当你添加/删除/修改UI元素/从/内container,你可以他们重新安排到流布局有:

    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);