2009-10-26 42 views
9

我正在尋找一種方法來在iPhone上執行UIViewAnimationTransitionCurlUpUIViewAnimationTransitionCurlDown轉換,而不是從上到下,從左到右(或橫向模式下的上/下)執行此操作。我曾多次看到這個問題,但沒有一個答案能夠得到答案。但我覺得這是可行的。iPhone Curl Left和Curl右轉換

我試過改變View的轉換和view.layer的轉換,但是這並沒有影響轉換。由於當設備改變方向時轉換改變了,我認爲有一種方法可以讓設備在縱向模式下使用橫向轉換,反之亦然?

回答

4

我實際上設法通過改變我的UIViewController的方向來實現這種效果。奇怪的是,當我的控制器無法工作時,我的控制器在另一個控制器中工作,但是當我將他設置爲即時視圖控制器時,它工作正常。

,做它代碼:

在一個UIViewController這是在我的應用程序代理的主視圖控制器,只允許橫向(如下面的第二個方法看)我有以下幾點:

-(void)goToPage:(int)page flipUp:(BOOL)flipUp { 

    //do stuff... 

    // start the animated transition 
    [UIView beginAnimations:@"page transition" context:nil]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationTransition:flipUp ? UIViewAnimationTransitionCurlUp : UIViewAnimationTransitionCurlDown forView:self.view cache:YES]; 

    //insert your new subview 
    //[self.view insertSubview:currentPage.view atIndex:self.view.subviews.count]; 

     // commit the transition animation 
     [UIView commitAnimations]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 
+0

狀態欄怎麼樣? - 狀態欄會顯示在右側 - 使用應用程序時? – 2010-05-21 05:19:23

+3

這似乎不起作用。 – adib 2010-10-08 06:07:31

+0

請確保您的視圖控制器沒有嵌套,或者確保其父母正在實施正確的方向... – Dimitris 2010-10-10 22:47:14

0

我不認爲有超出編寫自定義動畫的方法。

更重要的是,你可能不應該嘗試它。捲曲和捲曲是用戶界面語法的一部分,它告訴用戶視圖正在提升或放在現有視圖上。它應該像一個粘滯便箋被放下然後去掉。左< - >右捲曲最有可能被解釋爲像撕掉書中的頁面之類的東西。它會混淆用戶。

每當你發現自己試圖在標準API不易做的界面上做些事情時,你應該問自己,這樣一種新穎的方法是否會向用戶傳達重要的東西,以及它是否與現有的界面語法相似。如果沒有,那麼你不應該打擾。

不尋常的界面有一個最初的哇因素,但他們導致沮喪和日常使用中的錯誤。他們也可能會導致蘋果拒絕您的應用程序。

+0

這並不罕見。完全一樣。事實上,蘋果公司就是這麼做的,只是方向相反。我正在創建一個交互式的風景書,所以我很肯定這個動畫會把這本書感覺傳達給用戶。上下效果適用於筆記本(如筆記應用程序)。但對於一本適當的書我需要一種不同的感覺。 – Dimitris 2009-10-26 17:28:41

+0

如果你看看捲曲過渡,你會看到它分離了視圖的三個角落。翻頁只分離兩頁。卷頁沿對角方向移動視圖,而頁面僅從左向右移動。這種差異很微妙,但對用戶的期望很重要。 – TechZen 2009-10-26 18:23:20

+2

我不認爲你可以通過簡單的變換獲得想要的變換,因爲捲曲變換中的主要運動是右下角的對角運動。無論你如何旋轉或改變視圖,對角線運動都將保留下來,這將破壞簡單的從左到右捲曲的幻覺。 – TechZen 2009-10-26 18:26:19

9

通過使用容器視圖可以在四個方向中的任何一個方向上捲曲。將容器視圖的到你想要的角度變換,然後通過添加視圖容器視圖,而不是你的應用程序的主視圖不具有變換的幀做捲曲:

NSView* parent = viewController.view; // the main view 
NSView* containerView = [[[UIView alloc] initWithFrame:parent.bounds] autorelease]; 
containerView.transform = CGAffineTransformMakeRotation(<your angle here, should probably be M_PI_2 * some integer>); 
[parent addSubview:containerView]; 

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:containerView cache:YES]; 
[containerView addSubview:view]; 
[UIView commitAnimations]; 
+0

您添加到containerView的視圖是什麼?@fluXa – 2014-08-24 15:14:39

2

我也掙扎與此有關。爲了讓curl來自右側或左側,您可以創建中間視圖並對其進行轉換。所以,讓我們說你轉移(MyView的)的觀點是主窗口(parentView)的孩子:

-parentView 
-->myView 

你會插入之間的中間視圖(Interface Builder中很容易做到):

-parentView 
-->containerView 
--->myView 

然後,使用下面的代碼翻轉離開容器90度和過渡視圖90度右:

containerView.transform = CGAffineTransformMakeRotation(-M_PI_2); 
myView.transform = CGAffineTransformMakeRotation(M_PI_2); 

MyView的仍然會出現直立的用戶,但該過渡將認爲這是從左側90度施加。

請注意,這取決於如何自動縮放你的意見,你可能有應用該變換後修正框的大小,如

containerView.frame = CGRectMake(0.0, 0.0, 768.0, 1024.0); 
    myWebView.frame = CGRectMake(0.0, 0.0, 768.0, 1024.0); 

希望這有助於。這是最接近你可以得到UIViewAnimationTransitionCurlLeft和UIViewAnimationTransitionCurlRight。

+0

優秀的答案!你的食譜就像一個魅力。 – Bram 2011-10-25 04:40:20

2

我試過在iOS5上使用fluXa的解決方案(所以我不得不使用[UIView trans ......]),但它不起作用:捲曲仍然向上或向下。顯然,過渡現在不考慮視圖的轉換。所以如果有人想要在iOS5上做同樣的技巧,解決方案是在其間添加另一個容器,並從那裏爲其創建動畫。

這是我的代碼,這是有點特定的,因爲我想向左捲曲'向上',但是下角部捲曲。就好像我在撕掉一本筆記本中的一頁。

UIView* parent = self.view; // the main view 
CGRect r = flipRectSize(parent.bounds); 
UIView* containerView = [[UIView alloc] initWithFrame:r]; 
CGAffineTransform t = CGAffineTransformMakeRotation(-M_PI_2); 
t = CGAffineTransformTranslate(t, -80, -80); 
containerView.transform = CGAffineTransformScale(t, -1, 1); 
[parent addSubview:containerView]; 

UIView* container2 = [[UIView alloc] initWithFrame:r]; 
[containerView addSubview:container2]; 

UIImageView* v = [[UIImageView alloc] initWithFrame:r]; 
v.image = [UIImage imageWithCGImage:contents.CGImage scale:contents.scale orientation:UIImageOrientationLeftMirrored]; 
[container2 addSubview:v]; 

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.001 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
    [UIView transitionWithView:container2 
         duration:DURATION_CURL_ANIMATION 
         options:UIViewAnimationOptionTransitionCurlUp 
        animations:^{ 
         [v removeFromSuperview]; 
        } completion:^(BOOL finished) { 
         if (completion) { 
          completion(finished); 
         } 
         [containerView removeFromSuperview];}];}); 

注:

  1. 我必須承認,仿射變換翻譯(80,80)在我的腦海裏沒有任何意義,但它是必要的iphone,恐怕也不會在工作iPad兼容。
  2. flipSizeRect翻轉一個矩形的寬度和高度(你已經知道了吧?)
  3. dispatch_after是必需的,因爲我添加了容器,然後想從層次結構中刪除一個視圖。如果我離開派遣沒有動畫。我最好的猜測是,我們首先需要讓系統進行佈局傳遞,然後才能對刪除進行動畫處理。