2

我正在使用一个CircleView基本上继承UIView并实现drawRect绘制圆圈的类。这一切都有效,万岁!

我无法弄清楚的是如何制作它,所以当我触摸它(实现触摸代码)时,圆圈会变大或弹出。通常我会使用 UIKit 动画框架来做到这一点,但考虑到我基本上覆盖了drawRect直接绘制圆的函数。那么我该如何制作动画呢?

- (void)drawRect:(CGRect)rect{
    CGContextRef context= UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, _Color.CGColor);
    CGContextFillEllipseInRect(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height));
}

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer {
    // Animate?
}
4

2 回答 2

4

答案取决于您所说的“增长或流行”。当我听到“pop”时,我认为视图会在短时间内放大,然后再次缩小到原始大小。另一方面,“增长”的东西会扩大但不会再次缩小。

对于在短时间内再次放大和缩小的东西,我会使用变换来缩放它。无论是否自定义绘图,UIView 都内置了对简单变换动画的支持。如果这是您正在寻找的,那么它不会超过几行代码。

[UIView animateWithDuration:0.3
                      delay:0.0
                    options:UIViewAnimationOptionAutoreverse // reverse back to original value
                 animations:^{
                     // scale up 10%
                     yourCircleView.transform = CGAffineTransformMakeScale(1.1, 1.1);
                 } completion:^(BOOL finished) {
                     // restore the non-scaled state
                     yourCircleView.transform = CGAffineTransformIdentity;
                 }];

另一方面,如果您希望圆圈在每次点击时都增加一点,那么这对您来说是不可行的,因为视图在放大时看起来会像素化。制作自定义动画可能很棘手,所以我仍然建议您对实际动画使用缩放变换,然后在动画之后重绘视图。

[UIView animateWithDuration:0.3
                 animations:^{
                     // scale up 10%
                     yourCircleView.transform = CGAffineTransformMakeScale(1.1, 1.1);
                 } completion:^(BOOL finished) {
                     // restore the non-scaled state
                     yourCircleView.transform = CGAffineTransformIdentity;
                     // redraw with new value
                     yourCircleView.radius = theBiggerRadius;
                 }];

如果您真的非常想做一个完全自定义的动画,那么我建议您观看Rob Napiers 关于 Animating Custom Layer Properties的演讲,他的示例甚至与您正在做的事情完全相同(生长一个圆圈)。

于 2013-10-29T21:22:58.807 回答
0

如果你想要一个从中心扩展椭圆的动画,试试这个。在标题中,定义 3 个变量:

BOOL   _isAnimating;
float  _time;
CGRect _ellipseFrame;

然后在.m文件中实现这3个方法:

- (void)drawRect:(CGRect)rect; {
  [super drawRect:rect];
  CGContextRef context= UIGraphicsGetCurrentContext();

  CGContextSetFillColorWithColor(context, _Color.CGColor);
  CGContextFillEllipseInRect(context, _ellipseFrame);
}

- (void)expandOutward; {
  if(_isAnimating){
    _time += 1.0f / 30.0f;

    if(_time >= 1.0f){
      _ellipseFrame = self.frame;
      _isAnimating = NO;
    }
    else{
      _ellipseFrame = CGRectMake(0.0f, 0.0f, self.frame.size.width * _time, self.frame.size.height * _time);
      _ellipseFrame.center = CGPointMake(self.frame.size.width / 2.0f, self.frame.size.height / 2.0f);
      [self setNeedsDisplay];
      [self performSelector:@selector(expandOutward) withObject:nil afterDelay:(1.0f / 30.0f)];
    }
  }
}

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer; {
  if(_isAnimating == NO){
    _time = 0.0f;
    _isAnimating = YES;
    [self expandOutward];
  }
}

这是您可以为从中心扩展的圆圈设置动画的最基本方法。如果您想要更详细的动画,请查看CADisplayLink以获得与屏幕的持续同步。希望有帮助!

于 2013-10-29T21:09:33.577 回答