切换视图控制器,iOS应用程序

时间:2012-11-28 16:34:43

标签: iphone objective-c

我已经在天气应用程序上工作了几个星期。我目前有4个视图控制器设置和功能。目前所有东西都链接到我的标签栏控制器,但是我需要更多空间,而且3个视图控制器是相似的。我不确定最好的方法是什么。这3个视图控制器是预测控制器,一个是当前条件,一个是扩展预测,第三个是周末视图。我想要做的是将当前控制器链接到标签栏(足够简单),并可以选择将视图切换到当前视图中的其他选项。我尝试添加另一个标签栏控制器,但我不喜欢它与两个标签栏控制器的外观。我添加了一张图片,以便您可以看到它当前是如何设置的,基本上我想要消除最后两个选项卡并通过第二个选项卡访问它们。关于实现这一目标的最有效方法的任何建议?

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:4)

这更像是一个UI设计问题,而不是一个编程问题......但无论如何我都会进行一些编程。

我建议你将这三个预测放在一个支持分页的滚动视图中。然后,您只需要一个选项卡,然后您可以让用户在预测之间滑动:

paging weather view

您还可以通过将UIPageViewController设置为transitionStyle,在iOS 6上使用UIPageViewControllerTransitionStyleScroll实现此滚动。

要让用户知道有多个可用预测,您可以添加UIPageControl,如果您可以在相当繁忙的预测屏幕上找到空间。

让用户了解其他预测页面的另一种方法是在滚动视图出现时将其弹回。这是编程进来的!

在预测标签的视图控制器中执行此操作:

- (void)viewDidAppear:(BOOL)animated {
    [self bounceScrollViewIfNeeded];
}

- (void)bounceScrollViewIfNeeded {
    if (scrollView_.contentOffset.x != 0)
        return;

    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
        scrollView_.contentOffset = CGPointMake(20, 0);
    } completion:^(BOOL finished) {
        if (finished && !scrollView_.tracking) {
            [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
                scrollView_.contentOffset = CGPointZero;
            } completion:nil];
        }
    }];
}

此代码使滚动视图在预测选项卡出现时稍微反弹,如果滚动视图显示最左侧的页面。在用户看过几次后,您可能还想停止弹跳。无论如何,它看起来像这样:

bounce

如果用户在弹跳发生时尝试开始拖动,则需要取消动画。您可以通过将视图控制器指定为滚动视图的委托来实现,并实现此委托方法:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    [scrollView_.layer removeAnimationForKey:@"bounds"];
}

我认为使用UIPageViewController进行反弹是一种简单的方法。

答案 1 :(得分:1)

我会考虑在视图顶部使用UISegmentedControl。如果视图足够相似,使用相同的UIViewController类可以显示只有很小的变化,这是一个简单的解决方案。

如果视图差异很大,以至于在同一UIViewController中控制视图会不方便,我喜欢使用容器视图,尽管它们仅在iOS 6中可用。您可以嵌入{{1}使用嵌入segue进入容器视图的UIViewController。在UIView方法中,只需隐藏其他段的容器视图,并取消隐藏当前所选的容器视图。