1

在 iPhone 上,您可以通过三种不同的方式在不同的主屏幕之间切换。

  1. 您可以向左或向右滑动,下一个相应的下一个屏幕将被动画化。

  2. 您触摸屏幕,无需抬起手指即可将屏幕向右或向左拖动。在通过临界点(即屏幕减半的距离)后,当您抬起手指时,下一个主屏幕会显示动画。

  3. 您触摸屏幕并且不抬起手指就稍微拖动屏幕,如果您愿意,您可以停止拖动但仍然不要离开手指。您可以在相对较短的距离内向左或向右加速,它会在左侧或右侧的相应屏幕上显示动画。

如果我们只看第 1 点和第 2 点,我们会发现它们实现起来很简单。这只是第 1UISwipeGuestureRecognizer点和UIPanGuestureRecognizer第 2 点。

将它们 1 和 2 结合起来似乎不是那么微不足道,因为滑动似乎占主导地位(我试图将它们与 结合起来- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer)。要触发平移,我必须将手指放在屏幕上并非常轻柔地拖动以不触发滑动。

更不用说第三点作为补充。这似乎完全不符合我的知识水平。

这里有什么建议吗?非常感谢您提前。如果需要更多信息来解决这个问题,我很乐意提供。

4

2 回答 2

4

主屏幕只是一个简单UIScrollViewUIPageControl :)

例子 :

// MyViewController.h
@interface MyViewController : UIViewController <UIScrollViewDelegate> {
    UIScrollView *_scrollView;
    UIPageControl *_pageControl;
}

// MyViewController.m
// in your viewDidLoad method
int numberOfPages = 3;
_scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width,
                                                                 self.view.frame.size.height)];
 [_scrollView setContentSize:CGSizeMake(numberOfPages*_scrollView.frame.size.width, _scrollView.frame.size.height)];
 [_scrollView setPagingEnabled:YES];
 [_scrollView setShowsHorizontalScrollIndicator:NO];
 [_scrollView setDelegate:self];
 [self.view addSubview:_scrollView];

 _pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, _scrollView.frame.size.height-30, _scrollView.frame.size.width, 20)];
 [_pageControl setNumberOfPages:numberOfPages];
 [_pageControl setCurrentPage:0];
 [self.view addSubview:_pageControl];

for (int i=0; i<numberOfPages; i++) {
   CGRect frame = _scrollView.frame;
   frame.origin.x = frame.size.width * i;
   frame.origin.y = 0;
   UIView *view = [UIView alloc] initWithFrame:frame];
   //Setup your view     
   [_scrollView addSubview:view];
}

如果要执行有关当前显示的视图的特定方法,请使用该scrollViewDidScroll:方法(例如从数据库加载内容)

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    CGFloat pageWidth = _scrollView.frame.size.width;
    int page = floor((_scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    _pageControl.currentPage = page;

    //do whatever you want..
}

这只是一个示例,向您展示如何做到这一点。如果您使用的是数据库,或者每个视图都不同,您应该以不同的方式设置视图或检索数据,但逻辑将是相同的......

于 2012-10-22T16:03:28.570 回答
1

WWDC 2012 视频

  • 查看使用滚动视图增强用户体验

WWDC 2011 视频

  • 查看高级滚动视图技术
于 2012-10-22T16:46:00.693 回答