1

我认为我遇到了一个问题,因为我缺乏对 iOS 平台的了解。

我有一个视图控制器User Profile。主视图具有下一个结构:ScrollView其中包含一个子视图,其中包含UIView7 个UIViews带有UILabelsUItextViewsUIImageViews等的视图。每个子视图都显示有关用户的特定信息。问题 - 此视图的数据是从服务器获取的,并且可能不同。例如,我有一个子视图 Education,它包含下一个信息:机构名称、学位、学习年限等。但一个用户可以拥有多个教育。所以这个视图的大小可以是动态的。但我不能简单地改变视图大小view.frame = CGRectMake因为在它下面我有一个视图工作经验等等。或者例如专业技能视图:它可以是一项技能,也可以是一个用户的一百个技能 - 所以我需要更改这个视图的大小,但在它下面我有另一个视图,所以我需要移动它等等。

那么问题是处理这种情况的正确方法是什么?我明白我不能仅仅改变视图框架view.frame= CGRectMake()- 因为它工作量太大而且我认为这是一种愚蠢的方法。我知道对于这个非常常见的问题必须有一些更直接的方法,可能是autolayout或者别的什么?无论如何,我希望对如何使用动态内容制作视图提供一些帮助和建议。

4

2 回答 2

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;

就是这样。

希望这可以帮助!

于 2013-10-25T17:24:29.767 回答
0

正如您所说,手动更新框架需要大量工作,并且是旧的做事方式。正如您所说的,新的更好的方法是使用自动布局。描述如何使用自动布局来定位您的视图需要更多关于您希望它的外观的具体信息,但是网络上有一些很棒的教程!这是众多之一:

iOS 7 中的 Ray Wenderlich 自动布局第 1 部分

于 2013-10-25T17:44:27.800 回答