2013-08-13 2 views
14

Я работаю над UIButton анимации, где:IOS перевод и масштаб анимации

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

_menuBtn.transform = CGAffineTransformMakeScale(0.1f, 0.1f); 

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

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _menuBtn.frame = CGRectMake(160, 513, 30, 30); 
    _menuBtn.superview.frame = CGRectMake(160, 513, 30, 30); 

    _menuBtn.transform = CGAffineTransformMakeScale(0.1f, 0.1f); 
    NSLog(@"_menuBtn: %@ ; _menuBtn.superview: %@", _menuBtn, _menuBtn.superview); 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDuration:5]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    CGAffineTransform scaleTrans = CGAffineTransformMakeScale(1.0f, 1.0f); 
    CGAffineTransform lefttorightTrans = CGAffineTransformMakeTranslation(-200.0f,0.0f); 
    _menuBtn.transform = CGAffineTransformConcat(scaleTrans, lefttorightTrans); 
    [UIView commitAnimations]; 

} 

проблема

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

Вход Результат

NSLog(@"%@", _myBtn); 

2013-08-14 09:22:38.913 GJCoolNavi[339:c07] <UIButton: 0x813ea30; frame = (0 0; 0 0); opaque = NO; autoresize = TM+BM; layer = <CALayer: 0x813eaf0>> 

Thats, прежде чем делать анимацию ... и результат после анимации:

2013-08-14 09:30:25.719 GJCoolNavi[612:c07] <UIButton: 0x71206d0; frame = (160 294; 0 0); opaque = NO; autoresize = TM+BM; animations = { transform=<CABasicAnimation: 0x7536a80>; position=<CABasicAnimation: 0x7537dd0>; }; layer = <CALayer: 0x7120790>> 
+1

Моя первая мысль может быть неактуальной для темы, но почему вы не использовали блочную анимацию, как рекомендует Apple на iOS4 или выше? – holex

+0

Первое, что я подумал. Это в моем ответе, видимо, это все еще не работает. Все еще пытаюсь понять, что происходит и почему. – Fogmeister

ответ

18

Почему бы вам не сделать это ...

_menuBtn.transform = CGAffineTransformMakeScale(0.1, 0.1); 

[UIView animateWithDuration:5.0 
options:UIViewAnimationOptionCurveEaseOut 
animations:^(){ 
    _menuBtn.transform = CGAffineTransformMakeScale(1.0, 1.0); 
    _menuBtn.center = self.view.center; 
} 
completion:nil]; 

Я бы не стал перемещать вещи с помощью преобразования. Вместо этого измените рамку.

EDIT

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    // for convenience I'm pulling these values out in to variables. 
    float buttonWidth = _menuBtn.frame.size.width; 
    float buttonHeight = _menuBtn.frame.size.height; 
    float viewWidth = self.view.frame.size.width; 
    float viewHeight = self.view.frame.size.height; 

    // set the button frame to be the bottom center 
    // note you shouldn't have to do this as Interface Builder should already place it there. 
    // place the button in the horizontal center and 20 points from the bottom of the view. 
    _menuBtn.frame = CGRectMake((viewWidth - buttonWidth) * 0.5, viewHeight - buttonHeight - 20, buttonWidth, buttonHeight); 

    // scale the button down before the animation... 
    _menuBtn.transform = CGAffineTransformMakeScale(0.1, 0.1); 

    // now animate the view... 
    [UIView animateWithDuration:5.0 
          delay:0.0 
         options:UIViewAnimationOptionCurveEaseOut 
        animations:^{ 
         _menuBtn.transform = CGAffineTransformIdentity; 
         _menuBtn.frame = CGRectMake(viewWidth - buttonWidth - 20, viewHeight - buttonHeight - 20, buttonWidth, buttonHeight); 
        } 
        completion:nil]; 
} 

Попробуйте это и дайте мне знать, что происходит.

+0

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

+8

Что случилось с использованием преобразования? –

+0

Я создал кнопку в раскадровке. и поместили его в нижний центр экрана. –

1

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

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    _menuBtn.superview.frame = CGRectMake(0, 513, 320, 30); // This is a quick and dirty solution to make sure your button's superview is in the right place. You probably don't want to do this and are more likely to review your view hierarchy. 
    _menuBtn.frame = CGRectMake(145, 0, 30, 30); // Set the frame to the bottom center, please ensure that _menuBtn's transform hasn't been changed before this step 
    _menuBtn.transform = CGAffineTransformMakeScale(0.1f, 0.1f); 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDuration:5]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    CGAffineTransform scaleTrans = CGAffineTransformMakeScale(1.0f, 1.0f); 
    CGAffineTransform lefttorightTrans = CGAffineTransformMakeTranslation(-200.0f,0.0f); 
    _menuBtn.transform = CGAffineTransformConcat(scaleTrans, lefttorightTrans); 
    [UIView commitAnimations]; 
} 
+0

Я следую тому, что вы предложили, установив рамку на нижний центр. Но все же при применении _CGAffineTransformMakeTranslation_ кнопка все еще начинает анимацию с нижней правой стороны, а не из нижнего центра ... –

+0

Причина, по которой я мог думать может быть, что контроль над вашей кнопкой также находится в неправильном положении. Перед блоком анимации проверьте свою кнопку и ее рамки надзора. Вы можете распечатать журнал чуть ниже '_menuBtn.transform = CGAffineTransformMakeScale (0.1f, 0.1f);', например: 'NSLog (@" _ menuBtn:% @; _menuBtn.superview:% @ ", _menuBtn, _menuBtn.superview) ; ' – liuyaodong

+0

Я установил надстройку кнопки, но все равно не сделал никакого эффекта. После того, как я установил супервизор, это то, что показывает журнал: ' 2013-08-14 15: 16: 52.686 GJCoolNavi [12708: c07] _menuBtn : >; _menuBtn.superiew: > ' Я печатаю журнал до начала анимации. –

0

Я использовал ваш код и его перемещение от нижнего центра до нижнего левого края. Возможно, ваш контроль не в правильном направлении. Пожалуйста, проверьте.

6

Это решило аналогичную проблему.

Применить анимацию (UIButton) .imageView.

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDuration:5]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
CGAffineTransform scaleTrans = CGAffineTransformMakeScale(1.0f, 1.0f); 
CGAffineTransform lefttorightTrans = CGAffineTransformMakeTranslation(-200.0f,0.0f); 
_menuBtn.imageView.transform = CGAffineTransformConcat(scaleTrans, lefttorightTrans); 
[UIView commitAnimations]; 
+0

СПАСИБО !!! Это единственное решение, которое сработало для меня, и оно работает БЕСПЛАТНО !!! – Serzhas