如何在 iOS 中创建具有动态内容的视图?
Posted
技术标签:
【中文标题】如何在 iOS 中创建具有动态内容的视图?【英文标题】:How can I create views with dynamic content in iOS? 【发布时间】:2013-10-25 17:02:16 【问题描述】:我认为我遇到了一个问题,因为我缺乏对 ios 平台的了解。
我有一个视图控制器User Profile
。主视图具有下一个结构:ScrollView
包含一个子视图,此UIView
有 7 个UIViews
和UILabels
、UItextViews
、UIImageViews
等。每个都显示有关用户的特定信息。问题 - 此视图的数据是从服务器获取的,并且可能不同。例如,我有一个子视图 Education,它包含下一个信息:机构名称、学位、学习年限等。但一个用户可以拥有多个教育。所以这个视图的大小可以是动态的。但是我不能简单地用view.frame = CGRectMake
改变视图大小,因为在它下面我有一个视图工作经验等等。或者例如专业技能视图:它可以是一项技能,也可以是一个用户的一百个技能 - 所以我需要改变这个视图的大小,但在它下面我有另一个视图,所以我需要移动它等等。
那么问题是处理这种情况的正确方法是什么?我明白我不能只用view.frame= CGRectMake()
更改视图框架 - 因为它工作量太大而且我认为这是一种愚蠢的方法。我知道对于这个非常常见的问题必须有一些更直接的方法,可能是autolayout
或其他?无论如何,我希望对如何使用动态内容制作视图提供一些帮助和建议。
【问题讨论】:
【参考方案1】:我真的不知道你为什么说“我不能只改变视图框架”。当然可以!
对于这种情况(您的视图的高度是可变的)我总是采用的方法是声明一个yOffset
属性,并基于此我将我的内容放在正确的y
位置。
@property (nonatomic, assign) int yOffset;
然后在 init
方法中,我将此属性初始化为 0 或某个预定义的初始边距。
_yOffset = TOP_MARGIN;
然后考虑以下场景:具有n
技能数量的用户配置文件。这就是您使用yOffset
属性的方式。
for (int i=0; i<n; ++i)
// place the skillView at the right 'y' position
SkillView *skillView = [[SkillView alloc] initWithFrame:CGRectMake(0,self.yOffset,300,50)];
// configure the skillView here
[self.view addSubview:skillView];
// Don't forget it has to be "+=" because you have to keep track of the height!!!
self.yOffset += skillView.frame.size.height + MARGIN_BETWEEN_SKILLS;
然后想象用户个人资料有c
个教育条目;同样的事情:
for (int i=0; i<c; ++i)
// place the educationView at the right 'y' position
EducationView *educationView = [[EducationView alloc] initWithFrame:CGRectMake(0,self.yOffset,300,50)];
// configure the educationView here
[self.view educationView];
// Don't forget it has to be "+=" because you have to keep track of the height!!!
self.yOffset += educationView.frame.size.height + MARGIN_BETWEEN_EDUCATIONS;
最后,当所有子视图都添加完毕后,您必须更改包含视图的框架。 (因为当你创建它时,你无法预先知道它会有多高)
CGRect viewFrame = self.view.frame;
viewFrame.size.height = self.yOffset + BOTTOM_MARGIN;
self.view.frame = viewFrame;
就是这样。
希望这会有所帮助!
【讨论】:
【参考方案2】:正如您所说,手动更新框架需要大量工作,并且是旧的做事方式。正如您所说的,新的更好的方法是使用自动布局。描述如何使用自动布局来定位您的视图需要更多关于您希望它的外观的具体信息,但是网络上有一些很棒的教程!这是众多之一:
Ray Wenderlich autolayout in iOS 7 part 1
【讨论】:
以上是关于如何在 iOS 中创建具有动态内容的视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有任何视图或任何其他表类型的情况下在 oracle 中创建具有动态列名和动态数据类型的动态表
如何在 Swift IOS 中创建具有多个堆栈视图的可滚动堆栈视图