iOS — переворачивать анимацию только для определенного вида

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

- (void)flipCard:(id)sender {

    UIButton *btn=(UIButton *)sender;
    UIView *view=[btn superview];
    UIView *flipView=[[UIView alloc] initWithFrame:[view frame]];
    [flipView setBackgroundColor:[UIColor blueColor]];
    [[flipView layer] setCornerRadius:10];

    NSLog(@"Flip card : view frame = %f, %f",view.frame.origin.x, view.frame.origin.y);

    [UIView transitionFromView:view toView:flipView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL finished) {
    }];

}

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


person Andrea Mario Lufino    schedule 27.01.2012    source источник
comment
Возможно, это не прямое решение, но вы можете попытаться расширить UIButton для кнопок, которые вы использовали на картах, и иметь слабый указатель обратно на представление карты, поэтому вызов btn.cardView определенно даст вам представление карты, которую вы хотели , если супервью не работает.   -  person Ugur Kumru    schedule 27.01.2012


Ответы (3)


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

- (void)viewDidLoad {
    [super viewDidLoad];

    flipped = NO;
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];

    [flipContainerView addGestureRecognizer:tapGesture];
    [tapGesture release];
}

- (void)handleTap:(UITapGestureRecognizer *)sender {
    if (sender.state == UIGestureRecognizerStateEnded) {
        [UIView transitionWithView:flipContainerView
                          duration:1
                           options:UIViewAnimationOptionTransitionFlipFromLeft
                        animations:^{

            if (!flipped) {
                [frontCard setHidden:YES];
                [flipContainerView addSubview:backCard.view]; //or unhide it.
                flipped = YES;
            } else {
                [frontCard setHidden:NO];
                [backCard removeFromSuperview]; //or hide it.
            }

        } completion:nil];
    }
}
person carlos    schedule 30.01.2012
comment
Вы смешиваете методы setHidden и addSubview: это несовместимо, и один раз в контейнере будет одно подпредставление, а другой раз два подпредставления. Рекомендую придерживаться одной методики: либо и перед, и зад переключаются с помощью setHidden, либо и перед, и зад переключаются с помощью removeFromSuperview. - person Cœur; 16.04.2018

У меня такая же проблема. После поиска различных сообщений в Интернете я смог найти элегантное и простое решение. У меня есть карты как пользовательские UIButtons. В пользовательском классе UIButton я добавил метод, который меняет фоновое изображение с помощью флип-анимации:

-(void) flipCard{
    [UIView transitionWithView:self
                      duration:0.3f
                       options:UIViewAnimationOptionTransitionFlipFromRight|UIViewAnimationOptionCurveEaseInOut
                    animations:^{
                        if (self.isFlipped) {
                            [self setBackgroundImage:[UIImage imageNamed:@"card_back_2.png"] forState:UIControlStateNormal];
                        }else{
                            [self setBackgroundImage:[UIImage imageNamed:self.cardName] forState:UIControlStateNormal];
                        }
                    } completion:NULL];
    self.isFlipped = !self.isFlipped;
}

Надеюсь, это поможет кому-то еще, так как первый ответ уже принят

ОБНОВЛЕНИЕ

Если вы находитесь в представлении, содержащем это подпредставление, код:

-(void)flipCard:(APCard*)card{
    [UIView transitionWithView:card
                      duration:kFlipTime
                       options:UIViewAnimationOptionTransitionFlipFromRight|UIViewAnimationOptionCurveEaseInOut
                    animations:^{
                        if (card.isFlipped) {
                            [card setBackgroundImage:[UIImage imageNamed:@"card_back_2.png"] forState:UIControlStateNormal];
                        }else{
                            [card setBackgroundImage:[UIImage imageNamed:card.cardName] forState:UIControlStateNormal];
                        }
                    completion:^(BOOL finished) {
                         if (finished) {
                             //DO Stuff
                         }
                     }
    ];
    card.isFlipped = !card.isFlipped;
}
person Sanandrea    schedule 15.07.2013

Мой вариант использования в Swift 4:

@IBAction func flipCard() {
                let transitionOptions: UIView.AnimationOptions = [.transitionFlipFromRight, .showHideTransitionViews]

        UIView.transition(with: letterView, duration: 1.0, options: transitionOptions, animations: {
            if self.showingBack == true {
                self.letterImage.image = UIImage.init(named: self.letterImageName + ".png")
                self.letterNameLabel.text = self.regularWord
                self.showingBack = false
            } else {
                self.letterImage.image = UIImage.init(named: self.letterImageName + "C.png")
                self.letterNameLabel.text = self.cursiveWord
                self.showingBack = true
            }
        })
    }
person ICL1901    schedule 02.01.2019