我创建了一个UIView子类,并使用UIBezierpath绘制圆形rects并用一些渐变填充它。
简而言之,这就是子类draw rect的样子:
CGRect frame1 = //size of Frame 1
CGRect frame2 = //size of Frame 2
//gradientingStart
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
if (options == false) {
self.color = [self createRandomColor];
}
NSArray *gradientColors = [NSArray arrayWithObjects:
(id)[UIColor colorWithHue:color saturation:saturationVal brightness:brightnessVal alpha:1].CGColor,
(id)[UIColor colorWithHue:color+0.04 saturation:saturationVal+0.15 brightness:brightnessVal-0.15 alpha:1].CGColor, nil];
CGFloat gradientLocations2[] = {0.25,1};
CGGradientRef gradient2 = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)gradientColors, gradientLocations2);
CGContextSaveGState(context);
//gradientingEnd
UIBezierPath *result =
[UIBezierPath bezierPathWithRoundedRect: frame1 cornerRadius:radius];
[result appendPath:
[UIBezierPath bezierPathWithRoundedRect: frame2 cornerRadius:radius]];
[result setLineWidth:3];
[[UIColor blackColor]setStroke];
[result stroke];
[result fill];
[result addClip];
CGContextDrawLinearGradient(context, gradient2, CGPointMake(0, 0), CGPointMake(0, self.bounds.size.height), 0);
//important to prevent leaks
CGGradientRelease(gradient2);
CGColorSpaceRelease(colorSpace);
//-------
UIImage *texture = [UIImage imageNamed:@"texture2.png"];
[texture drawInRect:CGRectMake(self.bounds.origin.x, self.bounds.origin.y, self.bounds.size.width, self.bounds.size.height)];
现在我在我的视图控制器中创建了几个这样的实例,并尝试使用这样的动画移动它们:
[UIView animateWithDuration:0.5 delay:0 options:0 animations:^{
costumview.alpha = 0;
[costumview setFrame:CGRectMake(320,0,320,420)];
[self reorderViewsFrom:costumview.intValue];
overlay.alpha = 0;
}completion:^(BOOL finished){
}];
但不幸的是,动画在设备上非常滞后,并且显示的视频越多(5-10),它就越差。
如何提高性能并提供流畅的动画效果?我认为改变costum视图不是一种替代方案,因为这会破坏应用程序的意义。有没有更快的方法来为costum视图设置动画?
答案 0 :(得分:1)
你的drawRect方法非常激烈。绘制这些渐变和圆角是性能繁重的例程,并且因为您在动画中更改图像的框架,所以drawRect会经常被调用。
我会在你的draw rect中添加一个NSLog,看看你为自定义视图设置动画时调用它的次数。你可能会感到惊讶。
您可以尝试使用:
view.layer.shouldRasterize = YES
这样,您可以在为其设置动画之前渲染自定义视图的位图。再次动画帧更改后,您应该再次调用drawRect并禁用shouldRasterize。
在此处阅读有关shouldRasterize的更多信息:
答案 1 :(得分:0)
我指出使用一些导致滞后的CALayer转换(四舍五入) - 这不是我发布的片段。
我通过使用自己的uiview子类创建圆角来避免它。这使得应用程序更加流畅。所有这些光栅化的东西都不适合我...