首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用scrollViewWillEndDragging进行自定义UIScrollView分页

使用scrollViewWillEndDragging进行自定义UIScrollView分页
EN

Stack Overflow用户
提问于 2012-02-21 03:58:59
回答 5查看 28.5K关注 0票数 24

我试图在iOS 5中使用新的scrollViewWillEndDragging:withVelocity:targetContentOffset: UIScrollView委托调用,但我似乎无法让它真正正确地响应我。我正在更改targetContentOffset->x的值,但它从未被使用过。我知道代码正在运行,因为它会命中该函数中的断点。我甚至尝试将偏移值设置为硬编码的数字,这样我就可以知道它将在哪里结束,但它永远不会起作用。

有没有人能够正确地使用它并使其工作?是否有其他必须实现的委托调用才能正常工作?

这是我的代码,以防有人发现它有问题:

代码语言:javascript
代码运行次数:0
运行
复制
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
    // goodOffsetX returns the contentOffset i want the scrollView to stop at
    CGFloat goodOffsetX = [self _horizontalContentOffsetForTargetHorizontalContentOffset:(*targetContentOffset).x velocity:velocity.x];

    NSLog( @" " );
    NSLog( @"scrollViewWillEndDragging" );
    NSLog( @"   velocity: %f", velocity.x );
    NSLog( @"   currentX: %f", scrollView.contentOffset.x );
    NSLog( @"   uikit targetX: %f", (*targetContentOffset).x );
    NSLog( @"   pagedX: %f", goodOffsetX );

    targetContentOffset->x = goodOffsetX; 
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-06-21 15:55:46

您可以使用以下代码实现自定义分页:

代码语言:javascript
代码运行次数:0
运行
复制
- (float) pageWidth {
    return ((UICollectionViewFlowLayout*)self.collectionView.collectionViewLayout).itemSize.width +
    ((UICollectionViewFlowLayout*)self.collectionView.collectionViewLayout).minimumInteritemSpacing;
}

- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView {

    CGFloat pageWidth = self.collectionView.frame.size.width + 10 /* Optional Photo app like gap between images. Or use [self pageWidth] in case if you want the next page be also visible */;

    _currentPage = floor((self.collectionView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;

    NSLog(@"Dragging - You are now on page %i", _currentPage);
}

- (void) scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset {

    CGFloat pageWidth = self.collectionView.frame.size.width + 10; // [self pageWidth]

    int newPage = _currentPage;

    if (velocity.x == 0) { // slow dragging not lifting finger
        newPage = floor((targetContentOffset->x - pageWidth / 2) / pageWidth) + 1;
    }
    else {
        newPage = velocity.x > 0 ? _currentPage + 1 : _currentPage - 1;

        if (newPage < 0)
            newPage = 0;
        if (newPage > self.collectionView.contentSize.width / pageWidth)
            newPage = ceil(self.collectionView.contentSize.width / pageWidth) - 1.0;
    }

    NSLog(@"Dragging - You will be on %i page (from page %i)", newPage, _currentPage);

    *targetContentOffset = CGPointMake(newPage * pageWidth, targetContentOffset->y);
}

当然,您必须设置pagingEnabled = NO。_currentPage是一个iVar类。感谢http://www.mysamplecode.com/2012/12/ios-scrollview-example-with-paging.html为我们指明了正确的方向。

票数 54
EN

Stack Overflow用户

发布于 2017-02-08 23:25:51

SWIFT 3

这里有一个演示https://github.com/damienromito/CollectionViewCustom

代码语言:javascript
代码运行次数:0
运行
复制
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

    let pageWidth = Float(itemWidth + itemSpacing)
    let targetXContentOffset = Float(targetContentOffset.pointee.x)
    let contentWidth = Float(collectionView!.contentSize.width  )
    var newPage = Float(self.pageControl.currentPage)

    if velocity.x == 0 {
        newPage = floor( (targetXContentOffset - Float(pageWidth) / 2) / Float(pageWidth)) + 1.0
    } else {
        newPage = Float(velocity.x > 0 ? self.pageControl.currentPage + 1 : self.pageControl.currentPage - 1)
        if newPage < 0 {
            newPage = 0
        }
        if (newPage > contentWidth / pageWidth) {
            newPage = ceil(contentWidth / pageWidth) - 1.0
        }
    }
    let point = CGPoint (x: CGFloat(newPage * pageWidth), y: targetContentOffset.pointee.y)
    targetContentOffset.pointee = point
}
票数 9
EN

Stack Overflow用户

发布于 2012-05-13 11:35:24

我能够运行一个快速测试,并让它正确地触发,并使我的对象停止所需的。我使用以下简单的测试完成了这项工作:

代码语言:javascript
代码运行次数:0
运行
复制
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
     targetContentOffset->x = scrollView.contentOffset.x - 10;    
}

看起来这个方法可能不是你代码中的问题,但它更有可能是你的'goodOffsetX‘没有正确地计算一个有效的值来停止。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9367600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档