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



