2010-04-22 2 views
23

Я хотел бы представить представление так же, как и UIAlertView - поп/весна. К сожалению, подклассификация UIAlertView не является вариантом для представления, которое мне нужно представить. Я написал какой-то код, но я не могу представить его реалистичным, как хотелось бы. Я был бы признателен за любые предложения по большей реалистичности или ссылке, если что-либо подобное было сделано (я ничего не нашел в Google). Спасибо.Создание анимации поп-музыки, аналогичной презентации UIAlertView

- (id)initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 

     self.backgroundColor = [UIColor whiteColor]; 

     v = [[UIView alloc] initWithFrame:CGRectMake(140, 140, 60, 60)]; 
     v.backgroundColor = [UIColor blueColor]; 

     [self addSubview:v]; 
     [self animate]; 

    } 
    return self; 
} 

- (void)animate { 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    [UIView setAnimationDuration:0.2]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(popStep1Complete)]; 
    v.frame = CGRectMake(90, 90, 140, 140); 
    [UIView commitAnimations]; 
} 

- (void)popStep1Complete { 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    [UIView setAnimationDuration:0.15]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(popStep2Complete)]; 
    v.frame = CGRectMake(110, 110, 100, 100); 
    [UIView commitAnimations]; 
} 

- (void)popStep2Complete { 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    [UIView setAnimationDuration:0.15]; 
    v.frame = CGRectMake(100, 100, 120, 120); 
    [UIView commitAnimations]; 
} 

ответ

77
- (void) attachPopUpAnimation 
{ 
    CAKeyframeAnimation *animation = [CAKeyframeAnimation 
     animationWithKeyPath:@"transform"]; 

    CATransform3D scale1 = CATransform3DMakeScale(0.5, 0.5, 1); 
    CATransform3D scale2 = CATransform3DMakeScale(1.2, 1.2, 1); 
    CATransform3D scale3 = CATransform3DMakeScale(0.9, 0.9, 1); 
    CATransform3D scale4 = CATransform3DMakeScale(1.0, 1.0, 1); 

    NSArray *frameValues = [NSArray arrayWithObjects: 
     [NSValue valueWithCATransform3D:scale1], 
     [NSValue valueWithCATransform3D:scale2], 
     [NSValue valueWithCATransform3D:scale3], 
     [NSValue valueWithCATransform3D:scale4], 
     nil]; 
    [animation setValues:frameValues]; 

    NSArray *frameTimes = [NSArray arrayWithObjects: 
     [NSNumber numberWithFloat:0.0], 
     [NSNumber numberWithFloat:0.5], 
     [NSNumber numberWithFloat:0.9], 
     [NSNumber numberWithFloat:1.0], 
     nil];  
    [animation setKeyTimes:frameTimes]; 

    animation.fillMode = kCAFillModeForwards; 
    animation.removedOnCompletion = NO; 
    animation.duration = .2; 

    [self.layer addAnimation:animation forKey:@"popup"]; 
} 
+0

Куда это уходит? В моем родительском представлении или моем UIAlertView? – Moshe

+0

Любой подкласс 'UIView'. В этом случае пользовательский класс UIAlertView. – zoul

+0

Во второй раз анимация не срабатывала, установив нулевой ключ, исправил проблему для меня: [self.view.layer addAnimation: animation forKey: nil]; – amleszk

5

одно: многоступенчатые анимации, как это намного проще, если использовать вместо него CAKeyframeAnimation из Mutiple UIView анимации в очереди.

+3

Спасибо, но не могли бы вы удалить свой ответ и включить его в качестве комментария, потому что этот вопрос теперь появляется как ответ. – RunLoop

+9

Нет, не буду, извините. Хотя я понимаю, что мой ответ - это не то, что вы хотели услышать, а лишь частичное решение, это IMO правильный ответ, потому что это гораздо лучший подход к проблеме, чем код, который вы опубликовали. –

7

указатель на сообщение отделителя является лучшим исходным, который я нашел. я предложил бы только для людей, пытающихся действительно мимических UIAlertView несколько вещей:

  1. добавляющие закругленные края, границы, и полупрозрачный слой цвета
  2. некоторые альфа увядает/отъезда, и
  3. переделка с блоками, как несколько более емким с последними IOS набора инструментов
  4. я также нашел исходную 1.1 горизонтального масштабирования он предполагает слишком большой, 1,05 казалось более правильным визуально мне в большинстве случаев

Код:

self.layer.cornerRadius = 10.0; 
[self.layer setMasksToBounds:YES]; 
self.layer.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent:0.60].CGColor; 
self.layer.borderColor = [UIColor whiteColor].CGColor; 
self.layer.borderWidth = 1.1; 
if (self.hidden == YES) { // swoop in if coming from hidden, otherwise pulse in-place 
    self.transform = CGAffineTransformMakeScale(0.6, 0.6); 
} 
self.hidden = NO; 
[UIView animateWithDuration:0.2 
       animations:^{ 
        self.transform = CGAffineTransformMakeScale(1.05, 1.05); 
        self.alpha = 0.8; 
       } 
       completion:^(BOOL finished){ 
        [UIView animateWithDuration:1/15.0 
            animations:^{ 
             self.transform = CGAffineTransformMakeScale(0.9, 0.9); 
             self.alpha = 0.9; 
            } 
            completion:^(BOOL finished) { 
             [UIView animateWithDuration:1/7.5 
                 animations:^{ 
                 self.transform = CGAffineTransformIdentity;                
                 self.alpha = 1.0; 
                 } 
             ]; 
            } 
        ]; 
       } 
]; 
Смежные вопросы