我正在创建一个类似于照片应用的ImageViewer。我有一个PagingScrollView,它是视图控制器的视图(在loadView中创建)。这些页面是带有UIImageView子视图的UIScrollViews。一切都工作hunky dory,直到我尝试'跳过'(设置内容偏移)到除第一个之外的索引。如果我跳过说图像'i',则图像被正确显示但是如果用户执行单击操作,则contentOffset将自身重置为显示图像'0'。其他手势(例如拖动)不会发生此错误,如果您执行另一种手势(例如先拖动),则触摸不会发生此错误。
这是我的ImageViewerController的loadView
- (void)loadView
{
//Make the outer spaging scroll view
CGRect pagingScrollViewFrame = [self frameForPagingScrollView];
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:pagingScrollViewFrame];
scrollView.pagingEnabled = YES;
scrollView.backgroundColor = [UIColor blackColor];
scrollView.showsVerticalScrollIndicator = NO;
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.contentSize = [self contentSizeForPagingScrollView];
scrollView.delegate = self;
self.view = scrollView;
}
这就是我尝试设置内容偏移的方法
#define myView (UIScrollView *)self.view
[myView setContentOffset:[self contentOffsetForIndex:index]];
[..]
- (CGPoint)contentOffsetForIndex:(NSUInteger)index
{
return CGPointMake((index * (self.view.frame.size.width)), 0);
}
答案 0 :(得分:12)
您是水平还是垂直滚动?您的偏移逻辑
CGPointMake((index * (self.view.frame.size.width)), 0);
将移动到Y轴的0。
的修改
我是一个懒惰的写作方法
以下是我采用的找出偏移相关问题的方法:
a)以编程方式偏移由setContentOffset:,scrollRectToVisible,setFrame(UIScrollView,内部调用SetContentOffset)设置。首先检查代码中的所有这些是否正确。
b)打印在scrollViewDidScroll:
方法中设置的偏移日志。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSLog(@" Offset = %@ ",NSStringFromCGPoint(scrollView.contentOffset));
}
这将帮助您识别正在设置的偏移值(在大多数情况下,所需的偏移量被另一个对setContentOffset的调用覆盖:代码中的某些位置;假设当前偏移量为(130,0)并且您想要设置它在步骤中发生的偏移量(300,0)(如果是动画的),你可能会得到像
这样的日志
Offset = {130,0}
Offset = {190,0}
Offset = {220,0}
Offset = {270,0}
Offset = {300,0}
如果对setContentOffset(动画)有其他调用,让我们说它将偏移设置为(0,0),你得到的日志看起来像是
Offset = {130,0}
Offset = {190,0}
Offset = {90, 0}
Offset = {220,0}
Offset = {60,0}
Offset = {270,0}
Offset = {30,0}
Offset = {300,0}
Offset = {0,0}
如果你注意到Logs中的第二个模式,你可以确定有一些未调用的setContentOffset。
3)一旦你识别出对setContentOffset的非预期调用的调用,尝试找到它的来源(将断点设置为setContentOffset可能有帮助),并且可以根据具体情况进行处理。例如:
_adjustContentOffsetIfNecessary
,是为UIScrollView设置框架时调用的内部方法。这可能是原因(尝试在设置帧后应用先前的偏移)。
希望这会有所帮助(也就是说,在删除投票时):))
答案 1 :(得分:1)
我有同样的问题(有点),但我对我的问题的解决方案是我禁用了
pagingEnabled
UIScrollView的...当您在设置ContentOffset时将UIScrollview重置为特定位置时,请检查您的pagingEnabled是否已禁用...