Анимация объектов из-за потери ответа за пределами экрана

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

При нажатии кнопки меню , Я анимирую UIView Контроллер опускает рамку на 80 пикселей, чтобы открыть 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 , он считает, что он находится вне экрана, поэтому не получает никаких действий.

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

6
задан César 22 November 2011 в 20:26
поделиться