我遇到问题是因为我缺乏对iOS平台的了解。我有一个视图控制器User Profile。主视图具有下一个结构:ScrollView包含一个子视图,并且此UIView具有7个UIViews以及UILabelsUItextViewsUIImageViews等。每个视图均显示有关用户的特定信息。问题-该视图的数据是从服务器获取的,并且可能有所不同。例如,我有一个子视图“教育”,其中包含下一个信息:机构名称,学位,学习年限等。但是一个用户可以接受多次教育。因此,此视图的大小可以是动态的。但是我不能简单地用view.frame = CGRectMake更改视图大小,因为在它下面我具有视图工作经验等。或者例如专业技能视图:对于一个用户来说,它可以是一项技能,也可以是一百项技能-所以我需要更改此视图的大小,但是在它下面有另一个视图,因此我需要移动它,依此类推。那么问题是解决这种情况的正确方法是什么?我知道我不能只使用view.frame= CGRectMake()更改视图框架-因为它工作量太大,而且我认为这是一种愚蠢的方法。我知道对于这个非常普遍的问题,必须有一些更直接的方法,可能是autolayout还是其他?无论如何,我希望对如何制作具有动态内容的视图有所帮助和建议。

最佳答案

我真的不知道你为什么说“我不能只是改变镜框”。当然可以!

在这种情况下,我始终采用的方法(视图的高度可变)是声明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;

就是这样。

希望这可以帮助!

关于ios - 如何在iOS中创建具有动态内容的 View ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19595590/

10-17 03:15