scrollView scrollRectToVisible работает на симуляторе и не работает на устройстве - PullRequest
1 голос
/ 11 мая 2011

РЕДАКТИРОВАТЬ: я попробовал этот код в новом проекте, и он работает, как ожидалось. следующий код используется поверх представления opengl (с использованием cocos2d), добавленного с [[[CCDirector sharedDirector] openGLView] addSubview: lsvc.view]; где lsvc - это мой viewcontroller с scrollview.

У меня странное поведение с моим scrollview, когда я пытаюсь программно прокрутить 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

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) анимированный: ДА];

и это тоже работает только на симуляторе

Ответы [ 3 ]

1 голос
/ 19 сентября 2012

У меня была та же проблема в моем последнем проекте.Решение состояло в том, чтобы снизить частоту кадров до 30 кадров в секунду, затем выполнить scrollRectToVisible: затем установить его обратно в 60 кадров в секунду.

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

затем в делегате scrollView:

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

Я не установил его обратно в вызове делегата, потому что у меня был экран выбора уровня с scrollview, поэтому вводЭкран Я опустил частоту кадров (там не было никакой анимации, в конце концов), и оставив экран, я восстановил 60 кадров в секунду.

Надеюсь, что смогу помочь!

0 голосов
/ 02 марта 2012

Я столкнулся с этой же проблемой, и единственное решение, которое я мог бы найти, - это изменить анимированное свойство scrollRectToVisible на NO. Это не оптимально, но сработает.

Я проверил много других вещей (предупреждения памяти, настройки scrollview, setContentOffset ()), прочитал десятки сообщений SO, похожих на это, и никакого решения не было найдено. Вызов scrollRectToVisible никогда не принимается представлением. Я настроил scrollViewDidScroll и вижу, что он вызывается при перелистывании, но вызов scrollRectToVisible не вызывает его. Единственное, что я обнаружил, - если вы установите точку останова в scrollRectToVisible, а затем продолжите, она будет работать чаще, чем нет. Так что это может быть какая-то временная ошибка с анимацией UIScrollView API.

0 голосов
/ 11 мая 2011

Я использую тег 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];

Идеяустановить для каждого представления, которое вы добавляете в представление прокрутки, уникальный тег.И когда элемент управления страницы изменяется, получите текущее представление для currentPage и скажите прокрутке, чтобы прокрутить до corespondent rect.

Удачи: D

...