欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS 利用動畫和貝塞爾實現(xiàn)咻咻效果

 更新時間:2016年09月20日 11:06:49   作者:云之君兮鵬  
這篇文章主要介紹了iOS 利用動畫和貝塞爾實現(xiàn)咻咻效果的相關資料,需要的朋友可以參考下

先上效果圖:


圓形

方形

思路分析:

這四種風格其實就是兩種, 一種是動畫效果在視圖View的內(nèi)部, 另一種是在視圖的外部! 我們可以嘗試封裝自定義 View 設置相關屬性去實現(xiàn)這兩個風格. 點擊時候觸及動畫, 說明要在這個 View 上添加手勢! 分析動畫效果其實是兩種, 第一種是視圖的比例由小到大,第二種是動畫顯示效果是漸漸變暗! 那么我們可以把兩種效果寫到一個動畫組中!還有一個問題是效果的形狀, 也就是 Layer 動畫展示的形狀有方形有圓形, 這個形狀就需要我們思考如何去繪制和判斷!

代碼分析:

首先要創(chuàng)建自定義一個 View 類去實現(xiàn)點擊有動畫的效果! 因為分析有兩種風格(在外在內(nèi))的動畫, 因此要在. h 文件中聲明屬性去接收外界告知的風格! 我們還可以添加一些供外界修改的值, 比如動畫的邊界粗細, 填充顏色, 動畫時間等等這里我用一個顏色舉例! 外界可提供一個顏色, 怎么用具體代碼中有!

typedef NS_ENUM(NSUInteger, FlashButtonType){
  # 風格定義一個枚舉類型的去表示 分別是代表動畫在里面和外面 (便于理解)
  DDFlashButtonInner = 0,
  DDFlashButtonOuter = 1

};
# 定義的兩個屬性
@property (strong, nonatomic) UIColor *flashColor;
@property (assign, nonatomic) FlashButtonType buttonType;

# 寫這個方法可以對 View 的子視圖上的子控件進行操作, 可以不把子控件都暴露出去
- (void)setText:(NSString *)text withTextColor:(UIColor *)textColor;

第 2 步: 在初始化方法中,我們可以給這個 view 加一些子視圖比如 UILabel 去顯示一些想表達的文字(這里還可以寫個方法去改變 label上 text 的屬性,)! 還需要給 View 添加點擊手勢!

- (instancetype) initWithFrame:(CGRect)frame{

  if (self = [super initWithFrame:frame]) {
# 創(chuàng)建手勢 并添加到 View 上
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTap:)];
     [self addGestureRecognizer:tap];
    self.textLabel = [[UILabel alloc] initWithFrame:self.bounds];
    self.textLabel.backgroundColor = [UIColor clearColor];
    [self.textLabel setTextAlignment:NSTextAlignmentCenter];
    [self addSubview:self.textLabel];
    self.backgroundColor = [UIColor cyanColor];
# 給一個默認的風格 不設置就是代表 動畫在里面
    self.buttonType = DDFlashButtonInner;
  }  
  return self;
}

第 3 步: 可以給子控件給一些屬性 這里有 label 還寫了個方法

- (void)setText:(NSString *)text withTextColor:(UIColor *)textColor
{
# 就是給 Label 賦外界傳來的值 若有其他的控件可以改一些參數(shù)用此方法
  if (text)
  {
    [self.textLabel setText:text];
  }
  if (textColor)
  {
    [self.textLabel setTextColor:textColor];
  }
}

第 4 步: 根據(jù)風格的不同我們要控制動畫展示的范圍, 也就是加入動畫在內(nèi)部就不能超過 View 的范圍


# 這里就是重寫了ButtonType setter方法,同時判斷一下風格根據(jù)風格選擇是否把超過視圖 View 的部分裁剪掉
- (void)setButtonType:(FlashButtonType)buttonType
{
  _buttonType = buttonType;
    if (buttonType == DDFlashButtonInner)
  {
// 內(nèi)容和子視圖是夾在視圖的邊界內(nèi) ( 只允許 view范圍內(nèi)有子視圖和類容可以顯示 )
    self.clipsToBounds = 1;
  }else
  {// 外面可以顯示
    self.clipsToBounds = 0;
  }
}

第 5 步: 準備工作做好后, 一個思路就是去寫點擊事件, 需要什么就去創(chuàng)建什么! 這先去思考點擊事件中需要的東西, 都滿足之后再去寫完善點擊事件! 動畫效果首先需要動畫, 另外還需要能添加動畫的 Layer;首先寫個得到動畫的方法!

- (CAAnimationGroup *)createFlashAnimationWisthScale:(CGFloat)scale
                      duration:(CGFloat)duratiton
{
# 創(chuàng)建按比例收縮變大的動畫
// 指定要在渲染動畫性能時的關鍵路徑 也就是圖形轉換的方式 這里是按收縮比例 這里也可以不用.scale 因為我們初始值設置是根據(jù)CATransform3D
  CABasicAnimation *scaleAnnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
// 動畫開始點
  // 這個動畫效果初值 就是本身的原始的位置
  scaleAnnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
  // 等價 scaleAnnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1, 1, 1)];
// 動畫結束點
  // 在 x 軸和 y 軸的變化比例
  scaleAnnimation.toValue = [NSValue valueWithCATransform3D:(CATransform3DMakeScale(scale, scale, 1))];

# 創(chuàng)建透明度變換的動畫 
 CABasicAnimation *alphaAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
  alphaAnimation.fromValue = @1;
  alphaAnimation.toValue = @0;

# 創(chuàng)建動畫組把上面兩個動畫加進去 
  CAAnimationGroup *animation = [CAAnimationGroup new];
  animation.animations = @[scaleAnnimation,alphaAnimation];
// 動畫效果 (節(jié)奏, Timing Function的會被用于變化起點和終點之間的插值計算.形象點說是Timing Function決定了動畫運行的節(jié)奏(Pacing),比如是均勻變化(相同時間變化量相同),先快后慢,先慢后快還是先慢再快再慢.)
  animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

# 返回我們想要的動畫效果組 
  return animation;
}

第 6 步: 得到一個CAShapeLayer 類型的圖層(因為要結合貝塞爾曲線得到形狀路徑), 畫一個形狀那么就需要有位置

- (CAShapeLayer *)creatCircleShapWithPostion:(CGPoint)position
                  pathRect:(CGRect)rect
                   radius:(CGFloat)radius
{
  CAShapeLayer *circleShap = [CAShapeLayer layer];

// 從貝塞爾曲線取到形狀
  circleShap.path = [UIBezierPath bezierPathWithRoundedRect:frame cornerRadius:radius].CGPath;

// 雖然得到了形狀, 但是并沒有得到具體的 frame(bounds) 也就是實際上并沒有范圍 只是可以展現(xiàn)動畫的效果 那么錨點其實就是設置的位置點
  circleShap.position = position;
  if (self.buttonType == DDFlashButtonInner)
  {
# 在這里設置 frame 就是為了滿足我們想要的錨點位置讓動畫效果動起來, 下面也一樣, 可以不設置試試效果就明白了!
   // circleShap.bounds = CGRectMake(0, 0, radius *2, radius *2);
   circleShap.frame = CGRectMake(position.x-radius, position.y-radius, radius*2, radius*2);
    // 線寬
    circleShap.lineWidth = 1;
    // 填充的顏色 不設置默認就給黃色
    circleShap.fillColor = self.flashColor ? self.flashColor.CGColor:[UIColor yellowColor].CGColor;

  }else
  {
     circleShap.frame = self.bounds;
   // 線寬
    circleShap.lineWidth = 5;
    circleShap.fillColor = [UIColor clearColor].CGColor;
  // 邊緣線的顏色 不設置就默認給個紫色
  circleShap.strokeColor = self.flashColor ? self.flashColor.CGColor:[UIColor purpleColor].CGColor;

  }

  // 不透明度 要設置成透明的 不然內(nèi)部風格的時候會畫出來圖案點點
  circleShap.opacity = 0;
  return circleShap;
}

第 7 步 : 把點擊的事件完成就 OK 了

- (void)didTap:(UITapGestureRecognizer *)tapGesture
{
// 獲取點擊點的位置
  CGPoint tapLocation = [tapGesture locationInView:self];
// 定義一個圖層 下面分情況去給予不同形狀  
 CAShapeLayer *circleShape = nil;
// 默認一個變化比例 1 倍
   CGFloat scale = 1.0f;
// 獲取 View 的寬和高
   CGFloat width = self.bounds.size.width, height = self.bounds.size.height;
   if (self.buttonType == DDFlashButtonInner)
  {
# 這里就是在視圖內(nèi)部效果, 就是以點擊的點為圓心 畫一個小圓(這里是半徑為1) 然后讓它動畫起來 (不斷的變大并變透明) 所以放大倍數(shù)只要能到最大的變就行了 不一定非要這樣寫, 你開心就好!
    CGFloat biggerEdge = width > height ? width :height; 
    CGFloat radius = 1
    scale = biggerEdge / radius + 0.5;
# 調(diào)用方法獲得圖層 錨點位置就是點擊的位置
circleShape = [self creatCircleShapWithPostion:CGPointMake(tapLocation.x , tapLocation.y ) pathRect:CGRectMake(0, 0, radius * 2, radius * 2) radius:radius];   
  }else
  {
# 這個是外部動畫效果 設置能放大5.5倍
    scale = 5.5f;
# 錨點位置在 View 的中心 這個圖層和 View 是一樣的形狀范圍
   circleShape = [self creatCircleShapWithPostion:CGPointMake(width /2 , height / 2) pathRect:self.bounds radius:self.layer.cornerRadius];
   }
// view圖層 上添加 有形狀的自定義圖層
  [self.layer addSublayer:circleShape];

# 給自定義圖層添加動畫  
  [circleShape addAnimation:[self createFlashAnimationWisthScale:scale duration:1.0f] forKey:nil];
}

最后說一句: 用的時候在 viewController 中引入, 創(chuàng)建自定義的 View 實例對象, 改變傳入的風格和顏色就可以展示效果了!

iOS基礎-動畫效果的總結--(CALayer — 粉骨碎身全不怕,要留清白在人間!<小拳石>動畫的思維導圖基礎知識:iOS能夠實現(xiàn)動畫的方式:(如上圖)UIView基礎實現(xiàn)方式一UIView基礎實現(xiàn)方式二CoreAnimation實現(xiàn)方式動畫的效果簡述:傳達狀態(tài)提高用戶對直接操作的感知幫助用戶可視化操作的結果UIVIew的基礎動畫:UIKit直接將動畫繼承到UIView類中,當內(nèi)部的一些屬性發(fā)生改變時,UIView將為這些改變提供動畫支持.執(zhí)行動畫的工作由UIView類自動完成,但希望在...

原文鏈接:http://www.jianshu.com/p/c187c7005ce1
著作權歸作者所有,轉載請聯(lián)系作者獲得授權,并標注“簡書作者”。

相關文章

  • iOS中設置清除緩存功能的實現(xiàn)方法

    iOS中設置清除緩存功能的實現(xiàn)方法

    清除緩存基本上都是在設置界面的某一個Cell,于是我們可以把清除緩存封裝在某一個自定義Cell中,現(xiàn)在位大家介紹一種最基礎的清除緩存的方法,感興趣的朋友一起看看吧
    2017-07-07
  • IOS開發(fā)之路--C語言預處理

    IOS開發(fā)之路--C語言預處理

    由于預處理指令是在編譯之前就進行了,因此很多時候它要比在程序運行時進行操作效率高。在C語言中包括三類預處理指令,今天將一一介紹:宏定義、條件編譯、文件包含
    2014-08-08
  • 詳解Objective C 中Block如何捕獲外部值

    詳解Objective C 中Block如何捕獲外部值

    這篇文章主要為大家介紹了詳解Objective C 中Block如何捕獲外部值實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • iOS?Swift?Lazy?var?View失效問題解決

    iOS?Swift?Lazy?var?View失效問題解決

    這篇文章主要為大家介紹了iOS?Swift?Lazy?var?View失效問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 關于iOS 11下app圖標變空白問題的解決方法

    關于iOS 11下app圖標變空白問題的解決方法

    升級到iOS11系統(tǒng)下自己的項目桌面app圖標不見了,通過查找相關的資料終于找到了解決方法,下面這篇文章主要給大家介紹了關于iOS 11下app圖標變空白問題的解決方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12
  • iOS狀態(tài)欄的顯示與隱藏的示例代碼

    iOS狀態(tài)欄的顯示與隱藏的示例代碼

    這篇文章主要介紹了iOS狀態(tài)欄的顯示與隱藏的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • IOS 開發(fā)APP之關于時間處理詳細介紹

    IOS 開發(fā)APP之關于時間處理詳細介紹

    這篇文章主要介紹了IOS 開發(fā)APP之關于時間處理詳細介紹的相關資料,開發(fā)APP 不僅需要對API的調(diào)用還需要對時間相關的各種API之間的差別,再因場景而異去設計相應的機制,需要的朋友可以參考下
    2016-12-12
  • 詳解使用Xcode進行iOS設備無線調(diào)試

    詳解使用Xcode進行iOS設備無線調(diào)試

    這篇文章主要介紹了詳解使用Xcode進行iOS設備無線調(diào)試,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • iOS多級列表實現(xiàn)代碼

    iOS多級列表實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了iOS多級列表實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • iOS9新特性之UIStackView

    iOS9新特性之UIStackView

    UIStackView主要包括了四大屬性:axis、alignment、distribution、spacing。下面通過本文給大家介紹iOS9新特性之UIStackView的相關知識,感興趣的朋友一起看看吧
    2017-09-09

最新評論