2012年12月16日 星期日

Core Animation的基本使用(十七)

layer的mask效果


setmask提供了類似聚焦的功能,當我們將作為mask的maskLayer放在顯示用的displayLayer上的時候,displayLayer將只會顯示maskLayer的大小範圍的可視面積,此時displayLayer的其它面積都將看不見,如此就表現出了類似聚焦(探照燈)的功能。

另外還有一個附屬功能
当cocoa视图的子视图位于层边界之外时,这些视图将被父视图剪切。层去掉了这个限制,允许子层被完整的显示,而无视其在父层中的位置。
层的masksToBounds属性决定子层是否被父层所剪切。masksToBounds属性的默认值是NO,这防止了子层被父层剪切。图2显示了设置layerA的masksToBounds,以及这如何影响到layerB和layerC的显示。

 masksToBounds属性的取值




以下寫了一個實作來表現,使用一個手指移動來帶動mask,製造聚焦(探照燈)的效果。此例子不包含masksToBounds,因為已經在Core Animation的基本使用(二)時作驗證過了。

1.開啓一個新的專案


2. 在storyboard加上一個Button,並且在專案上加入一個圖檔


3. 在mainViewController.h加入兩個Layer變數

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

@interface mainViewController : UIViewController
{
    CALayer *mainLayer;
    CALayer *maskLayer;
}

@end

4.在mainViewController.m加入程式碼

#import "mainViewController.h"

@interface mainViewController ()

@end

@implementation mainViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
   
    mainLayer = [CALayer layer];
    mainLayer.bounds = CGRectMake(0, 0, 600, 600);
    mainLayer.position = CGPointMake(500, 500);
    mainLayer.contents = (id)[UIImage imageNamed:@"TaiwanMap.jpg"].CGImage;
   
    maskLayer = [CALayer layer];
    maskLayer.frame = CGRectMake(100, 100, 200, 200);
    UIColor *c2 = [UIColor blueColor];
    maskLayer.name = @"maskLayer";
    maskLayer.cornerRadius = 100.0f; //變成圓形的
    [maskLayer setBackgroundColor:(c2.CGColor)];

   
    [self.view.layer addSublayer:mainLayer];
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (IBAction)startMask:(id)sender {
   
    UIPanGestureRecognizer* panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    [self.view addGestureRecognizer:panGesture];
   
     [mainLayer setMask:maskLayer];
   
}
-(void)handleGesture:(UIGestureRecognizer*)gestureRecognizer
{
    if([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]])
    {
        UIView* piece = [gestureRecognizer view];
        if ([gestureRecognizer state] == UIGestureRecognizerStateBegan ||
            [gestureRecognizer state] == UIGestureRecognizerStateChanged)
        {
            UIPanGestureRecognizer* panGestureRecognizer = (UIPanGestureRecognizer*)gestureRecognizer;
            CGPoint translation = [panGestureRecognizer translationInView:self.view];
           
            CGFloat X, Y;
           
            X = maskLayer.position.x+translation.x;
            Y = maskLayer.position.y + translation.y;
           
            if (X >600)
                X = 600;
           
            if (X<100)
                X=100;
           
            if (Y > 600)
                Y =600;
           
            if (Y<100)
                Y=100;
           
            maskLayer.position = CGPointMake(X, Y);
           
           
        }
    }
}


@end

5. 執行結果