如何在我的UIView子类drawRect函数中使用Core Animation?

时间:2012-06-07 19:26:13

标签: iphone uiview core-animation subclass

我正在开始一个包含核心动画使用的项目。在过去的一段时间里,我一直在我的应用程序中使用UIView动画来制作动画。现在我想通过使用核心动画将我的动画提升到更高的水平。

我检查了lesson关于核心动画的Brad Larsson,它解释了动画使用的概念。然而,在我的(UIView子类)自己的实现中使用这些动画的一个不错的实现是非常不清楚的。

目前我设法在滚动视图中创建图像的缩略图视图。这是通过在for-loop中创建视图并将这些UIViews子类化来完成的。但是我应该如何在使用Core Animation的UIView子类中的drawRect函数中的这些视图上实现动画。我正在考虑用曲线进行变换。

到目前为止我的drawRect代码用于绘制带有弧形阴影和顶部图像的白色矩形:

//Draw function for displaying the seperate views/thumbnails
- (void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGRect ShadowRect = CGRectMake(15,15, 130,90);
    CGRect ImageRect = CGRectMake(20,20, 120,80);

    //save context and add the arc calculation and apply it on the shadow
    CGContextSaveGState(context);
    CGMutablePathRef arcPath = createArcPathFromBottomOfRect(ShadowRect, 5.0);
    CGContextAddPath(context, arcPath);
    CGContextSetShadow(context, CGSizeMake(0.0, 5.0), 3.0);
    CGContextFillPath(context);
    CGContextRestoreGState(context);

    //now we draw a white rectangle within the same frame as the shadow
    CGContextSaveGState(context);
    CGColorRef whiteColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0].CGColor;
    CGContextSetFillColorWithColor(context, whiteColor);
    CGContextFillRect(context, ShadowRect);
    CGContextRestoreGState(context);

    CGContextSaveGState(context);
    [self.img drawInRect:ImageRect];
    CGContextRestoreGState(context);

    CFRelease(arcPath);
}

1 个答案:

答案 0 :(得分:2)

抱歉,您无法使用Core Animation在drawRect中制作动画。您只能为视图和图层设置动画。

但是,查看代码时,您应该只使用Core Animation执行此操作。我假设createArcPathFromBottomOfRect()为角半径为5的人创建一个圆角矩形?如果是这样,那么这很容易。如果没有,那么您可能必须使用CAShapeLayer来执行更高级的路径。

如果您尚未将QuartzCore.framework导入项目,则需要执行此操作。

如果您正在做的是创建带阴影的图像的圆角矩形。

只需在UIImageView内设置图片,然后设置图片视图图层的cornerRadius属性。

myImageView.layer.cornerRadius = 5.0;

现在,对于阴影,您可以稍后配置图像视图的阴影属性。

myImageView.layer.shadowColor = [UIColor blackColor].CGColor;
myImageView.layer.shadowOffset  = CGSizeMake(0.0, 5.0);
myImageView.layer.shadowRadius = 3.0;
myImageView.layer.shadowOpacity = 0.5;
// Setting a shadow path will improve performance
myImageView.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:myImageView.bounds 
                                                          cornerRadius:myImageView.layer.cornerRadius].CGPath;

如果createArcPathFromBottomOfRect()比圆角矩形更复杂。

您必须创建一个CAShapeLayer来代表您的路径。 Luckilly它需要你正在创建的CGPathRef。

CAShapeLayer *myMaskLayer = [CAShapeLayer layer];
myMaskLayer.path = createArcPathFromBottomOfRect(myRect, 5.0);

现在,您可以使用路径屏蔽图像视图。

myImageView.layer.mask = myMaskLayer;

对于阴影,您需要创建具有相同路径的另一个形状图层,并将阴影添加到该图层(包括阴影路径)。现在,如果您将图像视图添加到创建阴影的形状图层上方,让我们将其称为myShadowLayer,您将拥有一个被阴影遮盖到某个任意形状的图像。