iOS-圖片摺疊效果

一.storyboard裏面如下圖,並且添加了拖動手勢


二.控制器.m代碼如下:

//  ViewController.m

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *topImageV;
@property (weak, nonatomic) IBOutlet UIImageView *bottomImageV;

/** <#註釋#> */
@property (nonatomic, weak) CAGradientLayer *gradientL;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //1.讓上部圖片只顯示上半部分
    self.topImageV.layer.contentsRect = CGRectMake(0, 0, 1, 0.5);
    //2.讓下部圖片只顯示下半部分
    self.bottomImageV.layer.contentsRect = CGRectMake(0, 0.5, 1, 0.5);
    
    self.topImageV.layer.anchorPoint = CGPointMake(0.5, 1);
    
    self.bottomImageV.layer.anchorPoint = CGPointMake(0.5, 0);
    
    //漸變層
    CAGradientLayer *gradientL = [CAGradientLayer layer];
    gradientL.frame = self.bottomImageV.bounds;
    //設置漸變的顏色
    gradientL.colors = @[(id)[UIColor clearColor].CGColor,(id)[UIColor blackColor].CGColor];
    
    //設置漸變透明
    gradientL.opacity = 0;

    self.gradientL = gradientL;
    
    [self.bottomImageV.layer addSublayer:gradientL];
       
}

//漸變層
- (void)gradientLayer {
    
    CAGradientLayer *gradientL = [CAGradientLayer layer];
    gradientL.frame = self.bottomImageV.bounds;
    //設置漸變的顏色
    gradientL.colors = @[(id)[UIColor redColor].CGColor,(id)[UIColor greenColor].CGColor,(id)[UIColor yellowColor].CGColor];
    //設置漸變的方向
    gradientL.startPoint = CGPointMake(0, 0);
    gradientL.endPoint = CGPointMake(1, 0);
    
    //設置一個漸變到另一個漸變的起始位置
    gradientL.locations = @[@0.2,@0.6];
}

- (IBAction)pan:(UIPanGestureRecognizer *)pan {
    
    
    //獲取移動的偏移量
    CGPoint transP = [pan translationInView:pan.view];
    //讓上部圖片開始旋轉
    CGFloat angle = transP.y * M_PI / 200;
    
    //近大遠小
    CATransform3D transform = CATransform3DIdentity;
    //眼睛離屏幕的距離
    transform.m34 = -1 / 300.0;
    
    self.gradientL.opacity = transP.y * 1 / 200.0;
    
    
    //self.topImageV.layer.transform  = CATransform3DMakeRotation(-angle, 1, 0, 0);
    self.topImageV.layer.transform = CATransform3DRotate(transform, -angle, 1, 0, 0 );
    
    
    if (pan.state == UIGestureRecognizerStateEnded) {
        
        self.gradientL.opacity = NO;
        //上部的圖片復位
        //usingSpringWithDamping:彈性係數.越小彈性越大
        [UIView animateWithDuration:0.5 delay:0 usingSpringWithDamping:0.3 initialSpringVelocity:0 options: UIViewAnimationOptionCurveLinear  animations:^{
            
            self.topImageV.layer.transform = CATransform3DIdentity;
            
        } completion:nil];
    }
    
    
    
}

@end

效果圖如下:滑動鼠標的時候,圖片有摺疊效果



筆記:

1.分析界 效果
當 標在圖 上拖動的時候,圖 有 個摺疊的效果.這種摺疊效果其實就是圖 的上半部分繞着X軸做 個旋轉的操作.我們圖 的旋轉都是繞着錨點進 旋轉的.所以如果是 張圖 的,辦不到只上圖 的上半部分進 個旋轉.
其實是兩張圖,把兩張圖 合成 張圖 的 法,實現 案.弄上下兩張圖,上上部圖 只顯 上半部分,下部圖 只顯 下半部分.

2.如果讓 張圖 只顯 上半部分或者下半部分?CALayer的 個屬性contentsRect = CGRectMake(0, 0, 1, 0.5);contentsRect就是要顯 的範圍.它是取值範圍是(0~1);想讓上部圖 只顯 上半部分contentsRect設置CGRectMake(0, 0, 1, 0.5);讓下部圖 只顯 下半部分contentsRect設置爲CGRectMake(0, 0.5, 1, 0.5)

3.讓上部圖 繞着錨點進 旋轉,但是圖 的默認錨點在中 ,所以要把上部圖 的錨點設在最底部.
修改上部分的錨點爲anchorPoint = CGPointMake(0.5, 1)
但是修過錨點之後,會出現 個問題,就是上部分的圖,會往上.導致兩個圖 中間有 個空隙.解決辦法爲.把兩張圖 放到 起.設置上部分圖 的錨點後.上部分圖 會上 半的距離.然後再設置下部圖 的錨點.設置上圖 的最上 設置下部圖 錨點值爲anchorPoint =CGPointMake(0.5, 0);

這樣就能夠辦到兩張圖 合成 張的效果.

4.給上部圖 添加 勢.根據 指向下拖動的距離.來計算旋轉的 度.拖動的時候,發現它的拖動範圍爲整個圖.所以添加 勢的時候,不能只添加上部分或着下部分.
可以弄 個跟View相同 的的View,把 勢添加給這個UIView.
添加完 勢時,在 勢 法當中去旋轉上部分圖.要來計算旋轉的 度,上半部分旋轉的 度是根據 指向上拖動的Y值來決定.當 指到最下部時正好旋轉180.
假設 指移動到最下部爲200.那旋轉 度應該爲 angel = transP.Y * M_PI / 200.0;

5.拖動的時候讓它有 個 體產效果 體的效果就是有 種近 遠 的感覺.想要設置 體效果.要修改它的TransForm當中的 個M34,設置 式爲弄 個空的TransFrom3D

CATransform3D transform = CATransform3DIdentity;200.0可以理解爲, 的眼睛離 機屏幕的垂直距離,近 遠 效果越明顯transform.m34 = - 1 / 200.0;
transform = CATransform3DRotate(transform, angle, 1, 0, 0);
相對上 次改了m34的形變,再去旋轉

6.給下部分圖 添加陰影的效果.陰影是有漸變的效果.是從透明到 的 個漸變.我們可以通過CAGradientLayer這個層來創建漸變.這個層我們就稱它是 個漸變層.

漸變層也是需要添加到 個層上 才能夠顯.

漸變層 有 個colors屬性.這個屬性就是設置要漸變的顏.它是 個數組.數組當中要求我們傳 都是CGColorRef類型,所以我們要把顏 轉成CGColor.但是轉成CGColor,數組就認識它是 個對象了,就要通過在前 加上 個(id)來告訴編譯器是 個對象.

可以設置漸變的 向:通過startPointendPoint這兩個屬性來設置漸變的 向.它的取值範圍也是(0~1)

默認 向爲上下漸變爲:gradientL.startPoint = CGPointMake(0, 0);gradientL.endPoint = CGPointMake(0, 1);設置左右漸變
gradientL.startPoint = CGPointMake(0, 0);gradientL.endPoint = CGPointMake(1, 0);

可以設置漸變從 個顏 到下 個顏 的位置設置屬性爲locations = @[@0.3,@0.7]

漸變層同時還有 個opacity屬性.這個屬性是調協漸變層的不透明度.它的取值範圍同樣也是0-1,
當爲0時代表透明,當爲1,代碼不透明.

所以我們可以給下部分圖 添加 個漸變層,漸變層的顏 爲從透明到 .gradientL.colors =
@[(id)[UIColor clearColor].CGColor,(id)[UIColor blackColor].CGColor];

開始時沒有漸變,所以可以把漸變層設爲透明狀態.之後隨着 指向下拖動的時,漸變層的透明度跟着改變.

當 指拖到最下 的時候,漸變層的透明度正好爲1.所以要中間可以有 個 例.CGFloat opacity = 1 * transP.y / 200.0;
在 指拖動的時候,設置它的不透度

7.在 指拖動過程當中,鬆開 指時,有 個動畫返彈回去的效果.所以我們要堅聽 指的狀態.當 勢狀態爲結束時把漸變層的透明度設爲透明把上部圖 的旋轉設爲0,也就是清空之前的形變.

同時加上 個返彈動畫的效果.返彈動畫添加 法爲

Duration:動畫的執 時
delay:動畫延時時.Damping:動畫的彈性係數,,彈簧效果越明顯initialSpringVelocity:彈簧初始化速度

[UIView animateWithDuration:0.8 delay:0 usingSpringWithDamping:0.1initialSpringVelocity:0

options:UIViewAnimationOptionCurveLinearanimations:^{

動畫執 代碼

} completion:^(BOOL finished) {動畫完成時調.
}]; 




發佈了4 篇原創文章 · 獲贊 1 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章