使用内容插入启用的UIScrollView分页工作很奇怪 [英] UIScrollView paging enabled with content inset is working strange

查看:98
本文介绍了使用内容插入启用的UIScrollView分页工作很奇怪的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用内容插件创建了UIScrollView。

I created the UIScrollView with content insets.

scrollView.frame = CGRectMake(-80, 180, 480, 190)
self.scrollView.contentInset = UIEdgeInsetsMake(0, 160, 0, 160);
self.scrollView.pagingEnabled = YES;
[self.scrollView setContentSize:CGSizeMake(480, 190)];

// Add three Views
[self.scrollView addSubview:view1];
[self.scrollView addSubview:view2];
[self.scrollView addSubview:view3];

[view1 setFrame:CGRectMake(0, 0, 160, 190)];
[view2 setFrame:CGRectMake(160, 0, 160, 190)];
[view3 setFrame:CGRectMake(320, 0, 160, 190)];

第一次, scrollView.contentOffset.x 为-160.0

At first time, scrollView.contentOffset.x was -160.0

但奇怪的问题是当我点击scrollView(黄色区域)时,内容偏移x值重置为0并显示如下。

But the weird problem is when I tap on scrollView(Yellow Area), content offset x value is resetting to 0 and shown like this.

I多次尝试,但点击滚动视图会将内容偏移重置为0.

I tried several times, but tapping on Scroll View resets the content offset to 0.

如何防止这种情况?

推荐答案

UIScrollView 分页的工作方式是滚动与scrollView宽度相同的页面(在480页宽度的情况下)。这意味着您有1个单页(由于160内容插入,您仍然可以向左和向右滚动)。

UIScrollView paging works by scrolling pages with the same width of the scrollView (in your case pages of 480 width). This means that you have 1 single page (you'd still be able to scroll left and right due to the 160 content inset).

使这项工作的一种方法是be:

One way to make this work would be:

self.scrollView.frame = CGRectMake(80, 180, 160, 190);
self.scrollView.clipsToBounds = NO;
self.scrollView.contentInset = UIEdgeInsetsZero;
self.scrollView.pagingEnabled = YES;
[self.scrollView setContentSize:CGSizeMake(480, 190)];

这将正确绘制和滚动,但屏幕两侧不会互动(80像素)在每一边,因为控件从frame.origin.x = 80开始,结束于80 + 160 = 240)。

This will draw and scroll correctly, however, the sides of the screen will not be interactive (80 pixels on each side, since the control starts at frame.origin.x=80 and ends at 80+160=240).

第二个选项是自己处理分页,使用 UIScrollViewDelegate 提供的方法。

Second option would be to handle paging yourself, by using methods provided by UIScrollViewDelegate.

- (void)viewDidLoad
{
    [super viewDidLoad];
    // pageIndex must be declared as a class member - this is used to prevent skipping pages during scroll
    pageIndex = 0;
    self.scrollView.frame = CGRectMake(0, 180, 320, 190);
    self.scrollView.contentInset = UIEdgeInsetsMake(0, 80, 0, 80);
    self.scrollView.pagingEnabled = NO;
    self.scrollView.clipsToBounds = YES;
    [self.scrollView setContentSize:CGSizeMake(480, 190)];
    self.scrollView.delegate = self;
}

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
    int pageWidth = 160;
    int pageX = pageIndex*pageWidth-scrollView.contentInset.left;
    if (targetContentOffset->x<pageX) {
        if (pageIndex>0) {
            pageIndex--;
        }
    }
    else if(targetContentOffset->x>pageX){
        if (pageIndex<3) {
            pageIndex++;
        }
    }
    targetContentOffset->x = pageIndex*pageWidth-scrollView.contentInset.left;
    NSLog(@"%d %d", pageIndex, (int)targetContentOffset->x);
}

这篇关于使用内容插入启用的UIScrollView分页工作很奇怪的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆