16

我创建了带有内容插图的 UIScrollView。

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)];

d

第一次scrollView.contentOffset.x是-160.0

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

在此处输入图像描述

我尝试了几次,但点击 Scroll View 会将内容偏移量重置为 0。

我怎样才能防止这种情况?

4

2 回答 2

15

UIScrollView分页通过滚动具有相同滚动视图宽度的页面(在您的情况下为 480 宽度的页面)来工作。这意味着您有 1 个单页(由于插入了 160 个内容,您仍然可以左右滚动)。

完成这项工作的一种方法是:

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 结束)。

第二种选择是自己处理分页,方法是使用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);
}
于 2013-09-28T15:25:42.457 回答
3

除了 alex 将 clipsToBounds 设置为 NO 的第一种方法之外,我还需要对滚动视图边界之外的滚动做出反应。所以我创建了 ScrollForwarderView 类,它是 UIView 的子类。

ScrollForwarderView.h

#import <UIKit/UIKit.h>

@interface ScrollForwarderView : UIView
@property (nonatomic, weak) UIScrollView *scrollView;
@end

ScrollForwarderView.m

...
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if ([self pointInside:point withEvent:event]) {
        return _scrollView;
    }
    return nil;
}

然后将 UIView 与自定义类 ScrollForwarderView 放在滚动视图上方,将滚动视图属性链接到我的滚动视图,它很好地将用户事件转发到滚动视图。

于 2014-11-29T08:31:42.040 回答