2013-02-20 55 views
1

我有用於iPad的選項卡式應用程序。在第一個標籤上,我有一個單獨的菜單,其中有一個指針,用於突出顯示當前活動的菜單按鈕點擊按鈕後,指針(一個UIImage)被動畫到位。回到頁面後動畫圖像位置不同返回頁面

問題是,當你離開高亮顯示的圖像上的任何按鈕,這不是原來的/默認按鈕,並移動到另一個選項卡中的應用程序,然後再回來,圖像已移回默認位置。但是,當您點擊另一個按鈕時,圖像朝錯誤的方向移動。我認爲這是因爲圖像後退了,但舊的座標被保留,或者相反?與直接在iPad上相比,它在模擬器中有點受挫,並且表現出不同的測試。

我想我需要開始與絕對座標,並與他們堅持整個過程。但是我無法理解如何用CGAffine函數實現它。

這裏是我當前的代碼

- (IBAction)diplayForm1:(id)sender { 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    buttonHighlightImage.transform = CGAffineTransformMakeTranslation(0, 0); 
    [UIView commitAnimations]; 

} 

- (IBAction)diplayForm2:(id)sender { 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    buttonHighlightImage.transform = CGAffineTransformMakeTranslation(0, 80); 
    [UIView commitAnimations]; 

} 

- (IBAction)diplayForm3:(id)sender { 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    buttonHighlightImage.transform = CGAffineTransformMakeTranslation(0, 160); 
    [UIView commitAnimations]; 

} 

編輯 - - -

@Mundi我想你的建議的代碼。我通過newFrame假設你的意思是定義一個新的UIImageView和屬性,我在.h(我稱之爲'sfh')中做了,然後在.m中使用@synthesize。

這是我在.M

-(void)viewWillAppear:(BOOL)animated { 

    // The "pointer" and the "old" frame are the same so I thought it pointless to do 
    // selectedFormHighlight.frame = selectedFormHighlight.frame; 

    // I tried anyway and also tried this and many other combinations 
    selectedFormHighlight.frame = sfh.frame; 

} 

-(void)viewDidAppear:(BOOL)animated { 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView animateWithDuration:0.3 animations:^{ 
     selectedFormHighlight.frame = CGRectMake(0,0,0,0); 
    }]; 
    [UIView commitAnimations]; 

} 

代碼當我運行這個動畫指針從屏幕(左上)和不回來。我已經嘗試了所有可能的組合,我可以在viewWillAppear和viewDidAppear中想到它,但它沒有任何區別。我嘗試刪除viewDidAppear中的其他行,它仍然執行相同的操作。

我認爲你建議在用戶從另一個屏幕返回時從原始(默認)位置的指針動畫。我不希望這樣,它應該簡單地留在他們沒有動畫的地方。或者至少在沒有意識到的情況下把它放回去。唯一的動畫是他們選擇在該視圖中點擊不同的按鈕。

回答

0

我感謝@Mundi的幫助,但無法讓它以這種方式工作。我最終得到了下面的代碼。

// This initially sets the frame with a variable value that 
// corresponds to the current child view 
-(void)viewDidAppear:(BOOL)animated { 
    selectedFormHighlight.frame = CGRectMake(0, self.getY, 250, 4100); 
} 

// Button actions (converted to a single action instead of one for each button) 
// This was done by referencing a tag added to each button (the button tags 
// match the children's tags) 
-(IBAction)goToForm:(id)sender { 
    UIButton *btn = (UIButton *)sender; 
    self.currentChild = self.formViewControllers[btn.tag]; 
    [UIView beginAnimations.nil context:NULL]; 
    [UIView animateWithDuration:0.3 animations:^{ 
     selectedFormHighlight.frame = CGRectMake(0, self.getY, 250, 4100); 
    }]; 
    [UIView commitAnimations]; 
    sfh.frame = selectedFormHighlight.frame; 
} 

// This returns the 'y' (vertical center position) of the pointer 
// frame for each of the child views 
-(int)getY { 
    switch(_currentChild.view.tag) { 
     case 1: 
      return -2005; 
      break; 
     case 2: 
      return -1925; 
      break; 
     default: 
      return -1845; 
      break; 
    } 
} 
0

您遇到這種情況的原因是當視圖隱藏並重新顯示時,實際視圖對象及其表示層會混淆。解決方案是更改視圖屬性而不是動畫化圖層。

因此,您不需要使用仿射變換。只需通過更改其framecenter直接設置指針視圖的新位置。

更先進的日期格式要做到這一點是基於塊的動畫:

[UIView animateWithDuration:0.5 animations:^{ 
    pointer.frame = newFrame; 
}]; 

而且,它似乎非常低效的有三種方法只是一個變量不同。你可以僅僅通過80

編輯繁殖所需的y位置:

另一個原因您的按鈕復位是因爲這是它當視圖被實例化被提。只需在您的視圖控制器的viewWillAppear中設置視圖的位置,然後將其動畫到viewDidAppear中的新位置。

+0

嗨@Mundi,對不起,我是新來的,你可以給我一些更多的信息。你如何製作一個框架?我嘗試了你的代碼,但是使用'buttonHighlightImage.center = CGPointMake(125,205)'的中心方法;'但它在返回頁面後仍然重置圖像位置。否則,你如何創建newFrame? – PaulMrG 2013-02-21 02:04:04

+0

我嘗試使用按鈕的中心作爲參考'buttonHighlightImage.center = CGPointMake(buttonHighlightImage.center.x,button1.center.y);'但它在返回到頁面後仍然重置。 – PaulMrG 2013-02-21 02:17:14

+0

看到我的編輯/除了答案。 – Mundi 2013-02-21 09:06:22