Как выполнить преобразование и изменение кадра в UIView - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь создать анимацию, в которой вид выглядит так, как будто он появляется у вас.«Вариант анимации 1» - это именно то, как я хочу, чтобы эффект выглядел, но выполняя преобразование до смены кадра, портит кадр (после view.transform=CGAffineTransformIdentity; кадр видов не соответствует исходному размеру).«Вариант анимации 2» - своего рода идея, но выглядит плохо.Любая идея, как я могу сделать преобразование и изменить рамку представления?

//ANIMATION OPTION 1
CGRect frame=view.frame;
view.transform=CGAffineTransformMakeScale(0.94f, 0.94f);

frame.origin.y=10.0f; //The view is originally off screen, this is to show
[UIView animateWithDuration:0.2f animations:^{
    [view setFrame:frame];
}completion:^(BOOL finished){
    [UIView animateWithDuration:0.2f animations:^{
        view.transform=CGAffineTransformIdentity;//This pops the view up
    }];
}];



//ANIMATION OPTION 2
CGRect frame=view.frame;
frame.size.width=296;
frame.size.height=296;
frame.origin.x=8;
frame.origin.y=8;

[UIView animateWithDuration:0.2f animations:^{
    [view setFrame:frame];
}completion:^(BOOL finished){
     CGRect frame=view.frame;
     frame.size.width=300;
     frame.size.height=300;
     frame.origin.x=10;
     frame.origin.y=10;
    [UIView animateWithDuration:0.2f animations:^{
        [view setFrame:frame];
    }];
}];

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Благодаря @ agibson007 Это был последний эффект, который я искал:

[view setFrame:CGRectMake(8, 10, WIDTH-16, height)];
view.transform = CGAffineTransformConcat(CGAffineTransformMakeScale(0.94, 0.94), CGAffineTransformMakeTranslation(0, -height));


[UIView animateWithDuration:0.2f delay:0 options:(UIViewAnimationOptionCurveEaseInOut) animations:^{
    view.transform = CGAffineTransformConcat(CGAffineTransformMakeScale(0.94, 0.94), CGAffineTransformMakeTranslation(0, 0));
}completion:^(BOOL finished) {
    [UIView animateWithDuration:0.2f delay:0 options:(UIViewAnimationOptionCurveEaseInOut) animations:^{
        view.transform=CGAffineTransformIdentity;
    }];
}];
0 голосов
/ 11 октября 2018

Вы изменяете фрейм после преобразования, поэтому идентификация не работает в преобразовании.Вместо изменения x и y используйте перевод в UIView.Моя цель с ржавая, но посмотрим, о чем ты думаешь.Я задерживаю его, чтобы вы могли видеть начальную и конечную позиции. Кроме того, плюсы использования перевода вместо манипулирования фреймом заключаются в том, что если вы используете AutoLayout, вы не портите фрейм.

#import "ViewController.h"

@interface ViewController ()
    @property UIView *testView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _testView =  [[UIView alloc]init];
    [_testView setFrame:CGRectMake(20, 100, self.view.bounds.size.width - 40, 100)];
    [_testView setBackgroundColor:[UIColor greenColor]];
    [self.view addSubview:_testView];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    //just delaying it so you can see the start position
    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        //code to be executed on the main queue after delay
        self.testView.transform = CGAffineTransformConcat(CGAffineTransformMakeScale(0.94, 0.94), CGAffineTransformMakeTranslation(0, 10));
        self.testView.alpha = 0;
        [UIView animateWithDuration:1 delay:2 options:(UIViewAnimationOptionCurveEaseInOut) animations:^{
            self.testView.transform=CGAffineTransformIdentity;//This pops the view up
            self.testView.alpha = 1;

        } completion:^(BOOL finished) {

        }];

    });
}


@end
...