CALayer和Retina显示屏的高分辨率的支持

    最近在做ios应用的时候遇到一个非常棘手的bug,花了我一整天的时间,所以特别想写出来分享给其他程序员。

    这个bug源于一个用UIView对象生成显示的UIImage对象之后,把这个UIImage对象设置到另一个view的layer中.

    上代码:

(1)UIView生成UIImage代码:

#import <QuartzCore/QuartzCore.h>
-(UIImage *)getImageFromView:(UIView *)orgView{
    UIGraphicsBeginImageContext(orgView.bounds.size);
    [orgView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
}

 (2)UIImage设置到另一个view的layer:

CALayer *lay = [CALayer layer];

UIView *showImage = [getImageFromView:showView];//调用上面的获取view的image的方法

lay.contents = showImage;

otherView.layer = lay;


只后显示代码发现,在普通320*480分辨率屏幕上显示完全没有问题,但是在retina的高分辨率下却显示会显示出非常模糊的图片。

找了很多文件,终于发现QuartzCore和CALayer对高分辨率的支持的方法。

直接上解决办法代码:

(1)UIView生成UIImage代码:

#import <QuartzCore/QuartzCore.h>
-(UIImage *)getImageFromView:(UIView *)orgView{

    if(UIGraphicsBeginImageContextWithOption!=nil){
    UIGraphicsBeginImageContextWithOptions(orgView.bounds.size, NO, 1.0);;

    }else{

    UIGraphicsBeginImageContext(orgView.bounds.size);

    }
    [orgView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
}

 (2)UIImage设置到另一个view的layer:

CALayer *lay = [CALayer layer];

UIView *showImage = [getImageFromView:showView];//调用上面的获取view的image的方法

lay.contentsScale = 2.0f;

lay.contents = showImage;

otherView.layer = lay;


因为开始接触这个问题的时候,对CALayer和UIView的关系不够清楚,对CALayer的了解也不够清楚;加上网上并没有很多关于这个问题的资料,所以花了很多时间都没有想到这个点上,导致浪费了很多时间。再次给ios程序员奉上此文,希望遇到类似问题的朋友一个参考,希望其他人不要再像我这样浪费这么多时间了。

另外,以上代码是我记得的代码,并不是直接在项目上考下来的代码,如果有问题,请细心调试,但是contentScale的和UIGraphicsBeginImageContextWithOptions的知识点是没有问题的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值