我正在开始一个包含核心动画使用的项目。在过去的一段时间里,我一直在我的应用程序中使用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);
}
答案 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,您将拥有一个被阴影遮盖到某个任意形状的图像。