2010-08-30 42 views
20

我正在嘗試在兩個子視圖(view1和view2)之間創建一個過渡。當按下按鈕時,我希望view1(前)翻轉並顯示view2(後退)。我已經嘗試了transitionFromView和transitionWithView。每個都有效 - 但每個都有問題。使用transitionFromView和transitionWithView的過渡行爲

transitionFromView - 翻轉超視圖(整個窗口視圖翻轉,而不是子視圖)。當這個翻轉發生時 - 一個子視圖在翻轉之前在超視圖的前面,而另一個子視圖在翻轉的後面 - 就像它應該是的。但我不想讓superview翻轉,只是子視圖。

transitionWith查看 - 僅翻轉子視圖 - 但在轉換髮生之前顯示「to」視圖。

任何人有一個建議?

-(IBAction) button1action:(id) sender { 

if ([sender tag] == 0) { 

    [UIView transitionFromView:view2 toView:view1 duration:2.0 
    options:UIViewAnimationOptionTransitionFlipFromLeft 
    completion:nil]; 
} 

else { 
    [view1 removeFromSuperview];  
    [self.view addSubview:view2]; 
    [UIView transitionWithView:view2 
    duration:2.0 
    options:UIViewAnimationOptionTransitionFlipFromRight + 
    UIViewAnimationOptionShowHideTransitionViews 
     animations:^{} 
    completion:nil]; 
} 
} 
+4

請在下面標記一個問題作爲答案,或者輸入自己的解答您的問題以幫助社區的答案。 – Sam 2011-08-30 21:28:20

+0

他爲什麼要將問題標記爲答案? :D – 2016-06-08 09:20:32

回答

26

您需要刪除並在動畫塊中添加子視圖。另外,我認爲transitionWithView應該將超級視圖作爲參數。我認爲你需要做的就是使用與你想翻轉的視圖大小相同的容器視圖。

這是從文檔裏複製過來:

[UIView transitionWithView:containerView 
     duration:0.2 
     options:UIViewAnimationOptionTransitionFlipFromLeft 
     animations:^{ [fromView removeFromSuperview]; [containerView addSubview:toView]; } 
     completion:NULL]; 
+0

這似乎沒有工作 – jjxtra 2012-10-31 19:13:57

+1

容器視圖是關鍵。這是測試和工作在ios6和ios7 – Jameo 2014-01-26 00:10:05

12

我遇到了這個確切同樣的問題,我與先前的答案達成一致。看起來你必須有一個容器視圖來動畫化從一個子視圖到另一個子視圖的轉換。

我正在使用transitionFromView方法。要在動畫背後創建背景,您還需要使用超級視圖和容器視圖的背景。

我的代碼如下所示:

[UIView transitionFromView:view1 
         toView:view2 
         duration:0.5 
         options:UIViewAnimationOptionTransitionFlipFromRight | 
           UIViewAnimationOptionAllowUserInteraction | 
           UIViewAnimationOptionBeginFromCurrentState 
        completion:nil]; 
1

我有同樣的要求,看到許多方法 - 使用層(如果你只是想處理一個UIView這最終很複雜),以建議,我需要一個「容器」然後轉換到子視圖。但是如果你只是想從頭到尾交換一些東西,比如翻轉一張紙牌或一個遊戲圖塊,我做了一個換行:

(注意:我有一個UIViews數組(tile [x] [y ])在一個網格中(對於一個遊戲)我有我的所有圖像文件名在數據庫表/數組中,這些數據庫動態地加載到UIImageView的UIImage中UIImage中名爲「 tileBackPicImageNM」

,所以我的代碼,簡單地交換了正面圖像出來後的圖像是:。

[tiles[indexX][indexY] setImage:[UIImage imageNamed:tileBackPicImageNM]]; 

工作正常

但現在,展現翻轉的動作,那就是:

[UIView transitionWithView:tiles[indexX][indexY] duration:0.3 options:UIViewAnimationOptionTransitionFlipFromLeft 
        animations:^{ 
         [[indexX][indexY] setImage:[UIImage imageNamed:tileBackPicImageNM]]; 
        } 
        completion:NULL];  

我嘗試了不同的「持續時間」參數 - 隨後做它,我在viewDidLoad中常規設置浮動。比0.3更快幾乎不可見,1或2的值非常慢

這不涉及兩個子視圖,這是我的情況是更有用的,因爲我不想有一個包含視圖層次結構的容器數組等等...和新的水平等我總是重新加載陣列......

5

遇到同樣的問題我同意埃裏克和山姆: 無論是transitionWithView或transitionFromView都將做你想要的東西,只要你創建一個合適的容器視圖大小,你想翻轉。否則整個窗口視圖將翻轉。

所以,如果廠景是你開始與子視圖,你想翻轉視圖2再加入

UIView *containerView = [[UIView alloc] initWithFrame:appropriateSize]; 
[containerView addSubview:view1]; 

然後以動畫的最簡單的方法可能是:

[UIView transitionFromView:view1 
        toView:view2 
        duration:2.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
       completion:nil]; 
7

這是我工作的解決方案存根,一個簡單的事情,花了2個小時,該死的: 我們有1個按鈕來翻轉東西,一個叫做面板的UIView,它擁有我想用翻轉動畫交換的2個視圖。

-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    UIButton *btnFlip = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    btnFlip.frame = CGRectMake(10, 10, 50, 30); 
    [btnFlip setTitle:@"flip" forState:UIControlStateNormal]; 
    [btnFlip addTarget:self action:@selector(flip) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:btnFlip]; 

    panel = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 300,300)]; 
    panel.backgroundColor = [UIColor darkGrayColor]; 
    [self.view addSubview:panel]; 

    panelBack = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 280, 200)]; 
    panelBack.tag = 1; 
    panelBack.backgroundColor = [UIColor brownColor]; 
    [panel addSubview:panelBack]; 

    panelFront = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 280, 200)]; 
    panelFront.tag = 2; 
    panelFront.backgroundColor = [UIColor whiteColor]; 
    [panel addSubview:panelFront]; 

    displayingFront = TRUE; 
} 

-(void)flip{ 

    [UIView transitionWithView:panel 
    duration:0.5 
    options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight : UIViewAnimationOptionTransitionFlipFromLeft) 
    animations:^{ 
     if (displayingFront) { 
      //panelFront.hidden=TRUE; 
      //panelBack.hidden = FALSE; 
      [panelFront removeFromSuperview]; 
      [panel addSubview:panelBack]; 
     }else{ 
      //panelFront.hidden=FALSE; 
      //panelBack.hidden = TRUE; 
      [panelBack removeFromSuperview]; 
      [panel addSubview:panelFront]; 
     } 
    } 
    completion:^(BOOL finished){ 
     displayingFront = !displayingFront; 
    }]; 
} 
+0

酷......完美的作品 – RATTLESNAKE 2013-04-12 14:40:45

0

請記住,容器視圖需要一個堅實的背景color.It意味着什麼比透明color.This別人是我的錯誤,花了相當長的時間來弄明白。

0

使用transitionFromView時,前視圖和後視圖都應位於另一個視圖(而不是超視圖)內。這樣它不會翻轉整個屏幕。

> superview 
>  another view 
>  backview 
>  frontview 

UIView.transitionFromView(FrontView中,toView:backView,持續時間:0.5,選擇:.TransitionFlipFromLeft | .ShowHideTransitionViews){在

完成}

你可能想使(另一種觀點)等於frontview的大小