scrollView scrollRectToVisible在模拟器上工作而不在设备上工作

时间:2011-05-11 02:16:29

标签: iphone cocoa-touch uiscrollview cocos2d-iphone

编辑:我在一个新项目中尝试了这个代码,它按预期工作。 以下代码用于添加的opengl视图(使用cocos2d)     [[[CCDirector sharedDirector] openGLView] addSubview:lsvc.view]; 其中lsvc是我的viewcontroller和scrollview。

我的滚动视图有一个奇怪的行为,当我尝试以编程方式滚动滚动视图时,所有在模拟器中工作正常(xcode4,4.3 simul)但在我的设备上无效(4.3.2)

滚动我在pageControl事件中(在值更改时)执行以下操作

CGRect frame = self.scrollView.frame;   
frame.origin.x = frame.size.width * self.pageControl.currentPage;
frame.origin.y = 0;
[self.scrollView scrollRectToVisible:frame animated:YES];

这就是我在viewdidload

中初始化scrollview的方法
self.scrollView.delegate = self;
[self.scrollView setShowsVerticalScrollIndicator:NO];
[self.scrollView setShowsHorizontalScrollIndicator:NO];
self.scrollView.pagingEnabled = YES;
self.scrollView.scrollsToTop = NO;

int page = 0;
int pageNum = 3;
[self.scrollView setContentSize:CGSizeMake(self.scrollView.frame.size.width*pageNum, self.scrollView.frame.size.height)];


for (; page < pageNum; page++) {
    LevelViewController *lvlvc = [[LevelViewController alloc] init];
    CGRect frame = self.scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    lvlvc.view.frame = frame;
    [self.scrollView addSubview:lvlvc.view];
    // add the viewcontroller to a saved array to keep track
    [levelsController addObject:lvlvc];
    [lvlvc release];
} 
self.pageControl.numberOfPages = page;

通过在设备上平移来滚动滚动视图效果很好,点击页面控件有时会将滚动移动一点(如20点或更少),其余时间它根本不滚动。在模拟器上一切正常。 有人指向一个方向,检查什么,因为我迷路了,我不知道为什么我在模拟器和设备上得到2种不同的行为 我也试过了

[self.scrollView setContentOffset:CGPointMake(frame.size.width * pageNum,0)animated:YES];

这也只适用于模拟器

4 个答案:

答案 0 :(得分:1)

我的最新项目遇到了同样的问题。解决方案是将帧速率降低到30 fps,然后执行scrollRectToVisible:然后将其设置回60 fps。

...
[[CCDirector sharedDirector] setAnimationInterval:1.0/30.0];
[scrollView scrollRectToVisible:rect animated:YES];
...

然后在scrollView委托中:

- (void) scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
   [[CCDirector sharedDirector] setAnimationInterval:1.0/60.0];
}

我没有在委托调用中将其设置回来,因为我使用滚动视图进行了级别选择屏幕,因此进入给定屏幕时我丢弃了帧速率(毕竟没有任何动画),并且离开屏幕我恢复了60 fps。

希望我能帮忙!

答案 1 :(得分:0)

我在viewDidLoad中添加标签以查看您在addSubview之前添加滚动视图

lvlvc.viw.tag = page+100;
self.scrollView addSubview:lvlvc.view];

您的pageControl事件应如下所示

UIView *viewToScroll = [self.scrollView viewWithTag: yorPageControl.currentPage+100];
[self.scrollView scrollRectToVisible:viewToScroll.frame animated:YES];

idee是为您在滚动视图中添加的每个视图设置一个唯一标记。当页面控件改变时,获取currentPage的当前视图,并告诉滚动视图滚动到相应的rect。

祝你好运:D

答案 2 :(得分:0)

我遇到了同样的问题,我能想到的唯一解决方案是将scrollRectToVisible动画属性更改为NO。这不是最佳的,但它会让它发挥作用。

我检查过很多其他内容(内存警告,scrollview设置,setContentOffset()),阅读了几十篇类似于此的SO帖子,但没有找到解决方案。视图从不接收scrollRectToVisible调用。我设置了scrollViewDidScroll,当我滑动时我看到它被调用但是scrollRectToVisible调用没有触发它。我发现的唯一一件事就是如果你在scrollRectToVisible设置断点然后继续,它往往会更频繁地工作。所以它可能是UIScrollView API动画的一些时间错误。

答案 3 :(得分:0)

上面的情况并非如此,但就我而言,当我使用 tableView.scrollToRow 时,它可以在模拟器上运行,但在设备上却不起作用。

它在实现为 setContentOffset(:animated:), scrollRectToVisible(:animated:method) 时有效。

我找到了here