我被创造了UIView
与申请CAGradientLayer
颜色效果如我所附图片所示。现在,我想像屏幕保护程序一样平滑地改变它的渐变颜色从上到下的变化。我已经尝试过使用NStimer
有点完成了,但它的颜色在改变CAGradientLayer
看起来像个混蛋。
对于上述内容,我使用了以下代码方法:-
Timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(TIMER) userInfo:nil repeats:NO];
-(void)TIMER
{
Count++;
[view_Color1 removeFromSuperview];
view_Color1 = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 341)];
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.view_Color.bounds;
if (Count == 1)
{
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor greenColor] CGColor], (id)[[UIColor colorWithRed:44/255.0 green:255/255.0 blue:255/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:0/255.0 green:0/255.0 blue:254/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:252/255.0 green:0/255.0 blue:255/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:252/255.0 green:0/255.0 blue:6/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:253/255.0 green:131/255.0 blue:6/255.0 alpha:1.0f]CGColor], (id)[[UIColor colorWithRed:255/255.0 green:237/255.0 blue:10/255.0 alpha:1.0f]CGColor], nil];
}
else if (Count == 2)
{
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:255/255.0 green:237/255.0 blue:10/255.0 alpha:1.0f]CGColor],(id)[[UIColor greenColor] CGColor], (id)[[UIColor colorWithRed:44/255.0 green:255/255.0 blue:255/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:0/255.0 green:0/255.0 blue:254/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:252/255.0 green:0/255.0 blue:255/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:252/255.0 green:0/255.0 blue:6/255.0 alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:253/255.0 green:131/255.0 blue:6/255.0 alpha:1.0f]CGColor],nil];
}
//and so on still count is 7 then again its 1 to continue here are count use for chagen 7 color gradient use and repeat.
[self.view addSubview:view_Color1];
[self.view_Color1.layer addSublayer:gradient];
[myappdelegare sharedinstance].str_LastColorClick = [[NSString alloc]initWithFormat:@"MultiColor"];
Timer = [NSTimer scheduledTimerWithTimeInterval:0.30 target:self selector:@selector(TIMER) userInfo:nil repeats:NO];
}
你能帮我么?
Thanks
我一开始并没有注意到你每一步都在用颜色“跳跃”。
这是执行动画的代码:
- (void) initGradient
{
if ( !gradient ) {
gradient = [CAGradientLayer layer];
gradient.frame = self.view.bounds;
[self.view.layer addSublayer:gradient];
NSArray *baseColors = [NSArray arrayWithObjects:(id)[UIColor yellowColor].CGColor, (id)[UIColor redColor].CGColor, (id)[UIColor blueColor].CGColor, (id)[UIColor greenColor].CGColor, nil];
NSMutableArray *colors = [NSMutableArray arrayWithArray:baseColors];
[colors addObjectsFromArray:baseColors];
gradient.colors = colors;
cnt = [baseColors count];
NSMutableArray *locations = [NSMutableArray array];
CGFloat step = 1. / (cnt - 1.);
CGFloat loc = 0;
for ( NSUInteger i = 0; i < [colors count]; i++ ) {
[locations addObject:@(loc)];
loc += step;
}
gradient.locations = [locations copy];
}
}
-(void)TIMER
{
NSMutableArray *locations = [NSMutableArray array];
CGFloat step = 1. / (cnt - 1.);
static const CGFloat speed = 3;
CGFloat initialStep = speed / gradient.bounds.size.height;
CGFloat loc = [gradient.locations[0] floatValue] - initialStep;
if ( loc <= -1 - step )
loc = initialStep;
for ( NSUInteger i = 0; i < [gradient.locations count]; i++ ) {
[locations addObject:@(loc)];
loc += step;
}
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
gradient.locations = [locations copy];
[CATransaction commit];
Count++;
if ( Count >= [gradient.colors count] )
Count = 0;
[self performSelector:@selector(TIMER) withObject:nil afterDelay:0.04];
}
它仍然有一个小问题,即视图的顶部像素得到混合颜色,但动画效果很好。您也可以调整速度(静态 CGFloat 速度)。我把这个问题留给你来解决——也许是剪辑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)