美文网首页iOS资料iOS开发自己的swift
分享iOS中常用的绘图, 截屏方法

分享iOS中常用的绘图, 截屏方法

作者: ZeroJ | 来源:发表于2016-06-05 19:31 被阅读2605次
  1. 设置某些角为圆角, 使用UIBezierPath
        let layer = CAShapeLayer()
        // 这里byRoundingCorners -> 指定圆角
        layer.path = UIBezierPath(roundedRect: testView.bounds, byRoundingCorners: [UIRectCorner.TopLeft, .TopRight], cornerRadii: CGSize(width: 20, height: 20)).CGPath
        testView.layer.mask = layer
  1. 设置view的四个角都为圆角, 最简单的方法, 使用当然最简单的某些情况下肯定就是不适合的, 因为这个方法会触发离屏渲染, 如果界面中有大量的圆角view的处理, 会出现掉帧的"现象"
        testView.layer.cornerRadius = 20.0
        testView.layer.masksToBounds = true
  1. 缩放图片
  • 3.1
    // 缩放图片
    func resizeImage(image: UIImage, toWidth width: CGFloat, withHeight height: CGFloat) -> UIImage {
        let size = CGSize(width: width, height: height)
        // 开启一个上下文
        /// 设置为false 表示背景不透明 -> 黑色
        /// 设置为 0 -> 可以自适应不同的屏幕的scale显示
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        // 获取上下文
        let context = UIGraphicsGetCurrentContext()
        // 转换坐标原点到左下角
        CGContextTranslateCTM(context, 0.0, height)
        CGContextScaleCTM(context, 1.0, -1.0)
        // 设置绘制模式
        CGContextSetBlendMode(context, .Copy)
        // 绘图
        CGContextDrawImage(context, CGRect(origin: CGPointZero, size: size), image.CGImage)
        // 取得图片
        let retrivedImage = UIGraphicsGetImageFromCurrentImageContext()
        // 结束上下文
        UIGraphicsEndImageContext()
        return retrivedImage
    }
  • 3.2
    // 缩放图片
    func resizeImage(image: UIImage, toWidth width: CGFloat, withHeight height: CGFloat) -> UIImage {
        let size = CGSize(width: width, height: height)
        // 开启一个上下文
        /// 设置为false 表示背景不透明 -> 黑色
        /// 设置为 0 -> 可以自适应不同的屏幕的scale显示
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        /// 绘制图片
        image.drawInRect(CGRect(origin: CGPointZero, size: size))
        // 取得图片
        let retrivedImage = UIGraphicsGetImageFromCurrentImageContext()
        // 结束上下文
        UIGraphicsEndImageContext()
        return retrivedImage
    }
  1. 截屏功能
  • 4.1
    func snapView(targetView: UIView) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(targetView.bounds.size, false, 0)
        // iOS7.0 之后系统提供的截屏的功能
        targetView.drawViewHierarchyInRect(targetView.bounds, afterScreenUpdates: false)
        
        let snapdImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return snapdImage

    }
  • 4.2
  //这个方法会返回一个"截屏"后的view
  // withCapInsets  -> 这个和拉伸图片的image.resizableImageWithCapInsets()使用一样
       let snapShotView  = view.resizableSnapshotViewFromRect(view.bounds, afterScreenUpdates: false, withCapInsets: UIEdgeInsetsZero)
  • 4.3
  func snapView(targetView: UIView) -> UIImage {
              UIGraphicsBeginImageContextWithOptions(targetView.bounds.size, false, 0.0)
// 区分和4.1中的使用
    targetView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
      let image = UIGraphicsGetImageFromCurrentImageContext()
      UIGraphicsEndImageContext()

      return image

  }

  1. 剪裁图片的指定部分
  • 5.1
    func cutImage(image: UIImage, cutRect: CGRect) -> UIImage {
        
        UIGraphicsBeginImageContextWithOptions(cutRect.size, false, 0.0)
        // 获取上下文
        let context = UIGraphicsGetCurrentContext()
        // 转换坐标原点到左下角
        CGContextTranslateCTM(context, 0.0, cutRect.size.height)
        CGContextScaleCTM(context, 1.0, -1.0)
        // 设置绘制模式
        CGContextSetBlendMode(context, .Copy)
        // 绘图
        CGContextDrawImage(context, cutRect, image.CGImage)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
  • 5.2
    func cutImage(image: UIImage, cutRect: CGRect) -> UIImage {
        
        UIGraphicsBeginImageContextWithOptions(cutRect.size, false, 0.0)
        // 获取上下文
        let context = UIGraphicsGetCurrentContext()
        image.drawInRect(cutRect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
  1. 将颜色绘制为图片
  • 6.1
    func imageFromColor(color: UIColor, size: CGSize) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
        let rect = CGRect(origin: CGPointZero, size: size)
        color.setFill()
        UIRectFill(rect)
        
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
  • 6.2
    func imageFromColor(color: UIColor, size: CGSize) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
        let rect = CGRect(origin: CGPointZero, size: size)
//        color.setFill()
//        UIRectFill(rect)
        
        let context = UIGraphicsGetCurrentContext()
        CGContextSetFillColorWithColor(context, color.CGColor)
        CGContextFillRect(context, rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }

如果你觉得平时很少接触过Quartzs 2D来绘图, 可能看上面的代码不是很明白, 如果想要更清楚, 建议阅读相关的绘图教程, 同时下一篇可能会简单分享一下使用Quartzs 2D来绘图的相关知识, 欢迎关注


相关文章

  • iOS-绘图Quartz 2D 贝赛尔曲线相关

    本篇涵盖iOS中绘图上下文,截屏相关等. 1.玩转iOS中的绘图(Quartz 2D基础篇)2.分享iOS中常用的...

  • 分享iOS中常用的绘图, 截屏方法

    设置某些角为圆角, 使用UIBezierPath 设置view的四个角都为圆角, 最简单的方法, 使用当然最简单的...

  • iOS 截屏&长截屏

    截屏在 iOS 开发中经常用到,本篇文章讲的是监听用户截屏操作,并且获取截屏图片,如果当前是UIScrollVie...

  • iOS-百度地图截屏

    关于百度地图截屏的问题,发现不能用常用的方法进行载屏,常用的截屏方法所得到的图片地图瓦片底图会显示空白,网上给出的...

  • 在Mac上获取截屏的方法

    mac上截屏有很多种方法,下面介绍几种常用的,可以从中选择更适合的方法截屏,以使获得的截屏更符合要求与审美。 1、...

  • iOS屏幕截图功能

    iOS7.0之前的系统,可以通过以下代码实现截屏功能。 iOS7.0之后,系统中封装了截屏的方法- (UIView...

  • (最新)iOS截屏

    ios webview 截屏:ios截屏 前言:介绍一下截屏有很多种做法1:截当前屏幕内容2:截整个视图的所有内容...

  • flutter:截屏

    1.flutter-截屏组件 2.flutter-截屏插件 3.flutter-iOS原生截屏 iOS代码 4.获...

  • 针对WKWebView进行内容的截屏。

    最近项目中需要截屏分享的功能,之前也了解过iOS截屏的技术,并写了关于截屏的笔记,兴冲冲的拿着代码稍作修改,对WK...

  • iOS截屏方法

    版权声明:出自MajorLMJ技术博客的原创作品 ,转载时必须注明出处及相应链接!

网友评论

  • 船长One:ios 11 后 4.2 截出来的图是屏幕大小 自己设置的大小不好用了 这个测试过么?
  • jswift:很实用很实用, 多谢分享 :grin:
  • 霖溦:ios7之后,系统提供了截屏方法,返回一个view,oc亲测比重绘高效
    ZeroJ:@霖溦 实际项目中swift中用的还是OC多得多, 不过我用swift写了一年多的项目, 2.2之前很多确实还是没有oc方便, 现在感觉渐渐的好用了, 学习下还是推荐的 :smile:
    霖溦:@ZeroJ 看来需要尽快学习swift了,越来越多朋友都开始用swift了
    ZeroJ:@霖溦 :smile: 嗯, 而且使用也简单, 但是很多人都在使用绘图实现, 所以我把系统的列出来了, 供大家参考
  • 80c9a4518c6f:有用,mark,
    ZeroJ:@SkyerWalker :smiley:

本文标题:分享iOS中常用的绘图, 截屏方法

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