2010-01-25 1 views
19

Я пытаюсь потушить в UIView как подпункт моего основного вида. UIView, который я пытаюсь затухать, имеет размеры 320x55.Попытка исчезнуть в UIView без успеха

Я настраиваю вид и таймер;

secondView.frame = CGRectMake(0, 361, 320, 55); 
secondView.alpha = 0.0; 
[self.view addSubview:secondView]; 
[NSTimer scheduledTimerWithTimeInterval:.5 target:self selector:@selector(fadeView) userInfo:NO repeats:NO]; 

Таймер запускает следующий код;

secondView.alpha = 1.0; 
CABasicAnimation *fadeInAnimation; 
fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
fadeInAnimation.duration = 1.5; 
fadeInAnimation.fromValue = [NSNumber numberWithFloat:0.0]; 
fadeInAnimation.toValue = [NSNumber numberWithFloat:1.0]; 
[fadeInAnimation setDelegate:self]; 
[secondView.layer addAnimation:fadeInAnimation forKey:@"animateOpacity"]; 

My secondView подключен в Interface Builder и отвечает на другие сообщения, но я ничего не вижу на экране.

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

Thanks, Ricky.


В ответ на следующую рекомендацию:

Я немного неуверен здесь. Сначала я ставлю этот код в (потому что я вижу secondView как экземпляр UIView?):

[secondView beginAnimations:nil context:NULL]; 
[secondView setAnimationDuration:0.5]; 
[secondView setAlpha:1.0]; 
[secondView commitAnimations]; 

Затем я попробовал ваше предложение, которое не вызвало предупреждения или ошибки, но он по-прежнему делает ничего не приносит к поверхности:

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:0.5]; 
[secondView setAlpha:1.0]; 
[UIView commitAnimations]; 

Спасибо! Рики.


ответ

43

Вы должны быть в состоянии сделать это немного проще. Вы пробовали что-то вроде этого?

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:0.5]; 
[secondView setAlpha:1.0]; 
[UIView commitAnimations]; 
+0

Этот код выдает 3 предупреждения, все говорят, что UIView может не отвечать на сообщения. Это также приводит к сбою приложения. Почему это? – Ricky

+0

@ Рикки: Это странно. Вы используете iPhone SDK? – kennytm

+0

Вы можете опубликовать окружающий код? Когда я это делаю, он отлично компилируется. – kubi

11

Это не ответ на ваш вопрос, если вы настаиваете на использовании CoreAnimations, но iPhoneOS это намного проще в использовании анимации блоки для UIView анимации.

secondView.alpha = 0.0f; 
[UIView beginAnimations:@"fadeInSecondView" context:NULL]; 
[UIView setAnimationDuration:1.5]; 
secondView.alpha = 1.0f; 
[UIView commitAnimations]; 

Кроме того, вы можете вызвать делегат в замедленное время с

[self performSelector:@selector(fadeView) withObject:nil afterDelay:0.5]; 
+2

Вы можете избавиться от таймера все вместе, также вызывая UIView setAnimationDelay. например [UIView setAnimationDelay: 0.5] –

16

Мне кажется, что одна вещь, которую вам не хватает, заключается в том, что ваше представление может уже иметь альфа 1.0. убедитесь, что альфа - 0 (или все, что вы хотите, чтобы оно было) до вызова анимации.

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

secondView.alpha = 0.0f; 
[UIView animateWithDuration:1.5 animations:^() { 
    secondView.alpha = 1.0f; 
}]; 
+1

Чтобы уточнить собственный поток анимации, это основной поток. Изменения анимации отправляются с интервалом времени (продолжительность анимации). И примечание, всегда помните, чтобы вызвать методы «UIView animateWithDur ...» из основного потока. Поэтому, если этот вызов сделан из потока, отличного от основного, оберните его dispatch_asynch (dispatch_get_main_queue(),^{[UIView animateWithDur ...]}); –

+0

+1 для вашего представления может быть уже альфа 1.0. В этом случае, «анимируя» от 1.0 до 1.0, анимация заканчивается сразу же, а не после указанной продолжительности. Убедитесь, что на самом деле происходит изменение анимации. – pkamb

+0

@ GökhanBarışAker исправна в отношении пронизывания. большинство моих блоков находятся в их собственном потоке, и я говорил слишком рано. Я обновил сообщение. Спасибо что подметил это. – steveb

8

Здесь также есть хорошая альтернатива со многими вариантами и проста в использовании.

[secondViewController.view setAlpha:0.0]; 
    [UIView animateWithDuration:1.5 
      delay:0.0 
      options:UIViewAnimationOptionCurveEaseIn // See other options 
      animations:^{ 
      [secondViewController.view setAlpha:1.0]; 
     } 
     completion:^(BOOL finished) { 
     // Completion Block 
     }];