Cocoa touch UIView动画使FlashScroll指示器行为怪异

Cocoa touch UIView动画使FlashScroll指示器行为怪异,cocoa-touch,uitableview,uiscrollview,core-animation,Cocoa Touch,Uitableview,Uiscrollview,Core Animation,我有一个UIViewController 其视图包含作为子视图的UITableView。在ViewDidDisplay上,UIViewController调用UITableView的-(void)flashScrollIndicators UIViewController还观察到一个通知“SomethingOccessed”。发生这种情况时,UIViewController会向其视图添加另一个小的子视图(一个30px高的半透明条,显示“发生了什么事”的标签)。同时,UITableView的con

我有一个UIViewController

其视图包含作为子视图的UITableView。在ViewDidDisplay上,UIViewController调用UITableView的-(void)flashScrollIndicators

UIViewController还观察到一个通知“SomethingOccessed”。发生这种情况时,UIViewController会向其视图添加另一个小的子视图(一个30px高的半透明条,显示“发生了什么事”的标签)。同时,UITableView的contentInset在顶部设置为30px,contentOffset设置为-30px

所有这些都发生在UIView动画中,该动画可以很好地推动视图上的条,并将tableview内容向下移动一点,而不会丢失稍后在半透明条后面滚动内容的能力

- (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];
}
结果看起来很好。问题是:“SomethingOccessed”通常是在tableview闪烁滚动指示器的同时发布/观察的。这使得滚动指示器闪烁的行为非常奇怪——它从左侧滑入,覆盖整个内容,然后落在应该位于的右侧边缘


我是否应该延迟其中一个动画(指示器闪烁或条形图放置)?我怎么知道启动秒一安全吗?

我现在正在使用一种解决方法。我添加了两个BOOL ivar(_animatingTableView和_waitingoflashindicators)来了解动画的状态

- (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];
}