0

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

我查看了Brad Larsson的关于 Core Animation 的课程,它很好地解释了动画使用的概念。然而,在我的(UIView 子类)自己的实现中使用这些动画的体面实现还不清楚。

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

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);
}
4

1 回答 1

2

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

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

如果您还没有将 QuartzCore.framework 导入到您的项目中,您将需要这样做。

如果您所做的只是创建带有阴影的图像的圆角矩形。

只需将图像设置在 aUIImageView中,然后设置图像视图层的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;

IfcreateArcPathFromBottomOfRect()比圆角矩形更复杂。

您将必须创建一个CAShapeLayer来代表您的路径。幸运的是,它需要您正在创建的 CGPathRef。

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

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

myImageView.layer.mask = myMaskLayer;

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

于 2012-06-07T21:00:58.937 回答