如何实现与在iPhone上的主屏幕之间导航相同的平移/滑动效果组合?

时间:2012-10-22 15:57:00

标签: ios ios5 uigesturerecognizer uipangesturerecognizer uiswipegesturerecognizer

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

  1. 您可以向左或向右滑动,下一个屏幕将分别动画显示。

  2. 触摸屏幕而不抬起手指可将屏幕向右或向左拖动。在通过临界点(距离更远,然后将屏幕减半)后,当您抬起手指时,下一个主屏幕会被动画化。

  3. 你触摸屏幕而不抬起手指就可以稍微拖动屏幕,如果你想要你可以停止拖动但仍然不要离开手指。并且您可以在相对较短的距离上向左或向右加速,它将向左或向右激活相应的屏幕。

  4. 如果我们互相专注地看第1点和第2点,我们发现它们很容易实现。对于第1点,它只是UISwipeGuestureRecognizer,对于第2点,只有UIPanGuestureRecognizer

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

    不要说第三点作为补充。对于我的知识状况来说,这似乎完全不合适。

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

2 个答案:

答案 0 :(得分:4)

主屏幕只有UIScrollView UIPageControl 就这么简单:)

示例:

// 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..
}

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

答案 1 :(得分:1)

WWDC 2012 videos

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

WWDC 2011 videos

  • 查看高级滚动视图技术