IOS - анимация не отвечает - PullRequest
0 голосов
/ 22 марта 2012

Я хочу создать анимированное меню.

  • сначала он скрыт за пределами экрана
  • когда пользователь нажимает на экран, он скользит в
  • пользователь может коснуться его, и он что-то сделает
  • затем через 3 с он будет скользить за пределами экрана

Но проблема в том, что это не ответ, когда я нажимаю на него. Почему?

пример кода: Весь код в моем классе UIView.

showing = NO;
box = [[UIView alloc] initWithFrame:CGRectMake(500,-200,200,200)];
box.backgroundColor = [UIColor redColor];

UITapGestureRecognizer *tapBox = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapMenuHandler:)] autorelease];
[box addGestureRecognizer:tapBox];

[self addSubView:box];

и

-(void) tapMenuHandler: (UIView *)obj {
    //Do something
    NSLog(@"tap box");
} 

и

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if (!showing) {

    box.frame = CGRectMake(500, -200, 200, 200);

    [UIView animateWithDuration:0.5f delay:0.3f options:(UIViewAnimationOptionAllowUserInteraction) animations:^{

        box.frame = CGRectMake(500, 200, 200, 200);

    } completion:^(BOOL finished) {
        showing = YES;

                    [UIView animateWithDuration:0.5f delay:3.0f options:(UIViewAnimationOptionAllowUserInteraction) animations:^{
                        box.frame = CGRectMake(500, -200, 200,200);
                    } completion:^(BOOL finished) {
                       showing = NO;
                    }];

    }];    
}

}

Спасибо за вашу помощь и извините за мой английский :) 1026 *

Редактировать: подробнее Я попытался установить начало источника моего ящика на экране (например, 500 600), он по-прежнему всегда реагирует при нажатии на начальную точку (500 600), даже если мой ящик перемещается в другое положение.

Обновление: Я изменил свой способ перемещения окна за пределы экрана с помощью NSTimer, тогда он работает!

[UIView animateWithDuration:0.5f delay:0.3f options:UIViewAnimationOptionAllowUserInteraction animations:^{

        box.frame = CGRectMake(500,200,200,200);

    } completion:^(BOOL finished) {
        isShowMenubar = YES;
        //use NSTimer instead of delay
        [NSTimer scheduledTimerWithTimeInterval:3.0f target:self selector:@selector(hideBox) userInfo:nil repeats:NO];

    }]; 

и

-(void)hideBox {
[UIView animateWithDuration:0.5f delay:0.0f options:UIViewAnimationOptionAllowUserInteraction animations:^{
    box.frame = CGRectMake(500,-200,200,200);} completion:^(BOOL finished) {
        isShowMenubar = NO;
    }];
}

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Причина, по которой ящик не получает касания, связана с тем, как работает анимация.Ваш блок на самом деле за кадром, но визуально он проходит анимацию.

Даже если вы установите задержку равной 3,0, он все равно перемещает блок заранее (из-за того, что метод анимации все еще вызывается).Так что в вашем текущем коде, если вы нажали на поле (500, -200), оно получит касание.

Чтобы исправить это, используйте NSTimer или Grand Central Dispatch для задержки.

NSTimer:

[NSTimer scheduledTimerWithTimeInterval:3.0 target:self action:@selector(dismissBox) userInfo:nil repeats:NO];

Проблема с NSTimer заключается в том, что вам придется поместить этот код анимации в отдельный метод.

Grand Central Dispatch:

double delayInSeconds = 3.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [UIView animateWithDuration:0.5f animations:^{
        box.frame = CGRectMake(box.frame.origin.x, -200, 200,200);

    }completion:^(BOOL finished) {
        showing = NO;
    }];
});
0 голосов
/ 23 марта 2012

Я запустил код и тоже не увидел красный вид.Затем, немного поиграв, я понял, что ваш взгляд оживляет, но все еще находится за границами, поэтому вы никогда его не увидите.попробуйте изменить блок анимации на что-то вроде (источник кадра находится в левом нижнем углу)

box.frame = CGRectMake(100, 100, 200, 200);

и, надеюсь, он будет анимирован.

Кроме того, при условии, что вы запустите этив вашем контроллере представления правильный метод должен быть

[self.view addSubview:box];

надеюсь, это поможет

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