我只需要找出有关iOS视图和布局的几个方面。我刚刚结束应用程序,我必须创建一个显示测试的控制器。除了一件事之外很容易。有两种类型的问题A和B.问题有4种答案,B问题不是。所以我必须在代码中生成我的所有布局取决于问题类型。我已经通过创建方法update
来完成它,我重建了我的观点。
- (void)update {
for (UIView *v in self.view.subviews) {
[v removeFromSuperview];
}
//label initialization with frame calculation
UILabel *questionLabel = [[UILabel alloc]initWithFrame:CGRectMake(PADDING, PADDING, size.width - 4 * PADDING, 0)];
[questionLabel sizeToFit];
[self.view addSubview:questionContainerView];
//If type A
if ([self.question.questionType isEqualToString:@"A"]) {
for (Answer *a in self.question.answers) {
UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(PADDING, offset, size.width - 2 * PADDING, 30 + PADDING)];
//customization
[self.view addSubview:button];
offset += button.frame.size.height + MARGIN_BOTTOM;
}
//if B type
} else {
UITextField *answerField = [[UITextField alloc] initWithFrame:CGRectMake(PADDING, PADDING, view.frame.size.width - 2*PADDING, view.frame.size.height - 2 * PADDING)];
[view addSubview:answerField];
offset += view.frame.size.height + MARGIN_BOTTOM;
}
UIView *lastView = [[self.view subviews]lastObject];
self.scrollView.contentSize = CGSizeMake(size.width, lastView.frame.origin.y + lastView.frame.size.height + 10);
}
毕竟我认为它不会那么复杂。请帮助找出我应该如何正确地做到这一点,因为我确信我的方法不是最佳的。也许创建自定义布局。我的意思是如何避免设置框架,只需添加正确位置的视图。
答案 0 :(得分:0)
这是非常模糊的,我假设你反对使用任何GUI工具?无论如何,不是在每次更新后创建每个视图,为什么不创建两个视图,然后根据问题隐藏或显示它们?
您只需使用bringSubviewToFront
或sendSubviewToBack
或简单地设置隐藏即可完成此操作。通过这种方式,您可以创建视图并简单地显示或隐藏它们,而不会破坏它们并重新创建所有内容,尽管这种简单的方法可以通过这种方式轻松完成。
我的建议?使用故事板或Xib创建这些子视图,然后只需隐藏或显示您选择的视图。这样,您可以轻松地布置视图而不需要任何代码。
现在,如果所有问题都经常发生变化,那么您可能希望使用UITableViewController,因为这是它的设计目标。您可以为不同的问题场景创建一些自定义UITableViewCell,然后根据问题类型重复使用它们。然后,您只需更新tableView的dataSource,所有新问题都会显示在您喜欢的位置。