关闭

CALayer实现圆角阴影效果

210人阅读 评论(0) 收藏 举报

直接上代码:

#import "ViewController.h"

#define PHOTO_SIZE  160

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    CGPoint position= CGPointMake(160, 220);
    CGRect  bounds=CGRectMake(0, 0, PHOTO_SIZE,PHOTO_SIZE);
    CGFloat cornerRadius=80;
    CGFloat borderWidth=2;

    //阴影图层
    CALayer *layerShadow=[CALayer layer];
    layerShadow.bounds= bounds;
    layerShadow.position= position;
    layerShadow.cornerRadius = cornerRadius;
    layerShadow.shadowColor = [UIColor grayColor].CGColor;
    layerShadow.shadowOpacity = 1;
    layerShadow.borderColor = [UIColor whiteColor].CGColor;
    layerShadow.borderWidth = borderWidth;
    layerShadow.shadowOffset = CGSizeMake(2, 1);//偏移量的大小根据自己的需求设置.
    [self.view.layer addSublayer:layerShadow];

    //容器图层
    CALayer *layer=[[CALayer alloc]init];
    layer.bounds=bounds;
    layer.position=position;
    layer.cornerRadius=cornerRadius;
    layer.masksToBounds=YES;
    layer.borderColor=[UIColor whiteColor].CGColor;
    layer.borderWidth=borderWidth;

    //方法一:利用图层形变解决图像倒立问题.
    layer.transform=CATransform3DMakeRotation(M_PI, 1, 0, 0);

    //方法三:通过keyPath进行设置

    //[layer setValue:@M_PI forKeyPath:@"transform.rotation.x"];

    //在动画开发中形变往往不是直接设置transform,而是通过keyPath进行设置。这种方法设置形变的本质和前面没有区别,只是利用了KVC可以动态修改其属性值而已,但是这种方式在动画中确实很常用的,因为它可以很方便的将几种形变组合到一起使用。同样是解决动画旋转问题,只要将前面的旋转代码改为下面的代码即可:当然,通过key path设置形变参数就需要了解有哪些key path可以设置.

    //设置图层代理
    layer.delegate=self;

    //添加图层到根图层
    [self.view.layer addSublayer:layer];

    //调用图层setNeedDisplay,否则代理方法不会被调用
    [layer setNeedsDisplay];


}

#pragma mark 绘制图形、图像到图层,注意参数中的ctx是图层的图形上下文,其中绘图位置也是相对图层而言的.

-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{


    NSLog(@"%@",layer);//这个图层正是上面定义的图层

//    CGContextSaveGState(ctx);
//    
//    //方法二:图形上下文形变,解决图片倒立的问题
//    CGContextScaleCTM(ctx, 1, -1);
//    CGContextTranslateCTM(ctx, 0, -PHOTO_SIZE);

    UIImage *image=[UIImage imageNamed:@"ptjShare"];//事实上如果仅仅就显示一张图片在图层中当然没有必要那么麻烦,直接设置图层contents就可以了,不牵涉到绘图也就没有倒立的问题了。

    //注意这个位置是相对于图层而言的不是屏幕
    CGContextDrawImage(ctx, CGRectMake(0, 0, PHOTO_SIZE, PHOTO_SIZE), image.CGImage);

 //   CGContextRestoreGState(ctx);

}

@end
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:169476次
    • 积分:3527
    • 等级:
    • 排名:第9401名
    • 原创:181篇
    • 转载:1篇
    • 译文:12篇
    • 评论:17条
    最新评论