Сделать так, чтобы половина пользовательского интерфейса исчезла с экрана

#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 для этого случая, верно?