2011-06-13 37 views
7

我正在创建一个类似于照片应用的ImageViewer。我有一个PagingScrollView,它是视图控制器的视图(在loadView中创建)。这些页面是带UIImageView子视图的UIScrollViews。一切工作hunky dory,直到我试图'跳过'(设置内容偏移量)除了第一个索引之外的索引。如果我跳过说,图像'我',图像正确显示,但如果用户执行一个轻击手势contentOffset重置自己回显示图像'0'。该错误不会与其他手势(例如拖动)发生,如果您先执行其他手势,则不会发生触摸。UIScrollView以编程方式设置contentOffset问题

这是我的ImageViewerController

- (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; 
} 

这是我正在尝试设置内容的loadView偏移

#define myView (UIScrollView *)self.view 

[myView setContentOffset:[self contentOffsetForIndex:index]]; 

[..] 

- (CGPoint)contentOffsetForIndex:(NSUInteger)index 
{ 
    return CGPointMake((index * (self.view.frame.size.width)), 0); 
} 
+0

也许张贴手势识别?这里的一切对我来说都很好。 水龙头是否调用某种类型的contentOffset更改? – Jensen2k 2011-06-13 22:54:07

+0

我不添加任何我自己的手势识别器。点击正在被分页滚动视图捕获,并将其contentOffset重置为显示第0页。虽然这样做我得到scrollViewDidScroll委托消息 – Mike 2011-06-14 15:57:45

+0

我遇到同样的问题,在iOS 6中,它为iOS 5的工作正常。此外,一旦我禁用pagingEnabled或如果我禁用滚动动画,此错误消失。任何人都知道更好的方法来解决这个问题? – AmineG 2013-06-07 08:14:31

回答

12

你水平或垂直滚动​​?您的偏移逻辑
CGPointMake((index * (self.view.frame.size.width)), 0);将移动到Y轴的0。 编辑
我是一个懒惰写作的方法。
这里是我采取找抵消相关问题的方法:

一)编程偏移由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}

如果您注意到日志中的第二种模式,则可以确定存在某个未预期的对setContentOffset的调用。
3)一旦识别出有对setContentOffset的非预期调用的调用,尝试找到它的源(将断点设置为setContentOffset可能有所帮助),并且可以根据每个案例进行处理。例如:
_adjustContentOffsetIfNecessary,是在为UIScrollView设置帧时调用的内部方法。这可能是原因(尝试在设置框架后应用上一个偏移量)。

希望这有助于(MEE过,在获得下投票移除:))

+0

我只是水平滚动。分页scrollView的contentSize.height足够小,因此垂直滚动被禁用,所以基本上我只想让contentOffset的yPos保持不变。问题是偏移量的x部分在第一次触摸 – Mike 2011-06-14 14:11:00

+0

@ monkybonk05上重置自己,您可能会看到编辑,希望它有帮助。 – Tatvamasi 2011-06-15 05:14:05

+0

感谢您的详细建议。目前我没有时间对其进行测试,但这听起来像是一个可靠的建议,并且会尽我所能。当我有他们时,我会更新线程的结果= D – Mike 2011-06-15 15:54:41

1

我有同样的问题(有点),但我解决我的问题是,我禁用了

pagingEnabled 

的UIScrollView ...当您的UIScrollview重置到设置ContentOffset时,特定的地方,请检查您的pagingEnabled被禁用...

+0

我有类似的问题。我使用分页,我想设置偏移量。即使暂时禁用它,它仍然没有设置。 – 2015-07-17 12:47:27