web-dev-qa-db-ja.com

個々のUIViewを反転する方法(親ビューを反転しないで)

これは、複数のサブビューを持つUIViewがあり、[UIView transitionFromView:toView:duration:options:completion]を使用してこのUIViewの1つをアニメーション化しようとしているiPadプロジェクトですが、このメソッドを実行すると、親ビュー全体が反転します!これは私が使用しているコードです:

UIView *secondView = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 300, 300)];
[newView setBackgroundColor:[UIColor redColor]];
    [UIView transitionFromView:self.firstView.view toView:secondView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil];

親ビュー全体をアニメーション化せずに、これらのビューを切り替えるにはどうすればよいですか?ありがとう!

21
DanMunoz

このコードはあなたを助けるかもしれません:

反転する2つのビューを同じサイズの名前のないビューの中に入れ、IBOutlet UIView *newView,*oldView;ビューに移動し、新しいビューを上に配置します

bool a = NO;

@implementation ViewController

- (IBAction)flip:(id)sender 
{
    if (a == NO) {
        [UIView transitionFromView:oldView toView:newView  
                  duration:1.0 
                  options:UIViewAnimationOptionTransitionFlipFromLeft 
                  completion:NULL];
        a = YES; // a = !a;
    }
    else {
        [UIView transitionFromView:newView toView:oldView  
                  duration:1.0 
                  options:UIViewAnimationOptionTransitionFlipFromLeft 
                  completion:NULL];
        a = NO; // a = !a;
    }
}
70
Floris497

これを機能させるのにも問題がありました。私はFlorisが作成したコードを使用しましたが、最初の「フリップ」では機能しましたが、次のフリップが奇妙になり始め、前面のUIビューのボタンとラベルの位置が失われました。

以下のコードを配置しましたが、正常に動作しています。

注意すべき点:

  1. panelViewは、ViewControllerのUIViewコントロールであり、その中に2つの他のUIViewがネストされています(サブビュー)。最初のものはfrontViewと呼ばれ、2番目のものはbackViewと呼ばれます。 (下の画像を参照)

image of the view and subviews in IB

  1. クラスにdisplayingFrontというboolプロパティがあります

(私の.hで)

@property BOOL displayingFront;

私の.m

@synthesize displayingFront;

私のviewDidLoadメソッドで

self.displayingFront = YES;

これは、前面と背面のUIViewsの場合、2つのボタンにリギングした.mのコードです...

- (IBAction)flip:(id)sender
{
    [UIView transitionWithView:self.panelView
                      duration:1.0
                       options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight :
                                UIViewAnimationOptionTransitionFlipFromLeft)
                    animations: ^{
                        if(displayingFront)
                        {
                            self.frontView.hidden = true;
                            self.backView.hidden = false;
                        }
                        else
                        {
                            self.frontView.hidden = false;
                            self.backView.hidden = true;
                        }
                    }

                    completion:^(BOOL finished) {
                        if (finished) {
                            displayingFront = !displayingFront;
                        }
                    }];
}
37
Steve Parker

コンテナービューを使用してサブビューを保持し、コンテナービューを、アニメーション化しようとしているサブビューと同じサイズにします。

したがって、このようにビューを設定できます。

self.view-> "a container view"->サブビュー

3
vipinagg
**//flipping view continuously**  



 bool a = NO;


-(void)viewDidLoad
{



// THIS is the canvass holding the two views this view is flipping
 UIView *v=[[UIView alloc]initWithFrame:CGRectMake(40, 40, 150, 150)];

   v.backgroundColor=[UIColor clearColor];

    [self.view addSubview:v];

     [v addSubview:yourfirstview];
     [v addSubview:yoursecondview];

// calling the method

[NSTimer scheduledTimerWithTimeInterval:2.0
                                     target:self
                                   selector:@selector(flip)
                                   userInfo:nil
                                    repeats:YES];

}



//flipping view randomly

-(void)flip 

{

if (a == NO) 
{

[UIView transitionFromView:yourfirstview toView:yoursecondview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL];
        a = YES;
    }

else if(a==YES) 
{

[UIView transitionFromView:yoursecondview toView:yourfirstview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL];
     a = NO;
  }

}
2
shankar

私は古い学校のアニメーションを使用してこの問題を修正しました:

[UIView beginAnimations:@"Flip" context:nil];
[UIView setAnimationDuration:1];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:firstView cache:YES];

[self addSubview:secondView];

[UIView commitAnimations];

さらに、firstViewを削除できます。

[firstView removeFromSuperview];
2
Calin Drule

Swift 4:-のスティーブパーカーの回答を更新したい

var displayBlankView:Bool = true

UIView.transition(with:flipView, duration:1.0, options:displayBlankView ? .transitionFlipFromLeft:.transitionFlipFromRight, animations:{
        if(self.displayBlankView){
            self.view1.isHidden=true
            self.view2.isHidden=false
        }else{
            self.view1.isHidden=false
            self.view2.isHidden=true
        }
    }, completion:{
        (finished: Bool) in
        self.displayBlankView = !self.displayBlankView;

    })
1