2012-01-10 2 views
3

Я могу представить себе большое количество вздохов, когда люди видят этот вопрос popup снова. Тем не менее, я прочитал много информации как здесь, так и в документации и через Google и до сих пор не нашел решения. Так что здесь ничего не происходит.Свойства iOS UIView не анимируются с CABasicAnimation

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

Это работает, когда я использую kCAFillModeForwards и устанавливаю removedOnCompletion в NO. Но, как сказано в другом потоке здесь, на SO, это, по-видимому, только визуально изменяет свойства, и фактическая позиция крана не изменяется. Поэтому, когда пользователь, по-видимому, нажимает поле ввода, iOS интерпретирует его как кран на фоне.

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

Методы делегатов по-прежнему вызываются, но вы не можете визуально видеть анимацию.

if([notification name] == UIKeyboardWillShowNotification) { 

    CGRect currBounds = self.loginTable.tableHeaderView.layer.bounds; 
    CGSize newSize = CGSizeMake(self.loginTable.tableHeaderView.bounds.size.width, 60); 
    CGPoint newPos = CGPointMake(self.loginTable.layer.position.x, self.loginTable.layer.position.x - 50); 


    //[CATransaction begin]; 
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds.size"]; 
    [animation setToValue:[NSValue valueWithCGSize:newSize]]; 
    [animation setDelegate:self]; 

    [self.loginTable.tableHeaderView.layer addAnimation:animation forKey:@"headerShrinkAnimation"]; 


    CABasicAnimation *formPosAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
    [formPosAnimation setToValue:[NSValue valueWithCGPoint:newPos]]; 
    [formPosAnimation setDelegate:self];   

    //formPosAnimation.removedOnCompletion = NO; 
    //formPosAnimation.fillMode = kCAFillModeForwards; 

    [self.loginTable.layer addAnimation:formPosAnimation forKey:@"tableMoveUpAnimation"]; 
    //[CATransaction commit]; 

    [self.loginTable.tableHeaderView.layer setBounds:CGRectMake(currBounds.origin.x, currBounds.origin.y, newSize.width, newSize.height)]; 
    [self.loginTable.layer setPosition:newPos]; 
} 

ответ

2

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

Главное было объединить почти все. Поэтому мне пришлось оставить removedOnCompletion и fillMode на моих анимациях, а также обновить позицию в моем методе animationDidStop. Он работает без установки двух параметров анимации, но в конце вы можете увидеть небольшое мерцание.

- (void)keyboardWillChange:(NSNotification *)notification { 
newSize = CGSizeZero; 
newPos = CGPointZero; 

if([notification name] == UIKeyboardWillShowNotification) { 
    newSize = CGSizeMake(self.loginTable.tableHeaderView.bounds.size.width, 60); 
    newPos = CGPointMake(self.loginTable.layer.position.x, self.loginTable.layer.position.x - 50); 
} else { 
    newSize = CGSizeMake(self.loginTable.tableHeaderView.bounds.size.width, 150); 
    newPos = CGPointMake(self.loginTable.layer.position.x, self.loginTable.layer.position.x + 50); 
} 

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds.size"]; 
[animation setToValue:[NSValue valueWithCGSize:newSize]]; 
[animation setDelegate:self]; 

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

[self.loginTable.tableHeaderView.layer addAnimation:animation forKey:@"headerShrinkAnimation"]; 

/*-----------------------------*/ 

CABasicAnimation *formPosAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
[formPosAnimation setToValue:[NSValue valueWithCGPoint:newPos]]; 
[formPosAnimation setDelegate:self];   

formPosAnimation.removedOnCompletion = NO; 
formPosAnimation.fillMode = kCAFillModeForwards; 

[self.loginTable.layer addAnimation:formPosAnimation forKey:@"tableMoveUpAnimation"]; 

}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { 
NSLog(@"Animation did stop"); 

CGRect currBounds = self.loginTable.tableHeaderView.layer.bounds; 

[self.loginTable.tableHeaderView.layer setBounds:CGRectMake(currBounds.origin.x, currBounds.origin.y, newSize.width, newSize.height)]; 
[self.loginTable.layer setPosition:newPos]; 

[self.loginTable.tableHeaderView.layer removeAnimationForKey:@"headerShrinkAnimation"]; 
[self.loginTable.layer removeAnimationForKey:@"tableMoveUpAnimation"]; 

}

Смежные вопросы