Я знаю, что обновить интерфейс, когда Apple не рекомендует Apple, особенно для OpenGL.
Однако я только что понял, что iMessenger и Facebook-мессенджер, похоже, способны это сделать. Введите поток сообщений со своим другом, а затем перейдите на задний план, затем получите новое сообщение, пока приложение все еще находится в фоновом режиме, а затем принесите это приложение на передний план (щелкните значок push или значок приложения), вы обнаружите, что новый пузырь сообщения уже там с анимацией расширения приложения из значка.
По моему мнению, это может произойти только потому, что новый пузырь сообщения уже нарисован в фоновом режиме. Затем, когда приложение входит на передний план, оно может появиться в анимации.
Однако из моего результата теста в iOS8 и iOS9 все обновления фонового интерфейса будут отложены после того, как приложение станет активным. Кроме того, iOS добавит неявную транзакцию анимации для этого обновления пользовательского интерфейса.
Я перечислил свой тестовый код, как показано ниже, вы увидите, что новая ячейка будет добавлена в таблицу с очевидной транзакцией анимации, когда приложение выходит на передний план, полностью в отличие от iMessenger. TableView: numberOfRowsInSection: будет выполняться только задержка, когда приложение вводит передний план.
И не только для обновления ячейки таблицы, даже добавление subview в фоновом режиме также инициирует аналогичную задержку транзакции для входа на передний план.
Возможно, я в совершенно неправильном направлении об этом. Может ли кто-нибудь помочь мне понять, как iMessenger и FB messenger могут достичь этого эффекта? Заранее спасибо!
@interface ViewController () <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic) UITableView *tableView;
@property (nonatomic) NSMutableArray *dataTable;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:self.tableView];
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.tableView registerClass:[UITableViewCell class]
forCellReuseIdentifier:@"kCellId"];
self.dataTable = [[NSMutableArray alloc] initWithArray:@[@"1", @"2", @"3"]];
__weak __typeof(self) weakSelf = self;
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification * _Nonnull note) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)),
dispatch_get_main_queue(), ^{
[weakSelf.dataTable addObject:[@(weakSelf.dataTable.count + 1) stringValue]];
[weakSelf.tableView reloadData];
});
}];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.dataTable.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"kCellId"];
cell.textLabel.text = self.dataTable[indexPath.row];
return cell;
}
@end