2013-02-23 3 views
1

У меня было огромное количество проблем, пытающихся анимировать UISearchBar, чтобы просто расширяться при редактировании, поэтому я решил предоставить решение всем, кому пришлось перенести эту проблему.Ширина анимации UISearchBar и AutoLayout

В анимации UISearchBar уже есть problems, и при смешивании с iOS AutoLayout проблемы еще больше возрастают. Если у вас были те же проблемы, я опубликовал решение ниже. Это может быть не идеально, но оно действительно работает.

+0

Вот как это достигается в быстром http://stackoverflow.com/a/29565613/2683201 –

ответ

1

После долгих проб и ошибок я получил его на работу, поворачивая функциональность AutoLayout прочь в XIb, а затем с помощью метода анимации ниже:

+(CAAnimationGroup *)changeView:(UIView *)view frameTo:(CGRect)frame{ 
CGRect oldFrame = view.frame; 

// /2.0 because size animation occurs from the anchor point which is set to (0.5,0.5) by default 
CGPoint oldOrigin = CGPointMake(oldFrame.origin.x+oldFrame.size.width/2.0, oldFrame.origin.y+oldFrame.size.height/2.0); 
CGPoint newOrigin = CGPointMake(frame.origin.x+frame.size.width/2.0, frame.origin.y+frame.size.height/2.0); 

CABasicAnimation *positionAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 

positionAnimation.fromValue = [NSValue valueWithCGPoint:oldOrigin]; 
positionAnimation.toValue = [NSValue valueWithCGPoint:newOrigin]; 
view.layer.position = newOrigin; 

CABasicAnimation *sizeAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"]; 

sizeAnimation.fromValue = [NSValue valueWithCGRect:oldFrame]; 
sizeAnimation.toValue = [NSValue valueWithCGRect:frame]; 
view.layer.bounds = frame; 

CAAnimationGroup *frameChangeAnimationGroup = [CAAnimationGroup animation]; 

frameChangeAnimationGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
frameChangeAnimationGroup.animations = [NSArray arrayWithObjects:positionAnimation,sizeAnimation, nil]; 

[view.layer addAnimation:frameChangeAnimationGroup forKey:@"frame"]; 

return frameChangeAnimationGroup;} 

Я надеюсь, что это помогает и спасает людей некоторые боли I пришлось пройти.