UIScrollView以编程方式设置contentOffset问题

时间:2011-06-13 22:38:37

标签: iphone ios uiscrollview

我正在创建一个类似于照片应用的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);
}

2 个答案:

答案 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是否已禁用...