美文网首页iOSQuartzCore框架
CATiledLayer方式显示大图

CATiledLayer方式显示大图

作者: gpylove | 来源:发表于2018-12-19 13:57 被阅读24次

        显示大图时,传统加载方法会造成内存暴涨,造成主线程阻塞,甚至造成程序crash。可以使用CATiledLayer显示,CATiledLayer类似瓦片视图,他将需要绘制的内容分割成许多小块,然后异步绘制相应的小块,这样就节约了处理时间和内存。

1,它不需要你自己计算分块显示的区域,它自己直接提供,你只需要根据这个区域计算图片相应区域,然后画图就可以了。

2,它是在其他线程画图,不会因为阻塞主线程而导致卡顿。

3,它自己实现了只在屏幕区域显示图片,屏幕区域外不会显示,而且当移动图片时,它会自动绘制之前未绘制的区域,当你缩放时它也会自动重绘。

        CATiledLayer是为载入大图造成的性能问题提供的一个解决方案,具体如何划分小块和缩放时的加载策略,与CATiledLayer三个重要属性有关:

levelsOfDetail:levelsOfDetail指的是该图层缓存的缩小LOD数目,默认值为1,每进一级会对前一级分辨率的一半进行缓存,图层的levelsOfDetail最大值,对应至少一个像素点。

levelsOfDetailBias:levelsOfDetailBias指的是该图层缓存的放大LODB数目,它是layer的放大级别重绘设置,默认为0,即不会额外缓存放大层次,每进一级会对前一级两倍分辨率进行缓存。

tileSIze:(默认是256x256)tiledSize是layer划分视图区域最大尺寸,主要是影响layer的切片数量。

+ (Class)layerClass {

    return [CATiledLayer class];

}

-(id)initWithFrame:(CGRect)frame image:(UIImage*)img scale:(CGFloat)scale {

    if((self= [superinitWithFrame:frame])) {

        self.image= img;

        _imageRect=CGRectMake(0.0f,0.0f,

                                CGImageGetWidth(self.image.CGImage),

                                CGImageGetHeight(self.image.CGImage));

        _imageScale= scale;

        CATiledLayer*tiledLayer = (CATiledLayer*)[selflayer];

        intlev =ceil(log2(1/scale))+1;

        tiledLayer.levelsOfDetail=1;

        tiledLayer.levelsOfDetailBias= lev;

        //        tiledLayer.tileSize  此处tilesize使用默认的256x256即可

    }

    return self;

}

- (void)drawRect:(CGRect)rect {

    @autoreleasepool{

        CGRectimageCutRect =CGRectMake(rect.origin.x/_imageScale,

                                         rect.origin.y/_imageScale,

                                         rect.size.width/_imageScale,

                                         rect.size.height/_imageScale);

        CGImageRefimageRef =CGImageCreateWithImageInRect(self.image.CGImage, imageCutRect);

        UIImage*tileImage = [UIImageimageWithCGImage:imageRef];

        CGContextRef context = UIGraphicsGetCurrentContext();

        UIGraphicsPushContext(context);

        [tileImagedrawInRect:rect];

        CGImageRelease(imageRef);

        UIGraphicsPopContext();

    }

}

在GitHub上放了一个demo可以下载https://github.com/love1987/LargeImage

相关文章

  • CATiledLayer方式显示大图

    显示大图时,传统加载方法会造成内存暴涨,造成主线程阻塞,甚至造成程序crash。可以使用CATiledLa...

  • CoreAnimation之CATiledLayer

    CATiledLayer可以用来显示大尺寸的图片或者PDF文件,我们使用imageNamed或者contentsO...

  • CATiledLayer的使用

    使用CATiledLayer解决加载大图的问题。如:地图 Github地址: https://github.co...

  • CATiledLayer 大图分块展示

    0x01 场景分析 当我们需要完全展示一张大图时(注意不是要做大图在小容器展示的优化)。就包含了这张大图在屏幕内可...

  • ios 超大图显示:CATiledLayer的使用,关于tile

      最近碰到一个需求,显示一张超大图   以下是我自己的分析和尝试,不想看的话可以直接跳过看下面的CATiledL...

  • Core Animation 二 : CALayer的子类,大图

    一:CATiledLayer 继承自CALayer,它能够实现异步的分区的绘制,并且只绘制屏幕显示的范围,在特定的...

  • iOS 大图显示

    问题 对于超高分辨率的图片读取存在内存暴涨甚至崩溃的问题, 特别是对于 tableView 中多张图片同时读取的场...

  • 遮罩层的大小的计算方式

    大图显示的比例的计算方法:盛放大图的容器的大小除以大图的大小 遮罩层大小的宽高根据大图显示的比例乘以小图的大小

  • 通过 jQuery 实现放大镜效果

    实现原理 首先,我们讲解一下放大镜效果的实现方式: 方法一:准备一张高像素的大图,当鼠标放到原图上,加载显示大图的...

  • 大图显示内存优化

    背景:最近做一个游戏化的项目,项目中会加载许多比较大的场景图。经过测试一张9000*7000高清的png场景图加载...

网友评论

    本文标题:CATiledLayer方式显示大图

    本文链接:https://www.haomeiwen.com/subject/liwdkqtx.html