- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我制作了一个 CAGradientLayer 的自定义类(添加了径向渐变选项)。
我工作,但我不知道为什么我不能为颜色设置动画。
这是我的代码。
动画是一个简单的 CABasicAnimation,我将 toValue 设置为一个带有颜色的新数组。
#import "ExtCAGradientLayer.h"
NSString * const kExt_CAGradientLayerRadial = @"RadialGradient";
@implementation ExtCAGradientLayer
@synthesize gradientDrawingOptions;
+(BOOL)needsDisplayForKey:(NSString *)key
{
return [key isEqualToString:@"type"] || [super needsDisplayForKey:key];
}
- (void)drawInContext:(CGContextRef)theContext
{
if ([self.type isEqualToString:kExt_CAGradientLayerRadial]) {
size_t num_locations = self.locations.count;
int numbOfComponents = 0;
CGColorSpaceRef colorSpace = NULL;
if (self.colors.count) {
CGColorRef colorRef = (__bridge CGColorRef)[self.colors objectAtIndex:0];
numbOfComponents = CGColorGetNumberOfComponents(colorRef);
colorSpace = CGColorGetColorSpace(colorRef);
}
float *locations = calloc(num_locations, sizeof(float));
float *components = calloc(num_locations, numbOfComponents * sizeof(float));
for (int x = 0; x < num_locations; x++) {
locations[x] = [[self.locations objectAtIndex:x] floatValue];
const CGFloat *comps = CGColorGetComponents((__bridge CGColorRef)[self.colors objectAtIndex:x]);
for (int y = 0; y < numbOfComponents; y++) {
int shift = numbOfComponents * x;
components[shift + y] = comps[y];
}
}
CGPoint position = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
CGFloat radius = floorf(MIN(self.bounds.size.width, self.bounds.size.height) / 2);
CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, components, locations, num_locations);
CGContextDrawRadialGradient(theContext, gradient, position, 0, position, radius, self.gradientDrawingOptions);
free(locations);
free(components);
}
最佳答案
图层有一堆与之相关的隐式动画。这可以让他们在与 CABasicAnimation
互动时变得有点滑稽。 .我的第一个建议是避免 CABasicAnimation
使用图层时。几乎没有什么好的理由,因为图层知道如何为自己设置动画。这样做要容易得多:
[CATransaction begin];
[CATransaction setAnimationDuration:3];
layer.colors = [NSArray arrayWithObjects:
(__bridge id)[UIColor redColor].CGColor,
[UIColor greenColor].CGColor,
nil];
[CATransaction commit];
setAnimationDuration:
的范围。以防您在此事务中为其他事物设置动画。
CABasicAnimation
,或者您正在使用它来返回它们(我有时会这样做)。您仍然可以将它们与
CALayer
结合使用, 但你必须告诉
CALayer
停止其自动动画 (
setDisableActions:
)。你仍然想使用图层 setter 而不是
toValue:
.
[CATransaction begin];
[CATransaction setDisableActions:YES];
CABasicAnimation *anim = [[CABasicAnimation alloc] init];
anim.duration = 3;
[layer addAnimation:anim forKey:@"colors"];
layer.colors = [NSArray arrayWithObjects:
(__bridge id)[UIColor redColor].CGColor,
[UIColor greenColor].CGColor,
nil];
[CATransaction commit];
toValue:
而不是setter,它会起作用,但最后会“跳回”到原始值。
fillMode
的解决方案和
removedOnCompletion
.如果您不完全了解它们在做什么,这些会产生许多微妙的问题。它们很少是你真正的意思。只要事情非常简单,它们就可以正常工作。
关于ios - 自定义 CAGradientLayer 不设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11159584/
ios渐变圆环旋转动画cashapelayer cagradientlayer shape.gif demo.png ?
我正在尝试在 View 上设置渐变背景,但下面的代码使 UIView 显示为纯黑色。如果我将白色更改为绿色,渐变将正确显示。将图层的背景颜色更改为 greenColor 会使 View 显示为纯绿色。
我正在尝试创建一个具有渐变背景的 UITableViewCell。我不明白为什么,但 UITableView 的右侧有一个空白区域。我尝试通过设置纯色但结果没有改变。 这是我的 UITableView
我的问题很简单。 我想使用 CAGradientLayer 为我的 UIView 制作漂亮的渐变背景。 但问题是它显示出丑陋的紫罗兰色,而不是我想要的美妙的红色。 这是我正在使用的代码: - (voi
我使用下面的代码来设置我的 View 的渐变背景颜色。 CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame
我正在尝试创建两个渐变层,一个位于 ScrollView 的每一侧,以显示有要滚动到的内容。 左侧的效果很好,但右侧的显示完全透明。我错过了什么? CAGradientLayer *l = [CAGr
好的,我有一个 Collection View 和一个使用 Xib 文件创建的自定义单元格,以便我可以在不同 View 的另一个 Collection View 中使用相同的单元格。在我的 cellF
关于CAGradientLayerlocations属性的文档指定它必须设置为从0到1的NSNumber数组,但它实际上适用于负数和大于1的数字。这样使用安全吗? 它按照您期望的方式工作 gradie
我有以下代码来呈现一个CAGradientLayer,它应该覆盖整个 View 。但是,它在模拟器中显示不正确。我打印了 self.view.bounds.width 和 self.view.boun
您好,我正在尝试从该颜色设置为另一个 View 的渐变中获取颜色。我可以设置开始和结束颜色,但不能设置角度和类型。 以下是值:1.开始颜色:@“2b2b2b”2.结束颜色:@“4a4a4a”3.渐变角
我有一个像 Instagram 个人资料图片中那样的圈子,里面有故事。我想要有一种像圆圈在旋转的感觉。为此,我使用了 CABasicAnimation。它正在旋转,但不在中心。 正如我搜索的那样,我需
我正在使用代码 NSArray *buttons = [NSArray arrayWithObjects: self.rollBtn,nil]; for(UIButton *btn in
我正在为我的 View 背景设置渐变: CAGradientLayer *grad = [CAGradientLayer layer]; grad.frame = self.contentView.f
CAGradientLayer 有两个属性startPoint 和endPoint。这些属性是根据单位坐标空间定义的。结果是,如果我有两个具有相同起点和终点且每个边界不同的渐变层,则这两个渐变将不同。
我用CAShapeLayer画了一个圆,并设置为CAGradientLayer的mask,代码如下: CAShapeLayer *circleShapeLayer = [CAShapelayer ne
我使用 CAGradientLayer 来生成这个细线渐变。问题是自转不顺畅。当 UIViewController 旋转时,我在 viewDidLayoutSubviews 中设置包含该层的 View
我使用 CAGradientLayer 作为按钮的背景。 cell.showOnMap.clipsToBounds = YES; cell.showOnMap.layer.cornerRadius =
我想要一个彩色渐变来覆盖我的 View 。在 View Controller 中,我有这段代码 - (void)viewDidLoad { self.view.backgroundColor =
我想为我的 UIView 创建一个渐变作为背景色。我写了这段代码 gradient.colors = [UIColor.blue,UIColor.yellow] gradient.lo
有一个CAShapeLayer 当我将它添加为 mask 时,我得到一个空白屏幕 这是我的代码: let width: CGFloat = frame.width let radius
我是一名优秀的程序员,十分优秀!