在iOS中创建“流布局”类型布局的最佳/最简单方法是什么?

时间:2011-10-24 05:51:31

标签: ios

Q1。我有三个控件:UILabelUIButtonUILabel在一行中。我想以编程方式一个接一个地排列它们,没有任何间隙(类似于Java / Android“Flowlayout”布局),因为每个控件上的文本长度将因用户操作而改变。以编程方式实现“Flowlayout”布局的最佳/最简单方法是什么?

Q2。与上述相关,我希望每个控件在文本因用户操作而发生更改时自动调整大小,因此全文仍然可见。

提前致谢。

//编辑于11/12/2011

以下是我计划如何实现viewArray中包含的控件的水平“流程布局”:

-(void) doHorizontalFlowLayout:(NSArray *) viewArray
{
        if(viewArray == nil || viewArray.count <=1
            return; //get out of here, no need to continue

        UIView *v0= (UIView *) [viewArray objectAtIndex:0]; // first view
        CGRect frame0 = v0.frame;

        CGFloat sumWidth= 0;
        for(int i=1; i < viewArray.count; i++)
        {
            UIView *thisView= (UIView*) [viewArray objectAtIndex:i];
            sumWidth = sumWidth+ v0.frame.size.width;
            CGRect nextFrame= CGRectMake(frame0.origin.x
                    +sumWidth, thisView.frame.origin.y,
                     thisView.frame.size.width, thisView.frame.size.height);
            thisView.frame= nextFrame;
            //the above works for 2 views only. For more than 2 views - reset v0 to point to the ith view
            v0 = (UIView*) [viewArray objectAtIndex:i];

        }
 }

3 个答案:

答案 0 :(得分:5)

正在努力解决这个问题 - 这是我的解决方案:

iOS中没有“流程布局”概念,因此您必须手动计算每个控件的宽度并将它们绝对放在父容器中。 UILabels与按钮略有不同,因为确定内容大小的唯一方法是使用[NSString sizeWithFont:...]方法。有关示例,请参阅here

在您的情况下,您必须在任何元素发生变化时收听用户互动完成时,并使用[UIView setNeedsDisplay](http://developer.apple.com/library/ios/#documentation) /UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/setNeedsDisplay)重绘视图和子视图的方法。

这比它需要的要困难得多,恕我直言。

答案 1 :(得分:4)

这个答案的更新: IOS6向我们介绍了Flow布局,

  

通过收集可以轻松创建动态且令人难以置信的界面   iOS 6中的视图。了解如何开始收集视图并查看   如何使用内置的网格布局轻松组织数据   UICollectionViewFlowLayout类

查看名为“介绍集合视图”的WWdc 2012视频

答案 2 :(得分:0)

尝试CocoaUI框架:https://github.com/ideawu/cocoaui - 使用Objective-C + HTML + CSS和Web风格的流程布局构建iOS应用UI。