我不确定“布局管理器”是否是正确的术语,但我正在寻找一种让UIViews流入其父视图的方法,就像HTML页面中的左浮动div一样。有没有一种简单的方法可以通过iPhone api或外部的东西来做到这一点?
答案 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):
在您的情节提要中添加UIView
,并以某个名称将其链接到您的ViewController
,例如container
。 (如果您的容器视图是整个视图,则可以在self.view
中使用container
而不是ViewController.m
。)
创建并添加UI元素至container
。例如,您可以使用以下内容创建UILabel
到container
并添加
UILabel* label = [[UILabel alloc] init];
label.text = @"Foo";
[label sizeToFit];
[container addSubview:label];
最初,每当您在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中。
你所描述的并不是非常困难。开源吗? : - )