#ios #objective-c #xcode
#iOS #objective-c #xcode
Вопрос:
Я хочу, чтобы нижняя панель инструментов исчезала, когда просмотр прокрутки прекращался, это не проблема:
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
self.toolbar.hidden = NO;
}
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
self.toolbar.hidden = NO;
}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
self.toolbar.hidden = NO;
}
Итак, это работает хорошо, но проблема с этим подходом заключается в том, что вид нижней панели мерцает, как будто у нее приступ. Я этого не хочу, поэтому я переведу ее в режим ожидания на одну секунду, прежде чем она появится снова. Проблема в том, что self.toolbar.hidden
не отвечает в фоновом потоке:
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
^{
NSLog(@"Hello?");
sleep(1);
self.toolbar.hidden = NO;
});
}
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
^{
NSLog(@"Hello?");
sleep(1);
self.toolbar.hidden = NO;
});
}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
^{
NSLog(@"Hello?");
sleep(1);
self.toolbar.hidden = NO;
});
}
Итак, в этом сценарии self.toolbar.hidden = NO;
ничего не делает. NSLogs проходят без проблем, поэтому я подумал, что попробую этот подход, но он тоже не работает:
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
^{
NSLog(@"Hello?");
sleep(1);
[self unhideToolbar];
});
}
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
^{
NSLog(@"Hello?");
sleep(1);
[self unhideToolbar];
});
}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
^{
NSLog(@"Hello?");
sleep(1);
[self unhideToolbar];
});
}
-(void)unhideToolbar
{
NSLog(@"toolbar unhidden");
self.toolbar.hidden = NO;
}
Я не могу понять, что я здесь делаю не так… Все NSLogs работают без проблем, но отображение панели инструментов не имеет ничего общего с асинхронными функциями.
Кто-нибудь знает, почему это происходит?
Комментарии:
1. Изменение пользовательского интерфейса должно быть реализовано в основной очереди
Ответ №1:
Изменения пользовательского интерфейса должны быть в основной очереди. Попробуйте отправить обратно к ней следующим образом:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
^{
NSLog(@"Hello?");
sleep(1);
dispatch_async(dispatch_get_main_queue(), ^{
[self unhideToolbar];
});
});