Animated progress view with CAGradientLayer(带翻译)<待更新>
原文网址:使用CAGradientLayer的动画精度条View
Modern software design is getting flatter and thinner all the time. Another trend that follows suit is the thin, one pixel progress bar that you see at the top of websites and apps. You’ve seen in it on Medium blogs, mobile Safari and other apps on iOS 7. I’m going to show you how to create a component like this to use in your own apps. Here is what we’re going to create:
现代软件设计越来越扁平化,更薄所有的时间。下面西装的另一个趋势是,你的网站和应用程序的顶部看到薄,一个像素进度条。你已经看到了它在中等博客,移动Safari和iOS上7的其他应用程序,我将向你展示如何创建这样一个组件在自己的应用程序中使用。下面是我们要创建:
First thing we need to do is create a new UIView
subclass and give it a name. Next we need to tell this class to use CAGradientLayer as its backing layer instead of the default CALayer. You can do this by overriding the layerClass
method.
我们需要做的第一件事是创建一个新的UIView
子类,并给它一个名字。接下来,我们需要告诉这个类使用CAGradientLayer作为其衬里层,而不是默认的CALayer。您可以通过重写做到这一点layerClass
方法。
+ (Class)layerClass {
return [CAGradientLayer class];
}
CAGradientLayer is a pretty simple subclass of CALayer that adds a few additional properties. We’re going to be using the colors
, startPoint
and endPoint
properties to create an animated horizontal gradient.
Now there are a couple ways to achieve this rainbow effect. One way, which I am going to use, is to create an array of UIColor
objects with incremental hue values. In your initWithFrame:
method add the following code:
CAGradientLayer是一个非常简单的子类的CALayer,增加了一些额外的属性。我们将要使用的颜色
,的startPoint
和端点
属性来创建一个动画水平梯度。
现在有几种方法来实现这个彩虹效果。一种方式,这我会使用,是创建数组的UIColor
增量对象的色调值。在您的initWithFrame:方法
方法中添加以下代码:
// Use a horizontal gradient
CAGradientLayer *layer = (id)[self layer];
[layer setStartPoint:CGPointMake(0.0, 0.5)];
[layer setEndPoint:CGPointMake(1.0, 0.5)];
// Create colors using hues in +5 increments
NSMutableArray *colors = [NSMutableArray array];
for (NSInteger hue = 0; hue <= 360; hue += 5) {
UIColor *color;
color = [UIColor colorWithHue:1.0 * hue / 360.0
saturation:1.0
brightness:1.0
alpha:1.0];
[colors addObject:(id)[color CGColor]];
}
[layer setColors:[NSArray arrayWithArray:colors]];
Pretty straightforward. If you parent the view and run it in the simulator you’ll see our view has a horizontal gradient with all the colors in the spectrum.
Next, to create the moving effect we can cycle the colors in the colors
array and use a layer animation. A single animation will move one color and repeat the process when finished. The next two methods will do the trick.
很简单。如果父视图并运行它在模拟器上你会看到我们的看法与在光谱中所有颜色水平渐变。
接下来,创建我们可以循环中的颜色移动效果的颜色
阵列,并使用图层动画。单个动画将移动一个颜色,完成后重复上述过程。接下来的两个方法就可以了。
- (void)performAnimation {
// Move the last color in the array to the front
// shifting all the other colors.
CAGradientLayer *layer = (id)[self layer];
NSMutableArray *mutable = [[layer colors] mutableCopy];
id lastColor = [[mutable lastObject] retain];
[mutable removeLastObject];
[mutable insertObject:lastColor atIndex:0];
[lastColor release];
NSArray *shiftedColors = [NSArray arrayWithArray:mutable];
[mutable release];
// Update the colors on the model layer
[layer setColors:shiftedColors];
// Create an animation to slowly move the gradient left to right.
CABasicAnimation *animation;
animation = [CABasicAnimation animationWithKeyPath:@"colors"];
[animation setToValue:shiftedColors];
[animation setDuration:0.08];
[animation setRemovedOnCompletion:YES];
[animation setFillMode:kCAFillModeForwards];
[animation setDelegate:self];
[layer addAnimation:animation forKey:@"animateGradient"];
}
- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag {
[self performAnimation];
}
To add the indication of progress, we can use a simple layer mask to block out portions of our gradient. Add the following two properties to your header file:
要添加的进度指示,我们可以用一个简单的图层蒙版来阻挡我们梯度的部分。以下两个属性添加到您的头文件:
@property (nonatomic, readonly) CALayer *maskLayer;
@property (nonatomic, assign) CGFloat progress;
Be sure to @synthesize
and then append the following to your initWithFrame:
一定要@synthesize
,然后添加以下到您的initWithFrame:方法
maskLayer = [CALayer layer];
[maskLayer setFrame:CGRectMake(0, 0, 0, frame.size.height)];
[maskLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
[layer setMask:maskLayer];
This creates a zero width mask, covering the entire view. The color of the mask doesn’t matter here but it is required to work properly. Now when our progress
is updated we want to expand the width of the mask to reflect the value. Override the setProgress:
method to contain the following:
这将创建一个零宽度面具,覆盖了整个视图。面膜的肤色并不重要,在这里,但它需要正常工作。现在,当我们的进展
被更新我们要扩大掩模的宽度,以反映值。重写setProgress:
方法包含以下内容:
- (void)setProgress:(CGFloat)value {
if (progress != value) {
// Progress values go from 0.0 to 1.0
progress = MIN(1.0, fabs(value));
[self setNeedsLayout];
}
}
- (void)layoutSubviews {
// Resize our mask layer based on the current progress
CGRect maskRect = [maskLayer frame];
maskRect.size.width = CGRectGetWidth([self bounds]) * progress;
[maskLayer setFrame:maskRect];
}
Now when our progress
value is set, we make sure it’s within the 0.0 to 1.0 range and invalidate the layout. Then in the next call to layoutSubviews
we resize the mask based on its new value.
That’s it! You can view the entire project on GitHub.
现在,当我们的进展
值设置,我们要确保它的0.0至1.0范围内,布局失效。然后到下一次调用layoutSubviews
我们调整基于它的新值面具。
而已!您可以查看整个项目GitHub上。
Animated progress view with CAGradientLayer(带翻译)<待更新>的更多相关文章
- Animated progress view with CAGradientLayer(带翻译)
Animated progress view with CAGradientLayer(带翻译) Modern software design is getting flatter and thin ...
- App Store Review Guideline(带翻译)
1. Terms and conditions(法律与条款) 1.1 As a developer of applications for the App Store you are bound b ...
- POJ 3784 Running Median (模拟水过带翻译)
Description Moscow is hosting a major international conference, which is attended by n scientists fr ...
- [React Native] Animate Styles of a React Native View with Animated.timing
In this lesson we will use Animated.timing to animate the opacity and height of a View in our React ...
- [翻译] Working with NSURLSession: AFNetworking 2.0
Working with NSURLSession: AFNetworking 2.0 简单翻译,有很多错误,看官无法理解处请英文原文对照. http://code.tutsplus.com/tu ...
- iOS应用架构谈(三):View层的组织和调用方案(下)
iOS客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答iOS应用架构中的种种问题,本文是其中的第二篇,主要讲View层的组织和调用方案.下篇主要讨论做View层架构的 ...
- iOS应用架构谈 view层的组织和调用方案
当我们开始设计View层的架构时,往往是这个App还没有开始开发,或者这个App已经发过几个版本了,然后此时需要做非常彻底的重构. 一般也就是这两种时机会去做View层架构,基于这个时机的特殊性,我们 ...
- 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(六)Picker View视图 学习笔记
想对PickerView进行操作,只能在代码中操作. 下面 ,再添加三个label组件,然后将所有组件配置到代码中(看代码),然后要实现对PickerView的操作,就要实现它的DataSource协 ...
- PresentViewController切换界面(一些系统自带的页面切换动画)
视图切换,没有NavigationController的情况下,一般会使用presentViewController来切换视图并携带切换时的动画, 其中切换方法如下: – presentViewCon ...
随机推荐
- 高手详解SQL性能优化十条建议
1.查询的模糊匹配 尽量避免在一个复杂查询里面使用 LIKE '%parm1%'—— 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用. 解决办法: 其实只需要对该脚本略做改进,查询速度便 ...
- Java异常(一) Java异常简介及其架构
概要 本章对Java中的异常进行介绍.内容包括:Java异常简介Java异常框架 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544168.html ...
- Java Garbage Collection Basics--转载
原文地址:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html Overview Purpose ...
- django 快速实现注册
前言 对于web开来说,用户登陆.注册.文件上传等是最基础的功能,针对不同的web框架,相关的文章非常多,但搜索之后发现大多都不具有完整性,对于想学习web开发的新手来说不具有很强的操作性:对于web ...
- IE11之F12 Developer Tools--DOM Explorer
使用DOM Explorer工具查看网页的DOM状态.检查HTML结构和CSS样式,并测试更改以解决显示问题.这可以在元素位置错误或行为异常时帮助你诊断问题,然后解决问题. DOM Explorer图 ...
- maven异常解决:编码GBK的不可映射字符
直接将项目改为UTF-8编码,无效!要通过修改pom.xml文件,告诉maven这个项目使用UTF-8来编译. 一.问题描述 今天在MyEclipse中使用Maven编译项目源代码时,结果如下了如下的 ...
- SQL年月日方面的查询信息
这是计算一个月第一天的SQL 脚本: SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) --当月的第一天 SELECT DATEADD(mm, DAT ...
- LeetCode - 42. Trapping Rain Water
42. Trapping Rain Water Problem's Link ------------------------------------------------------------- ...
- 适用于jquery1.11.1的ajaxfileupload.js
ajaxfileupload源码 解决上传成功不走success的问题 解决高版本jquery兼容性问题 jQuery.extend({ createUploadIframe: function(id ...
- jQuery回调函数
1.引言 今天在学习<jQuery基础教程>在学习编写插件的时候,书中说利用回调函数来当参数,会极大的提高程序的灵活性.对回调函数很陌生.研究了一下给的示例程序.感觉对回调函数有了基本的了 ...