Анимация объектов за пределами экрана потеря ответа - PullRequest
6 голосов
/ 22 ноября 2011

У меня есть UIViewController.Внутри этого находится UITableView, который нарисован в начале координат 0,0.У меня также есть UIScrollView, который нарисован на 0,-80, так что он находится за пределами экрана и не виден.

Когда нажата кнопка меню, я анимирую кадр UIViewController на 80px, чтобы отобразить UIScrollView.

Проблема в том, что UIScrollView не отвечает вообще.

Если я нарисую UIScrollView, скажем, 0,0, где он виден при нагрузке, он работает нормально.Я даже могу анимировать его вне экрана, а затем снова без проблем.


Вот как выглядит мой взгляд до анимации:

 _____________________________
|                             |  Frame -> (0,-80, 320, 80)                  
|      ScrollView             |  **Offscreen**
|_____________________________|
|                             |  <- Original view (0,0,320,480)
|                             |
|                             |
|                             |
|                             |
|                             |
|       Original View         |
|                             |
|                             | 
|                             |
|                             |
|                             |
|                             |
|                             |
|                             |
|                             |
|                             |
|_____________________________|

Когда я оживляю, я делаю следующее:

[UIView animateWithDuration:0.3 
                      delay:0.0 
                    options:(UIViewAnimationOptionAllowUserInteraction |
                             UIViewAnimationOptionCurveEaseIn) 
                 animations:^{ 
                         self.view.frame = CGRectMake(0.0, (self.view.frame.origin.y + container.frame.size.height), self.view.frame.size.width, self.view.frame.size.height);
                        scroll.userInteractionEnabled = YES;
                     } 

                 completion:^(BOOL finished) { 
                         if (scrollLoaded == NO) {
                             [self loadFavorites]; 
                             scrollLoaded = YES;
                         }
                     }];

Теперь мой взгляд выглядит следующим образом после анимации:

 _____________________________
|                             |  Frame -> (0, -80, 320, 80)              
|      ScrollView             |  
|_____________________________|
|                             |  <- Original view (0, 80, 320, 480)
|                             |
|                             |
|                             |
|                             |
|                             |
|       Original View         |
|                             |
|                             | 
|                             |
|                             |
|                             |
|                             |
|                             |
|_____________________________|
|                             |
|        **Offscreen**        |
|_____________________________|

Я подклассифицировал свой scrollView, чтобы более внимательно слушать события:

.h

#import <UIKit/UIKit.h>

@interface UIScrollView_ExtraTouch : UIScrollView

@end

.m

#import "UIScrollView+ExtraTouch.h"

@implementation UIScrollView_ExtraTouch

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"scrollview touchesBegan");
    [self.nextResponder touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"scrollview touchesMoved");
    if(!self.dragging){
        [self.nextResponder touchesMoved:touches withEvent:event];
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"scrollview touchesEnded");
    [self.nextResponder touchesEnded:touches withEvent:event];
}

@end

Ничего не попадает в журнал после анимации.То, что я считаю , означает, что, поскольку кадр находится в -80, он считает, что он находится за пределами экрана, и поэтому не получает никаких действий.

Это правильно?Если да, есть ли способ это исправить?

1 Ответ

1 голос
/ 23 ноября 2011

Представление прокрутки находится за пределами исходного представления, поэтому вы не можете с ним реагировать. Чтобы исправить это, создайте представление обертки, которое будет достаточно большим, чтобы содержать всю область содержимого (с scrollView & tableView как подвидами), добавьте его в исходное представление и анимируйте это представление обертки вместо исходного представления.

Таким образом, вид оболочки будет 320x560, а при исходном виде 0, -80. Затем переместите его вверх и вниз на 80 по мере необходимости.

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