Анимация внутри UIScrollView - PullRequest
8 голосов
/ 14 апреля 2011

Я хочу затемнить представление, поскольку оно прокручивается в родительском UIScrollview.Когда анимация затухания начинается, представление прокрутки прекращает прокрутку.Он переходит в правильное положение, когда затухание завершено.

Мое затухание достигается с помощью объектов animateWithDuration и block, вызванных изменением страницы, обнаруженным в scrollViewWillBeginDragging.

Кто-нибудь знает, как заставить их обоих происходить одновременно?Просто чтобы прояснить, я не «оживляю» прокрутку UIScrollView - скорее это происходит через взаимодействие с пользователем при смахивании.

РЕДАКТИРОВАТЬ:

Вот код, который я использую для затуханияUIView.Этот код находится в производном классе UIViewController, который является делегатом для UIScrollView.Когда пользователь начинает перетаскивать палец, я хочу исчезнуть в субвиде.Но когда пользователь начинает перетаскивать палец, подпредставление исчезает, и прокрутка останавливается.После того, как подпредставление полностью исчезло, представление прокрутки будет привязано к месту, где находится палец пользователя.

-(void)scrollViewWillBeginDragging:(UIScrollView*)scrollView
{
    [UIView animateWithDuration:0.5
        animations:^
        {
            self.subView.alpha = 0.0f;
        }
        completion:^(BOOL finished) { }];
}

Ответы [ 4 ]

13 голосов
/ 29 апреля 2011

Немного поздно, но если вы хотите продолжать использовать блоки, вы можете использовать:

animateWithDuration: Задержка: опции: анимация: полная:

добавить «UIViewAnimationOptionAllowUserInteraction» к параметрам, чтобы разрешить взаимодействие при прокрутке.

Я уверен, что у вас все еще будет проблема с отставанием. Вот лучший способ, которым я могу это объяснить. Пожалуйста, простите меня заранее, поскольку я, вероятно, использую неправильные термины Все анимации должны выполняться в главном потоке. Когда вы вызываете анимацию, iOS сначала * P * обрабатывает, а затем * R * завершает работу, прежде чем генерирует * F * rames. Похоже на это.

PPPPRRRRFFFFFFFFFFFFFFFFFF

Но поскольку ScrollViews не знают, как долго будет длиться ваша анимация или когда она закончится, она должна выполнить анимацию следующим образом.

PRFPRFPRFPRFPRFPRFPRFPRF

Моя теория заключается в том, что задержка, которую вы испытываете, связана с одновременным столкновением этих двух вызовов в главном потоке. Я не уверен, как бы вы решили эту проблему, кроме как с более быстрым чипом. Я имею в виду, что вы можете поместить одну анимацию в ЦП и одну в ГП, но я еще не настолько продвинут в программировании.

10 голосов
/ 17 апреля 2011

очень интересно ... Я проверил это, и да, у меня тот же эффект ... Ну, похоже, что animateWithDuration каким-то образом блокирует основной поток ... что не логично, и документация не делаетОб этом тоже ничего не сказано ... Однако есть простой обходной путь, похожий на этот: (я установил длительность анимации на 3, чтобы я мог видеть, что она работает, пока я двигаю свое представление прокрутки :) ...)

[UIView beginAnimations:@"FadeAnimations" context:nil];
[UIView setAnimationDuration:3]; 

self.subview.alpha = 0.0f;

[UIView commitAnimations];
8 голосов
/ 16 августа 2011

Я бы предложил, так как непрозрачность основана на движениях пальца пользователя в UIScrollView с использованием метода делегата scrollViewDidScroll :. ScrollView, переданный в качестве параметра, может использоваться для проверки contentOffset, который является просто CGPoint, указывающим, как далеко в представлении содержимого UIScrollView прокручивается пользователь. Примерно так можно использовать, чтобы связать положение прокрутки с непрозрачностью данного представления в разбивке по страницам на UIScrollView:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
  // The case where I used this, the x-coordinate was relevant. You may be concerned with the y-coordinate--I'm not sure
  CGFloat percent = ((int)(scrollView.contentOffset.x) % (int)(scrollView.frame.size.width)) / scrollView.frame.size.width;
  if (percent > 0.0 && percent < 1.0) { // Of course, you can specify your own range of alpha values
    relevantView.alpha = percent; // You could also create a mathematical function that maps contentOffset to opacity in a different way than this
  }
}
0 голосов
/ 02 августа 2011

Согласно информации, которая все еще не должна широко распространяться, все версии iOS 4.x полностью блокируют взаимодействие с пользователем во время анимации.

Разве не интересно, что вы, UITouches, очевидно, все еще зарегистрированы во время анимации? Хм ... может быть, это намекает на то, что что-то НОВОЕ появится в еще не выпущенной версии!

Т.е., если можете, прочитайте документацию по бета-версии iOS 5 о методах класса UIView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...