我有一个UIViewController。
它的视图包含一个UITableView作为子视图。在viewDidAppear上,UIViewController调用UITableView的 - (void)flashScrollIndicators。
UIViewController还会观察到“SomethingHappened”的通知。当发生这种情况时,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];
}
结果看起来非常好。问题在于:“SomethingHappened”通常在tableview闪烁滚动指示器的同时发布/观察。这使得滚动指示器闪烁的行为非常奇怪 - 它从左侧滑落并覆盖整个内容,然后降落到它应该的右边缘。
我应该延迟其中一个动画(指示灯闪光或条形放置)吗?我怎么知道开始秒的安全性呢?
答案 0 :(得分:0)
我现在正在使用解决方法。我添加了两个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];
}