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

标签 ios ios5 uigesturerecognizer uipangesturerecognizer uiswipegesturerecognizer

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

  • 您可以向左或向右滑动,下一个屏幕将分别动画。
  • 您触摸屏幕,无需抬起手指即可将屏幕向右或向左拖动。在通过临界点(即屏幕减半的距离)后,当您抬起手指时,下一个主屏幕会显示动画。
  • 您触摸屏幕并且不抬起手指就稍微拖动屏幕,如果您愿意,您可以停止拖动但仍然不要离开手指。您可以在相对较短的距离内向左或向右加速,它会在左侧或右侧的相应屏幕上显示动画。

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

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

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

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

    最佳答案

    主屏幕只是一个 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];
    }
    

    如果要对当前显示的 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..
    }
    

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

    关于ios - 如何在 iPhone 上实现与在主屏幕之间导航相同的平移/滑动效果组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13015156/

    相关文章:

    ios - Quickblox 推送到发送者和接收者

    iphone - 用于 iOS 项目的 XMLRPC-iOS

    iphone - UITabViewController、viewWillAppear 没有被调用?

    objective-c - UIRotationGestureRecognizer 旋转有时会达到非常大的值

    ios - iOS 位置固定元素的滚动问题

    ios - swift 3 中的 NSAttributedString 扩展

    ios - 可以在 iOS 上进行订阅免费试用的 A/B 测试吗?

    ios - 将 UISwitch 添加到 UITableView 的顶部以展开/折叠下方的 UITableViewCell

    objective-c - 使用 UITapGestureRecognizer 显示/隐藏菜单

    uiscrollview - 将 UIScreenEdgePanGestureRecognizer 用于 UIScrollView