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上

时间: 2024-10-17 21:39:22

Animated progress view with CAGradientLayer(带翻译)的相关文章

小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(七)Progress View视图 学习笔记

1 import UIKit 2 3 class ViewController: UIViewController{ 4 5 @IBOutlet weak var progress: UIProgressView! 6 7 let operationQueue = NSOperationQueue() 8 9 var 完成进度: Int = 0{ 10 didSet(oldValue){ 11 let 进度比 = Float(完成进度)/Float(100) 12 let 是否动画 = (old

App Store Review Guideline(带翻译)

1. Terms and conditions(法律与条款) 1.1  As a developer of applications for the App Store you are bound by the terms of the Program License Agreement (PLA), Human Interface Guidelines (HIG), and any other licenses or contracts between you and Apple. The f

Using lists in Android [带翻译]

Using lists inAndroid (ListView) – Tutorial 原文地址:http://www.vogella.com/tutorials/AndroidListView/article.html 申明:本译文参考谷歌和原文协作翻译,有很小一部分是意译方便理解.如有错误请联系(邮箱:[email protected]QQ:190951132 添加请表明是本文读者)更正. 拉尔斯· 沃格尔 Version4.6 Copyright? 2010,2011,2012,2013,

快速实现语音转文字,还自带翻译

我们无论是在工作中还是在生活中,都会通过文字来记录一些资料数据等,但是如果碰到语音文件的话,大部分人都会选择将录音文件转成可编辑的文本形式,但是我估计大部分人都是用键盘或者用笔一个字一个字记录下来的,其实很多人都知道有语音转文字这个功能,但是大部分人不知道怎么用,或者没有软件用不了.那么我就教一下大家如何快速识别语音文字,而且还可以翻译哦!第一步:首先呢,我们需要打开我们电脑中的OCR识别软件,打开后就是下图中的这个,有软件也可以打开跟我一起做,没有的呢,就先看,看完后可以自己去试试.第二步:我

CAShapeLayer和CAGradientLayer

两个动画效果来了解一下CALayer的两个重要的subClass:CAGradientLayer和CAShapeLayer.先看CAShapeLayer,我们做一个和Spark相机一样的圆形进度,每一段有一种颜色,标识不同时间段录的视频. “” 阅读器 CAShapeLayerCAGradientLayer 转自KooFrank's Blog 两个动画效果来了解一下CALayer的两个重要的subClass:CAGradientLayer和CAShapeLayer.微视录制视频的时候那个进度效果

[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 Native application. This function has attributes that you can set such as easing and duration. import React, {Component} from 'react'; import {Text, V

[翻译] AJProgressPanel

AJProgressPanel Animated progress panel 可做动画的进度条 No images needed, all CoreGraphics code 不需要图片,使用CoreGraphics绘制的图片 Works on iPhone and iPad (resolution independent) 支持iPhone与iPad Example Usage Add QuartzCore.framework and drop the AJProgressPanel fol

iOS应用架构谈 view层的组织和调用方案

前言 <iOS应用架构谈 开篇>出来之后,很多人来催我赶紧出第二篇.这一篇文章出得相当艰难,因为公司里的破事儿特别多,我自己又有点私事儿,以至于能用来写博客的时间不够充分. 现在好啦,第二篇出来了. 当我们开始设计View层的架构时,往往是这个App还没有开始开发,或者这个App已经发过几个版本了,然后此时需要做非常彻底的重构. 一般也就是这两种时机会去做View层架构,基于这个时机的特殊性,我们在这时候必须清楚认识到:View层的架构一旦实现或定型,在App发版后可修改的余地就已经非常之小了

安卓自带下拉刷新SwipeRefreshLayout添加上拉刷新功能

在项目里面要用到刷新库,以前都是使用第三方的,不过看到官方出了  SwipeRefreshLayout之后就用SwipeRefreshLayout,但是不知道什么原因官方SwipeRefreshLayout只提供下拉刷新功能,很多时候我们需要上拉刷新功能,所以下载v4源码修改SwipeRefreshLayout,与之相关联的文件有两个分别是SwipeProgressBar,BakedBezierInterpolator把这三个文件拷贝到项目里面,修改一下包名就可以了.如何实现上拉刷新功能,其