动态视图控制器

时间:2015-04-20 19:31:35

标签: ios objective-c layout dynamic

我只需要找出有关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);
}

毕竟我认为它不会那么复杂。请帮助找出我应该如何正确地做到这一点,因为我确信我的方法不是最佳的。也许创建自定义布局。我的意思是如何避免设置框架,只需添加正确位置的视图。

1 个答案:

答案 0 :(得分:0)

这是非常模糊的,我假设你反对使用任何GUI工具?无论如何,不​​是在每次更新后创建每个视图,为什么不创建两个视图,然后根据问题隐藏或显示它们?

您只需使用bringSubviewToFrontsendSubviewToBack或简单地设置隐藏即可完成此操作。通过这种方式,您可以创建视图并简单地显示或隐藏它们,而不会破坏它们并重新创建所有内容,尽管这种简单的方法可以通过这种方式轻松完成。

我的建议?使用故事板或Xib创建这些子视图,然后只需隐藏或显示您选择的视图。这样,您可以轻松地布置视图而不需要任何代码。

现在,如果所有问题都经常发生变化,那么您可能希望使用UITableViewController,因为这是它的设计目标。您可以为不同的问题场景创建一些自定义UITableViewCell,然后根据问题类型重复使用它们。然后,您只需更新tableView的dataSource,所有新问题都会显示在您喜欢的位置。