KSExtension.swift 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. //
  2. // KSExtension.swift
  3. // KSMediaPickerDemo
  4. //
  5. // Created by kinsun on 2019/4/29.
  6. // Copyright © 2019年 kinsun. All rights reserved.
  7. //
  8. import UIKit
  9. extension UIEdgeInsets {
  10. static public let safeAreaInsets = {() -> UIEdgeInsets in
  11. let safeAreaInsets: UIEdgeInsets
  12. if #available(iOS 11.0, *) {
  13. safeAreaInsets = UIApplication.shared.keyWindow?.safeAreaInsets ?? .zero
  14. } else {
  15. safeAreaInsets = .zero
  16. }
  17. return safeAreaInsets
  18. }()
  19. }
  20. extension UIView {
  21. public static let statusBarSize = UIApplication.shared.statusBarFrame.size
  22. public static let navigationBarSize = CGSize(width: statusBarSize.width, height: 44.0)
  23. public static let statusBarNavigationBarSize = {() -> CGSize in
  24. var size = statusBarSize
  25. size.height += navigationBarSize.height
  26. return size
  27. }()
  28. open var renderingImage: UIImage? {
  29. UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0.0)
  30. let image: UIImage?
  31. if let ctx = UIGraphicsGetCurrentContext() {
  32. layer.render(in: ctx)
  33. image = UIGraphicsGetImageFromCurrentImageContext()
  34. } else {
  35. image = nil
  36. }
  37. UIGraphicsEndImageContext()
  38. return image
  39. }
  40. }
  41. extension UIImage {
  42. public convenience init(JPEGData: Data, of cutSizeProportion: CGSize) {
  43. let dataRef = CFBridgingRetain(JPEGData) as! CFData
  44. let source = CGImageSourceCreateWithData(dataRef, nil)!
  45. let imageInfoRef = CGImageSourceCopyPropertiesAtIndex(source, 0, nil)!
  46. let pixelHeightKey = Unmanaged.passRetained(NSString(string: "PixelHeight")).autorelease().toOpaque()
  47. let pixelWidthKey = Unmanaged.passRetained(NSString(string: "PixelWidth")).autorelease().toOpaque()
  48. let pixelHeightPoint = CFDictionaryGetValue(imageInfoRef, pixelHeightKey)!
  49. let pixelWidthPoint = CFDictionaryGetValue(imageInfoRef, pixelWidthKey)!
  50. let windowHeight = CGFloat(Unmanaged<NSNumber>.fromOpaque(pixelHeightPoint).takeUnretainedValue().doubleValue)
  51. let windowWidth = CGFloat(Unmanaged<NSNumber>.fromOpaque(pixelWidthPoint).takeUnretainedValue().doubleValue)
  52. let viewH = windowHeight
  53. let viewW = cutSizeProportion.height/cutSizeProportion.width*viewH
  54. let rect = CGRect(x: (windowWidth-viewW)*0.5, y: 0.0, width: viewW, height: viewH)
  55. let cgData = CGDataProvider(data: dataRef)!
  56. let cgImage = CGImage(jpegDataProviderSource: cgData, decode: nil, shouldInterpolate: true, intent: .defaultIntent)!
  57. let newCgImage = cgImage.cropping(to: rect)!
  58. let newImageData = CFDataCreateMutable(kCFAllocatorDefault, 0)!
  59. let destination = CGImageDestinationCreateWithData(newImageData, "public.jpeg" as CFString, 1, nil)!
  60. // let newImageData = NSMutableData()
  61. // let destination = CGImageDestinationCreateWithData(CFBridgingRetain(newImageData) as! CFMutableData, "public.jpeg" as CFString, 1, nil)!
  62. let newImageInfoRef = CFDictionaryCreateMutableCopy(kCFAllocatorDefault, CFDictionaryGetCount(imageInfoRef), imageInfoRef)!
  63. CFDictionaryReplaceValue(newImageInfoRef, pixelHeightKey, Unmanaged.passRetained(NSNumber(value: Double(viewH))).autorelease().toOpaque())
  64. CFDictionaryReplaceValue(newImageInfoRef, pixelWidthKey, Unmanaged.passRetained(NSNumber(value: Double(viewW))).autorelease().toOpaque())
  65. CGImageDestinationAddImage(destination, newCgImage, newImageInfoRef)
  66. CGImageDestinationFinalize(destination)
  67. self.init(data: newImageData as Data)!
  68. }
  69. public func cut(from rect: CGRect) -> UIImage? {
  70. if let cgImage = self.cgImage {
  71. var newRect = rect
  72. let scale = self.scale
  73. newRect.origin.x *= scale
  74. newRect.origin.y *= scale
  75. newRect.size.width *= scale
  76. newRect.size.height *= scale
  77. if let newCgImage = cgImage.cropping(to: newRect) {
  78. return UIImage(cgImage: newCgImage)
  79. }
  80. }
  81. return nil
  82. }
  83. public func aspectFit(from size: CGSize, backgroundColor: UIColor = .clear) -> UIImage? {
  84. let imageSize = self.size
  85. let imageWidth = floor(imageSize.width)
  86. let imageHeight = floor(imageSize.height)
  87. let windowWidth = floor(size.width)
  88. let windowHeight = floor(size.height)
  89. if imageWidth == windowWidth, imageHeight == windowHeight {
  90. return self
  91. } else {
  92. let rect: CGRect
  93. let imageScale = imageWidth/imageHeight
  94. let windowScale = windowWidth/windowHeight
  95. if imageScale > windowScale {
  96. let height = floor(imageHeight*windowWidth/imageWidth)
  97. rect = CGRect(x: 0.0, y: (windowHeight-height)*0.5, width: windowWidth, height: height)
  98. } else {
  99. let width = floor(imageWidth*windowHeight/imageHeight)
  100. rect = CGRect(x: (windowWidth-width)*0.5, y: 0.0, width: width, height: windowHeight)
  101. }
  102. UIGraphicsBeginImageContextWithOptions(size, false, 0)
  103. let context = UIGraphicsGetCurrentContext()
  104. // CGContextScaleCTM(context, scale, scale)
  105. context?.setFillColor(backgroundColor.cgColor)
  106. context?.addRect(CGRect(origin: .zero, size: size))
  107. context?.drawPath(using: .fill)
  108. draw(in: rect)
  109. let newImage = UIGraphicsGetImageFromCurrentImageContext()
  110. UIGraphicsEndImageContext()
  111. return newImage
  112. }
  113. }
  114. public func resize(_ newSize: CGSize) -> UIImage? {
  115. UIGraphicsBeginImageContextWithOptions(newSize, false, scale)
  116. draw(in: CGRect(origin: .zero, size: newSize))
  117. let newImage = UIGraphicsGetImageFromCurrentImageContext()
  118. UIGraphicsEndImageContext()
  119. return newImage
  120. }
  121. public func equalResize(sideLength: CGFloat) -> UIImage? {
  122. let size = self.size
  123. let width = size.width
  124. let height = size.height
  125. let newSize: CGSize
  126. if width == height {
  127. newSize = CGSize(width: sideLength, height: sideLength)
  128. } else if width > height {
  129. newSize = CGSize(width: width/height*sideLength, height: sideLength)
  130. } else {
  131. newSize = CGSize(width: sideLength, height: height/width*sideLength)
  132. }
  133. return resize(newSize)
  134. }
  135. }
  136. extension UIColor {
  137. public static let ks_wordMain = UIColor(red: 44/255.0, green: 41/255.0, blue: 84/255.0, alpha: 1)
  138. public static let ks_wordMain_2 = UIColor(red: 44/255.0, green: 41/255.0, blue: 84/255.0, alpha: 0.5)
  139. public static let ks_background = UIColor(red: 248/255.0, green: 248/255.0, blue: 248/255.0, alpha: 1)
  140. public static let ks_main = kThemeColor
  141. public static let ks_white = UIColor.white
  142. public static let ks_black = UIColor.black
  143. }