#ios #uiview
#iOS #uiview
Вопрос:
Я создал плавающий вид для своего приложения, который всегда отображается на экране.
Теперь я хочу, чтобы половина его выходила за пределы моего экрана, когда он интерактивный в течение 3-4 секунд. Я думаю, мне следует использовать a NSTimer
, чтобы скрыть это представление, но это не проблема.
Проблема в том, как мне настроить origin.x
это представление так, чтобы оно выходило за пределы экрана? Я попытался установить рамку в моем initWithSuperView
виде следующим образом:
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenX = screenRect.origin.x;
[self setFrame:CGRectMake(-screenX - size.width, 0, size.width, size.height)];
Однако это не работает. Как мне это сделать, чтобы получить желаемый результат? Смотрите Изображение ниже для получения дополнительной информации:
Ответ №1:
вы можете использовать анимацию uiview, подобную этой:
dispatch_async(mainQueue, ^{
__weak __typeof(self) weakSelf = self;
[UIView animateWithDuration:3.f animations:^{
// change uiview frame here
weakSelf.frame = hiddenFrame;
} completion:^(BOOL finished) {
// setup completion
[weakSelf.view layoutIfNeeded];
}];
});
также вы можете настроить NSLayoutConstraint
ограничение x для uiview и при необходимости обновить его отрицательным значением.
Комментарии:
1. почему dispatch_async — mainQueue?
2. @Ahmad Потому что операции пользовательского интерфейса должны предоставляться только в основном потоке.
3. 🙂 animateWithDuration не блокирует основной поток. это не похоже на загрузку изображения, например, в отдельную очередь, и отражает результат в компоненте пользовательского интерфейса в основном потоке. Попробуйте сами.
4. Я привел этот пример только из своего проекта. И в другом потоке я отправлял запросы на сервер с помощью AFNetw.. Для animateWithDuration: ссылка на класс ничего не говорит о потоковой передаче, поэтому я не уверен.
5. Итак, мне не нужен блок dispatch_async для этого случая, верно?