2015-11-11 51 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