Передайте управление (ответчик?) Обратно в нижний UIView, все еще выполняя анимацию затухания в верхнем UIView - PullRequest
1 голос
/ 13 июля 2011

Из всех контроллеров представления в моем приложении, если я выполняю долгосрочную задачу, я предоставляю пользователю «представление прогресса».Это UIView, который живет в моем MainWindow.xib.Я показываю (постепенно увеличиваю) представление с помощью метода AppDelegate ...

 - (void)showProgressView 
 {
     self.progressView.hidden = NO;

     [UIView animateWithDuration:1.0 
                      animations:^(void) { self.progressView.alpha = 1.0; }];
 }

Когда долгосрочное задание завершено, я постепенно исчезаю с помощью следующего метода AppDelegate: «представление прогресса» ...

 - (void)hideProgressView 
 {    
    [UIView animateWithDuration:1.0
                     animations:^(void) { self.progressView.alpha = 0.0; }
                     completion:^(BOOL f) { self.progressView.hidden = YES; } 
                     }];
 }

Моя проблема заключается в том, что, поскольку представление прогресса исчезает, и когда кнопки / элементы управления в нижележащем представлении ниже снова становятся видимыми, они НЕ могут использоваться (они не реагируют на события касания), пока анимация неполностью завершен, и «представление прогресса» скрыто.

Можно ли в любом случае передать управление обратно в базовый вид перед запуском анимации затухания, чтобы ее кнопки и т. д. работали, пока представление прогресса не исчезает?прочь?

РЕДАКТИРОВАТЬ: Вещи, которые я уже пытался безуспешно ...

Использование resignFirstResponder

- (BOOL)findAndResignFirstResponder:(UIView*)view
{
    NSLog(@"looping %@", [view description]);
    if (view.isFirstResponder) 
    {
        [view resignFirstResponder];
        return YES;
    }

    for (UIView *subView in view.subviews) 
    {
        if ([self findAndResignFirstResponder: subView])
        {
            return YES;
        }
    }

    return NO;
}

 - (void)hideProgressView 
 {    
    // Recursively attempt to remove control from the progress view
    BOOL result = [self findAndResignFirstResponder:self.progressView];

    [UIView animateWithDuration:1.0
                     animations:^(void) { self.progressView.alpha = 0.0; }
                     completion:^(BOOL f) { self.progressView.hidden = YES; } 
                     }];
 }

Использование endEditing

 - (void)hideProgressView 
 {    
    // Attempt to remove control from the progress view
    [self.progressView endEditing:YES];

    [UIView animateWithDuration:1.0
                     animations:^(void) { self.progressView.alpha = 0.0; }
                     completion:^(BOOL f) { self.progressView.hidden = YES; } 
                     }];
 }

1 Ответ

2 голосов
/ 13 июля 2011

Вы можете попробовать отправить свой прогресс, просмотрите сообщение resignFirstResponder.Это должно сделать представление под ним первым респондентом, чтобы вы могли использовать его элементы управления.

PS: Я также думаю, что, возможно, ваш обзор прогресса может заполнить весь экран;в этом случае изменение первого респондента может не помочь ...

РЕДАКТИРОВАТЬ: после того, как вы подтвердили, что ваше представление занимает полный экран ...

Если ваше представление полноэкранное, оноперехватывает все касания, которые вы делаете (потому что, когда он не полностью скрыт / прозрачен, он покрывает взгляды за ним).У вас есть два варианта: либо вы уменьшаете вид, чтобы не перекрывать друг друга, либо делаете так, чтобы касания перенаправлялись на вид позади него.

Последнее можно сделать несколькими способами, яНадеюсь, что вам это удастся:

  1. , который вы можете попробовать и переопределить в своем представлении прогресса (это должен быть пользовательский UIView), метод touchesBegan;

  2. вы можете попытаться переопределить метод hitTest в вашем представлении прогресса;

Это то, что я бы попробовал, например, в touchesBegan:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
      if (![self viewIsDisappearing])
           [self.nextResponder touchesBegan:touches withEvent:event];
 }

viewIsDisappearing - это метод, который вы должны реализовать, чтобы возвращать YES, если анимация, позволяющая скрыть представление прогресса, уже началась.Во время анимации вид еще не скрыт, поэтому он будет перехватывать касания, и вы отправляете эти касания следующему респонденту.

Возможно, вам также необходимо переопределить методы, связанные с касаниями другого UIResponder:

 – touchesMoved:withEvent:
 – touchesEnded:withEvent:
 – touchesCancelled:withEvent:

РЕДАКТИРОВАТЬ:

Я нашел свой класс, где я делаю что-то похожее на то, что я предлагаю здесь, только без использования nextResponder.

Идея такова: SDSTransparentView - это UIView, охватывающий весь экран.Вы инициализируете его так:

 [[SDSTransparentView alloc] initWithContent:contentView andDelegate:delegate];

Делегат реализует SDSTransparentViewProtocol, который просто содержит один метод:

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event outsideOfView:(UIView*)view;

Когда пользователь касается любого места в прозрачном представлении, он передаетприкоснитесь к делегату, вызвав метод протокола.Я бы посоветовал вам игнорировать аргументы contentView и outsideOfView (они полезны для меня, но, возможно, не для вас; вы можете либо передать ноль, либо, что лучше, представление за прогрессом).

Вы можете найти класс на моем github .Вам нужны только файлы SDSTransparentView. *.На самом деле, я предлагаю только взглянуть на то, как реализован класс (очень короткий), и сделать то же самое в вашем представлении прогресса.

Я могу заверить, что этот подход работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...