在iOS中创build“stream布局”types布局的最佳/最简单的方法是什么?
Q1。 我有三个控件:单行UILabel
, UIButton
和UILabel
。 我想以编程的方式将它们一个接一个排成一行,没有任何间隙(类似于Java / Android的“Flowlayout”布局),因为每个控件上的文本长度会因用户操作而改变。 以编程方式实现“Flowlayout”布局的最佳/最简单的方法是什么?
Q2。 与上面相关,我希望每个控件在文本由于用户操作而发生更改时自动resize,以便全文保持可见。
提前致谢。
//编辑11/12/2011
以下是我计划如何实现viewArray中包含的控件的水平“stream布局”:
-(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]; } }
只是挣扎着这个 – 这是我的解决scheme:
iOS中没有“stream布局”概念,所以您必须手动计算每个控件的宽度,并将它们绝对放置在父容器中。 UILabels与button有点不同,因为确定内容大小的唯一方法是使用[NSString sizeWithFont:...]
方法。 看这里的例子。
在你的情况下,你将不得不听取用户交互完成,无论哪个元素正在改变,并使用[UIView setNeedsDisplay]
(http://developer.apple.com/library/ios/#documentation/UIKit/Reference /UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/setNeedsDisplay)方法来重绘视图和子视图。
恕我直言,这比它需要更加困难。
更新这个答案: IOS6已经向我们介绍了Flow布局,
在iOS 6中使用集合视图创builddynamic和令人难以置信的界面非常简单。了解如何开始使用集合视图,并了解如何使用内置的UICollectionViewFlowLayout类,以网格状布局轻松组织数据
查看名为“介绍馆藏视图”的WWdc 2012video
尝试CocoaUI框架: https : //github.com/ideawu/cocoaui – 使用Objective-C + HTML + CSS和Web风格的stream布局构buildiOS应用程序UI。