UIView transitionWithView не работает - PullRequest
       44

UIView transitionWithView не работает

8 голосов
/ 01 октября 2011

Вот viewDidLoad из контроллера основного представления в тестовом проекте:

- (void)viewDidLoad

{[super viewDidLoad];

UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 300, 300)];
[self.view addSubview:containerView];

UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
[redView setBackgroundColor:[UIColor redColor]];
[containerView addSubview:redView];

UIView *yellowView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
[yellowView setBackgroundColor:[UIColor yellowColor]];


[UIView transitionWithView:containerView duration:3
                   options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
                       [redView removeFromSuperview];
                       [containerView addSubview:yellowView];
                   }
                completion:NULL];
}

Желтое поле только появляется.Там нет анимации, независимо от того, какой UIViewAnimationOption я пытаюсь.Почему ???

РЕДАКТИРОВАТЬ: я также пытался использовать executeSelector сDelay, чтобы переместить анимацию из viewDidLoad и в другой метод.Тот же результат - без анимации.

Также пробовал это: [UIView transitionFromView: redView toView: yellowView длительность: 3 варианта: UIViewAnimationOptionTransitionFlipFromLeft завершение: NULL];

Тем не менее, желтый вид только появляется.Без анимации.

Ответы [ 2 ]

6 голосов
/ 18 октября 2012

После некоторого тестирования кажется, что вы не можете создать контейнерное представление и настроить анимацию в пределах одного цикла выполнения и заставить вещи работать.Чтобы ваш код работал, я сначала создал containerView и redView в методе viewDidLoad.Затем я поместил вашу анимацию в метод viewDidAppear.Чтобы я мог ссылаться на containerView и redView из метода viewDidAppear, я сделал их свойства.Вот код для ST_ViewController.m файла, который будет выполнять желаемую анимацию.

@interface ST_ViewController ()
@property (nonatomic, strong) UIView *containerView;
@property (nonatomic, strong) UIView *redView;
@end

@implementation ST_ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setContainerView:[[UIView alloc] initWithFrame:CGRectMake(10, 10, 300, 300)]];
    [[self view] addSubview:[self containerView]];

    [self setRedView:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)]];
    [[self redView] setBackgroundColor:[UIColor redColor]];
    [[self containerView] addSubview:[self redView]];
}

-(void)viewDidAppear:(BOOL)animated{

    [super viewDidAppear:animated];



    UIView *yellowView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
    [yellowView setBackgroundColor:[UIColor yellowColor]];


    [UIView transitionWithView:[self containerView]
                      duration:3
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    animations:^(void){
                        [[self redView] removeFromSuperview];
                        [[self containerView] addSubview:yellowView];
                         }

                    completion:nil];

}

@end
1 голос
/ 01 октября 2011

Не помещайте это в viewDidLoad.viewDidLoad вызывается, когда представление полностью загружено в память, но еще не отображается на экране.

Попробуйте вставить приведенный выше код в viewDidAppear:, который вызывается, когда представление появилось на экране.

Редактировать: примечание, если executeSelector: withDelay: что-то исправляет, это означает, что вы пытаетесь сделать эту вещь неправильно.Вам нужно как-то рефакторинг.executeSelector: withDelay: неправильный способ решения проблем в 99,999% случаев.Как только вы поместите этот код на другое скоростное устройство (новый iPhone, старый iPhone), он испортится.

...