【问题标题】:UIScrollView - with paging enabled, can I "change" the page width?UIScrollView - 启用分页后,我可以“更改”页面宽度吗?
【发布时间】:2011-01-16 09:33:41
【问题描述】:

让滚动视图(将 pagingEnabled 设置为 YES)将页面宽度设置为滚动视图边界以外的其他值的最简单方法是什么?

让我举个例子。假设我有一个包含 10 个项目的滚动视图,每个项目 150 像素宽,而我的滚动视图是 300 像素宽。如果我从可见的视图 1 和 2 开始并向右水平滚动,我希望下一个“页面”显示项目 2 和 3。如果我再向右滚动一页,我会看到项目 3 和 4。

有人做过吗?如果不是,你会使用什么策略?

【问题讨论】:

    标签: iphone cocoa-touch uiscrollview


    【解决方案1】:

    Alexander Repty 刚刚发布了关于这个主题的博客:http://blog.proculo.de/archives/180-Paging-enabled-UIScrollView-With-Previews.html。简短的回答:这并不像仅仅改变“页面”的宽度那么简单,但也不是太难。

    【讨论】:

    • 我在其他地方看到过这种方法并尝试过,但不幸的是,我认为它没有达到我想要的效果。我需要的不仅仅是查看周围项目的边缘 - 就我而言,我需要在屏幕上完全显示两个项目。不幸的是,这种方法对我来说效果不佳,尤其是在最左边/最右边的边缘。
    • 只需将滚动视图设为 150 像素宽,但关闭剪裁。将整个东西放在一个 300 px 宽的视图中,并为它打开剪辑。
    • 谢谢,本。正如我在对亚历山大的回答的评论中提到的那样,这绝对让我走上了正确的道路。
    • 请务必记下“digdog”对博文的评论,以确保它在您需要能够与之交互的子视图时正常工作。
    • 更多关于覆盖命中测试方法:smnh.me/hit-testing-in-ios
    【解决方案2】:

    迈克,

    使用 Ben 链接到的我的博客中的方法。将 UIScrollView 设为周围视图大小的一半(即 150 像素)并将其向左移动而不是居中。

    这应该会给你你想要的行为。

    干杯, 亚历克斯

    【讨论】:

    • 没那么简单,但我相信我已经弄明白了。你的帖子肯定有帮助 - 谢谢!
    • 这种方法的一个问题是,只有在您触摸滚动视图的一半时滚动才有效。
    • @ChaseRoberts 你可以调整命中测试来解决这个问题:smnh.me/hit-testing-in-ios
    【解决方案3】:

    这当然可以在 scrollview 委托方法content-offset 的帮助下完成。

    下面是相同的详细代码。

    int start;
    
    int end;
    
    int k=0;
    
    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView1
    {
    
        pageControlUsed = NO;
    
        start = scrollView.contentOffset.x;
    
    }
    
    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView1 willDecelerate:(BOOL)decelerate
    {
    
        end = scrollView.contentOffset.x;
    
    }   
    
    
    - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView1{
    
        int diff = end-start;
    
            if (diff>0)
            {
    
             k=k+150;
             [scrollView setContentOffset:CGPointMake(k, 0) animated:YES];
    
            }
           else {
    
             k=k-150;
            [scrollView setContentOffset:CGPointMake(k, 0) animated:YES];
    
              }
    }
    

    【讨论】:

      【解决方案4】:

      只需覆盖 scrollViewWillEndDragging

      - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
          CGFloat pageWidth = 160;
          targetContentOffset->x = pageWidth * (int)(targetContentOffset->x / pageWidth);
      }
      

      【讨论】:

        【解决方案5】:
        UIScrollView *album = [[UIScrollView alloc] init];
        album.translatesAutoresizingMaskIntoConstraints = NO;
        album.pagingEnabled = YES;
        album.clipsToBounds = NO;
        album.showsHorizontalScrollIndicator = NO;
        album.contentInset = UIEdgeInsetsMake(0, -50, 0, -50);
        [view addSubview:album];
        
        
        [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[_album(220)]" options:0 metrics:metrics views:views]];
        
        [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_album(300)]" options:0 metrics:metrics views:views]];
        

        这在 iOS 7.1~ 8.2 上运行良好

        【讨论】:

          猜你喜欢
          • 2011-07-02
          • 2014-07-20
          • 1970-01-01
          • 2012-10-11
          • 2016-12-04
          • 2022-01-12
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多