【问题标题】:UIView animation makes flashscrollindicators behave weirdlyUIView 动画使 flashscrollindicators 行为怪异
【发布时间】:2012-03-22 05:14:56
【问题描述】:

我有一个 UIViewController。

它的视图包含一个 UITableView 作为子视图。在 viewDidAppear 上,UIViewController 调用 UITableView 的 -(void)flashScrollIndicators。

UIViewController 还观察到通知“SomethingHappened”。发生这种情况时,UIViewController 会在其视图中添加另一个小的子视图(一个 30 像素高的半透明条,显示标签“发生了什么事”)。同时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];
}

结果看起来非常好。这是问题所在:“SomethingHappened”通常是在 tableview 闪烁其滚动指示器的大致同时发布/观察的。这使得滚动指示器闪烁的行为非常奇怪 - 它从左侧滑入并覆盖整个内容,然后落在它应该在的右侧边缘。

我应该延迟其中一个动画(指示灯闪烁或条形放置)吗?我怎么知道什么时候开始第二个是安全的?

【问题讨论】:

    标签: cocoa-touch uitableview uiscrollview core-animation


    【解决方案1】:

    我现在正在使用一种解决方法。我添加了两个 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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-25
      • 2013-03-17
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多