我使用内容插件创建了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)];
第一次,scrollView.contentOffset.x
为-160.0
但奇怪的问题是当我点击scrollView(黄色区域)时,内容偏移x值重置为0并显示如下。
我尝试了几次,但点击Scroll View会将内容偏移重置为0。
我该如何防止这种情况?
答案 0 :(得分:14)
UIScrollView
分页通过滚动具有相同宽度的scrollView的页面(在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);
}
答案 1 :(得分:2)
除了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,将scrollView属性链接到我的滚动视图,它很好地将用户事件转发到scrollview。