由于我缺乏对iOS平台的了解,我遇到了一个问题。
我有一个视图控制器User Profile
。主视图具有下一个结构:ScrollView
包含一个子视图,此UIView
有7 UIViews
个UILabels
,UItextViews
,UIImageViews
等每个人都会显示有关用户的具体信息。问题 - 此视图的数据是从服务器获取的,它可能不同。例如,我有一个子视图教育,它包含下一个信息:学院的名称,学位,学习年限等。但是一个用户可以有几个教育。所以这个视图的大小可以是动态的。但是我不能简单地用view.frame = CGRectMake
来改变视图大小,因为在它下面我有一个视图工作经验等等或者例如专业技能视图:它可以是一种技能,它可以是一个技能,一个用户 - 所以我需要改变这个视图的大小,但在它下面我有另一个视图,所以我需要移动它等等。
那么问题是处理这种情况的正确方法是什么?我明白我不能只用view.frame= CGRectMake()
改变视图帧 - 因为它太多了,我认为这是一种愚蠢的方法。我知道这个非常常见的问题必须有一些更简单的方法,可能是autolayout
或其他什么?无论如何,我希望得到一些帮助和建议,如何使用动态内容制作视图。
答案 0 :(得分:3)
我真的不知道你为什么说“我不能只改变视帧”。当然可以!
我总是采用这种方案(视图的高度可变)的方法是声明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;
就是这样。
希望这有帮助!
答案 1 :(得分:0)
正如您所说,手动更新框架是很多工作,并且是旧的做事方式。正如您所说,新的更好的方法是使用自动布局。描述如何使用自动布局来定位视图需要更具体的信息来了解您的外观,但网上有一些很棒的教程!这是众多的一个: