2015-11-11 45 views
1

這個相關的SO question的確顯示了類似的問題,但我提供的答案並沒有解決我的問題。UIBarButtonItem刷新動畫是偏移量

我有一個刷新按鈕,當它被點擊時動畫。這是一個的UIBarButtonItem,在故事板創建和我用來創建圖像:

enter image description here

AFAIK - 圖像是方形的,並描繪出的圓的中心和真實。

當我點擊我把這個動畫代碼的圖像:

#define DEGREES_TO_RADIANS(angle) ((angle)/180.0 * M_PI) 
- (void)animateRefreshButton; 
{ 
    UIBarButtonItem *item = self.refreshButton; 
    UIView *view = [item valueForKey:@"view"]; 

    [UIView animateWithDuration:0.5 delay:0.3 options:UIViewAnimationOptionCurveEaseInOut animations:^
    { 
     view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(180)); 
    } completion: ^(BOOL finished) 
    { 
     view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(0)); 

    }]; 
} 

但是動畫「跳躍」,它也影響稱號。見GIF:

enter image description here

我已經嘗試了不少東西,但上面的視頻是關於最好的動畫我能到。我試過的東西包括:

  • 將圖像添加到按鈕的自定義視圖中並對其進行動畫處理。
  • 調整用圖像的插圖(但它的每一個裝置和旋轉上不同)
  • 調整圖像本身的大小,以導航欄「把它變成」匹配大小 ,約50x30
  • 施加不同的動畫塊試圖掩蓋「跳躍」(可怕的)

如果有人有類似的問題,解決它,然後任何指針將是巨大的

而且,如果我錯指導與技術我使用請讓我知道。

我沒有檢查圖像,它似乎好,但有人可能會知道更好。

+0

其實,我沒有看到這個問題在您的視頻:有0.3秒時,圖像的點擊後的初始延遲在1/2秒內旋轉180度,標題不變。那麼,問題是什麼? –

+0

圖像點擊後向上移動 – Damo

回答

0

確定 - 祕密這是發現在默認情況下所使用的一個的UIBarButtonItem圖像的尺寸重新調整至50x30

UIBarButtonItem *item = self.refreshButton; 
UIView *view = [item valueForKey:@"view"]; 

在這一點上,我把一個斷點,並檢查的框架查看和它是大小50×30!

此外,我添加了旋轉圖像的自定義視圖,尺寸爲50 x 30到按鈕並旋轉。

#pragma mark - UIRefreshControl method(s) 

- (void)configureSpinningView; 
{ 
    // 50x30 is the size that the nav bar sets for the buttons image... 

    self.refreshControlSpinningImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 50, 30)]; 
    self.refreshControlSpinningImageView.image = [UIImage imageNamed:@"btnSync"]; 
    self.refreshControlSpinningImageView.autoresizingMask = UIViewAutoresizingNone; 
    self.refreshControlSpinningImageView.contentMode = UIViewContentModeCenter; 

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(refreshTapped:)]; 

    [self.refreshControlSpinningImageView addGestureRecognizer:tapRecognizer]; 
} 

#pragma mark - aimation(s) 

#define DEGREES_TO_RADIANS(angle) ((angle)/180.0 * M_PI) 
- (void)animateRefreshButton; 
{ 
    [self.refreshButton setCustomView:self.refreshControlSpinningImageView]; 

    [UIView animateWithDuration:0.5 delay:0.3 
options:UIViewAnimationOptionCurveEaseInOut animations:^
    { 
     self.refreshControlSpinningImageView.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(180)); 
    } completion: ^(BOOL finished) 
    { 
     self.refreshControlSpinningImageView.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(0)); 

     [self.refreshButton setCustomView:nil]; 
     }]; 
} 

#pragma mark - IBAction(s) 

- (IBAction)refreshTapped:(UIBarButtonItem *)sender; 
{ 
    //deletia 

    [self animateRefreshButton]; 
} 

這裏是固定的視頻:

enter image description here