如何动画调整使用CAShapeLayer的UIView的大小?

时间:2013-10-30 16:33:43

标签: ios objective-c animation uiview

意向:

我想在视图中绘制一个圆圈,我可以从ViewController中移动,调整大小并重新着色。

设定:

我将UIView子类化为创建一个只保持圆圈的视图:

@implementation CircleView

+ (Class)layerClass //override
{
    return [CAShapeLayer class];
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        self.opaque = NO;
        CAShapeLayer *layer = (CAShapeLayer *)self.layer;
        layer.fillColor = nil;
        layer.strokeColor = [UIColor colorWithWhite:1 alpha:1].CGColor;
        layer.lineWidth = 2;
    }
    return self;
}

-(void) layoutSubviews
{
    CAShapeLayer *layer = (CAShapeLayer *)self.layer;
    layer.path = [UIBezierPath bezierPathWithOvalInRect:self.bounds].CGPath;
}

@end

然后我在父视图initWithFrame中初始化它:

{
    CGFloat diam = MIN(frame.size.width, frame.size.height);
    self.circleView = [[VCCCircleView alloc] initWithFrame:ASRectCenteredOnPoint(ASRectGetCenter(frame), (CGSize){diam,diam})];
    self.circleView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin;
    [self addSubview:self.circleView];
}

最后,父视图还提供了一种动画视图的方法:

-(void)setCircleFrame:(CGRect)frame
{
    CAShapeLayer *layer = (CAShapeLayer *)self.circleView.layer;
    [UIView animateWithDuration:1 delay:10 options:UIViewAnimationOptionLayoutSubviews animations:^(void)
    {
        circleView.frame = frame;
//for debug:        circleView.frame = CGRectInset(circleView.frame, -30, -30);
    } completion:nil];
}

这个想法是你可以设置框架和圆圈将移动和调整大小。简单吧?

问题:

圆圈确实*不*为它的大小变化设置动画,但它确实为它的位置变化设置了动画。 - 结果是它跳转到新的大小,然后动画原点的移动。对于我引入动画的大延迟,这一点尤其明显。

我注意到,如果我只是更改圆圈的位置,则不会调用circleView的layoutSubviews,但如果我更改了界限,则会显示。

我没有使用任何转换。

我尝试了什么:

  • 从初始化圆圈视图中删除autoresizemask内容
  • 动画选项的各种组合(包括:BeginFromCurrentState
  • 设置新帧后,在动画块中调用[self layoutSubviews]
  • 编辑边界而不是框架
  • 以上的组合

我没有尝试过:

  • 直接使用CABasicAnimation。这有必要吗? '框架'是 应该是UIView的动画?

0 个答案:

没有答案