Анимация UIView заставляет flashscrollindicators вести себя странно - PullRequest
0 голосов
/ 04 марта 2012

У меня есть UIViewController.

Его представление содержит UITableView в качестве подпредставления.В viewDidAppear UIViewController вызывает UITableView - (void) flashScrollIndicators.

UIViewController также наблюдает уведомление «SomethingHappened».Когда это происходит, UIViewController добавляет к своему представлению еще одно небольшое подпредставление (полупрозрачная полоса высотой 30px, отображающая метку «что-то произошло»).Между тем contentInset UITableView установлен на 30 пикселей сверху, а contentOffset установлен на -30 пикселей.

Все это происходит в анимации UIView, которая приятно толкает панель представления и перемещает содержимое табличного представления вниз.немного, не теряя возможности прокручивать содержимое за полупрозрачной полосой позже.

- (void)viewDidLoad
{
    [super viewDidLoad];    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addMessageView:) name:@"SomethingHappened" object:nil];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];    
    [self.tableView flashScrollIndicators];
}

- (void)addMessageView {

    self.statusMessageView = [[FFStatusMessageView alloc] initWithFrame:CGRectMake(0, -kMessageViewHeight, self.view.frame.size.width, kMessageViewHeight)];
    self.statusMessageView.autoresizingMask = UIViewAutoresizingFlexibleWidth;


    void (^animations)(void) = ^{
        [self.view addSubview:self.statusMessageView];
        self.statusMessageView.frame = CGRectMake(0, 0, self.view.frame.size.width, kMessageViewHeight);
        self.tableView.contentInset = UIEdgeInsetsMake(kMessageViewHeight, 0,0,0);
        if (self.tableView.contentOffset.y == 0) self.tableView.contentOffset = CGPointMake(0, -kMessageViewHeight);
    };

    [UIView animateWithDuration:0.4 animations:animations];
}

Результат выглядит очень хорошо.Вот проблема: «SomethingHappened» обычно публикуется / наблюдается примерно в то же время, когда табличное представление мигает индикаторами прокрутки.Это делает вспышку индикатора прокрутки действительно странной - она ​​скользит слева и по всему контенту, прежде чем попадает на правый край, где и должна быть.

Должен ли я отложить одну из анимаций (индикатор мигает илиразмещение бара)?Как я могу знать, безопасно ли начинать секунды?

1 Ответ

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

Я использую обходной путь сейчас.Я добавил два BOOL ivars (_animatingTableView и _waitingToFlashIndicators), чтобы узнать состояние анимации.

- (void)viewDidLoad
{
    [super viewDidLoad];    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addMessageView:) name:@"SomethingHappened" object:nil];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];    
    if (! _animatingTableView) {
        [self.tableView flashScrollIndicators];
    } else {
        _waitingToFlashIndicators = YES;
    }
}

- (void)addMessageView {

    _animatingTableView = YES;
    self.statusMessageView = [[FFStatusMessageView alloc] initWithFrame:CGRectMake(0, -kMessageViewHeight, self.view.frame.size.width, kMessageViewHeight)];
    self.statusMessageView.autoresizingMask = UIViewAutoresizingFlexibleWidth;

    void (^animations)(void) = ^{
        [self.view addSubview:self.statusMessageView];
        self.statusMessageView.frame = CGRectMake(0, 0, self.view.frame.size.width, kMessageViewHeight);
        self.tableView.contentInset = UIEdgeInsetsMake(kMessageViewHeight, 0,0,0);
        if (self.tableView.contentOffset.y == 0) self.tableView.contentOffset = CGPointMake(0, -kMessageViewHeight);
    };

    void (^completion)(BOOL) = ^(BOOL finished){
        _animatingTableView = NO;
        if (_waitingToFlashIndicators) {
            [self.tableView flashScrollIndicators];
            _waitingToFlashIndicators = NO;
        }
    };

    [UIView animateWithDuration:0.4 animations:animations completion:completion];
}
...