MyQRCodeViewController.swift 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. //
  2. // MyQRCodeViewController.swift
  3. // JChat
  4. //
  5. // Created by deng on 2017/8/15.
  6. // Copyright © 2017年 HXHG. All rights reserved.
  7. //
  8. import UIKit
  9. class MyQRCodeViewController: UIViewController {
  10. override func viewDidLoad() {
  11. super.viewDidLoad()
  12. _init()
  13. }
  14. fileprivate lazy var infoView: UIView = {
  15. var infoView = UIView()
  16. infoView.backgroundColor = .white
  17. return infoView
  18. }()
  19. private lazy var avator: UIImageView = {
  20. var avator = UIImageView()
  21. return avator
  22. }()
  23. private lazy var qrcode: UIImageView = {
  24. var qrcode = UIImageView()
  25. return qrcode
  26. }()
  27. private lazy var tipsLabel: UILabel = {
  28. var tipsLabel = UILabel()
  29. tipsLabel.textAlignment = .center
  30. tipsLabel.text = "扫一扫上面二维码,加我为好友吧!"
  31. tipsLabel.font = UIFont.systemFont(ofSize: 12)
  32. tipsLabel.textColor = UIColor(netHex: 0x999999)
  33. return tipsLabel
  34. }()
  35. private lazy var usernameLabel: UILabel = {
  36. var usernameLabel = UILabel()
  37. usernameLabel.textAlignment = .center
  38. usernameLabel.font = UIFont.systemFont(ofSize: 15)
  39. usernameLabel.textColor = UIColor(netHex: 0x999999)
  40. return usernameLabel
  41. }()
  42. private func _init() {
  43. self.title = "我的二维码"
  44. self.view.backgroundColor = UIColor(netHex: 0xE8EDF3)
  45. _setupNavigation()
  46. infoView.addSubview(avator)
  47. infoView.addSubview(usernameLabel)
  48. infoView.addSubview(qrcode)
  49. infoView.addSubview(tipsLabel)
  50. view.addSubview(infoView)
  51. view.addConstraint(_JCLayoutConstraintMake(infoView, .left, .equal, view, .left, 22.5))
  52. view.addConstraint(_JCLayoutConstraintMake(infoView, .right, .equal, view, .right, -22.5))
  53. view.addConstraint(_JCLayoutConstraintMake(infoView, .top, .equal, view, .top, 64 + 41.5))
  54. view.addConstraint(_JCLayoutConstraintMake(infoView, .bottom, .equal, view, .bottom, -80.5))
  55. infoView.addConstraint(_JCLayoutConstraintMake(avator, .centerX, .equal, infoView, .centerX))
  56. infoView.addConstraint(_JCLayoutConstraintMake(avator, .top, .equal, infoView, .top, 44.5))
  57. infoView.addConstraint(_JCLayoutConstraintMake(avator, .width, .equal, nil, .notAnAttribute, 80))
  58. infoView.addConstraint(_JCLayoutConstraintMake(avator, .height, .equal, nil, .notAnAttribute, 80))
  59. infoView.addConstraint(_JCLayoutConstraintMake(usernameLabel, .left, .equal, infoView, .left))
  60. infoView.addConstraint(_JCLayoutConstraintMake(usernameLabel, .top, .equal, avator, .bottom, 11.5))
  61. infoView.addConstraint(_JCLayoutConstraintMake(usernameLabel, .right, .equal, infoView, .right))
  62. infoView.addConstraint(_JCLayoutConstraintMake(usernameLabel, .height, .equal, nil, .notAnAttribute, 21))
  63. infoView.addConstraint(_JCLayoutConstraintMake(qrcode, .centerX, .equal, infoView, .centerX))
  64. infoView.addConstraint(_JCLayoutConstraintMake(qrcode, .top, .equal, avator, .bottom, 60))
  65. infoView.addConstraint(_JCLayoutConstraintMake(qrcode, .width, .equal, nil, .notAnAttribute, 240))
  66. infoView.addConstraint(_JCLayoutConstraintMake(qrcode, .height, .equal, nil, .notAnAttribute, 240))
  67. infoView.addConstraint(_JCLayoutConstraintMake(tipsLabel, .left, .equal, infoView, .left))
  68. infoView.addConstraint(_JCLayoutConstraintMake(tipsLabel, .top, .equal, qrcode, .bottom, 19))
  69. infoView.addConstraint(_JCLayoutConstraintMake(tipsLabel, .right, .equal, infoView, .right))
  70. infoView.addConstraint(_JCLayoutConstraintMake(tipsLabel, .height, .equal, nil, .notAnAttribute, 16.5))
  71. _bindData()
  72. }
  73. private func _bindData() {
  74. let user = JMSGUser.myInfo()
  75. let username = user.username
  76. let appkey = user.appKey
  77. user.thumbAvatarData { (data, id, error) in
  78. if let data = data {
  79. self.avator.image = UIImage(data: data)
  80. } else {
  81. self.avator.image = UIImage.loadImage("com_icon_user_80")
  82. }
  83. }
  84. usernameLabel.text = "用户名:\(username)"
  85. let url = "{\"type\":\"user\",\"user\": {\"appkey\":\"\(appkey ?? "")\",\"username\": \"\(username)\",\"platform\": \"iOS\"}}"
  86. qrcode.image = createQRForString(qrString: url, qrImageName: nil)
  87. }
  88. func createQRForString(qrString: String?, qrImageName: String?) -> UIImage?{
  89. if let sureQRString = qrString{
  90. let stringData = sureQRString.data(using: String.Encoding.utf8, allowLossyConversion: false)
  91. //创建一个二维码的滤镜
  92. let qrFilter = CIFilter(name: "CIQRCodeGenerator")
  93. qrFilter?.setValue(stringData, forKey: "inputMessage")
  94. qrFilter?.setValue("H", forKey: "inputCorrectionLevel")
  95. let qrCIImage = qrFilter?.outputImage
  96. // 创建一个颜色滤镜,黑白色
  97. let colorFilter = CIFilter(name: "CIFalseColor")!
  98. colorFilter.setDefaults()
  99. colorFilter.setValue(qrCIImage, forKey: "inputImage")
  100. colorFilter.setValue(CIColor(red: 0, green: 0, blue: 0), forKey: "inputColor0")
  101. colorFilter.setValue(CIColor(red: 1, green: 1, blue: 1), forKey: "inputColor1")
  102. // 返回二维码image
  103. let codeImage = UIImage(ciImage: (colorFilter.outputImage!.transformed(by: CGAffineTransform(scaleX: 5, y: 5))))
  104. // 中间一般放logo
  105. guard let imageName = qrImageName else {
  106. return codeImage
  107. }
  108. if let iconImage = UIImage(named: imageName) {
  109. let rect = CGRect(x: 0, y: 0, width: codeImage.size.width, height: codeImage.size.height)
  110. UIGraphicsBeginImageContext(rect.size)
  111. codeImage.draw(in: rect)
  112. let avatarSize = CGSize(width: rect.size.width*0.25, height: rect.size.height*0.25)
  113. let x = (rect.width - avatarSize.width) * 0.5
  114. let y = (rect.height - avatarSize.height) * 0.5
  115. iconImage.draw(in: CGRect(x: x, y: y, width: avatarSize.width, height: avatarSize.height))
  116. let resultImage = UIGraphicsGetImageFromCurrentImageContext()
  117. UIGraphicsEndImageContext()
  118. return resultImage
  119. }
  120. return codeImage
  121. }
  122. return nil
  123. }
  124. private func _setupNavigation() {
  125. let navButton = UIButton(frame: CGRect(x: 0, y: 0, width: 18, height: 18))
  126. navButton.setImage(UIImage.loadImage("com_icon_file_more"), for: .normal)
  127. navButton.addTarget(self, action: #selector(_saveImage), for: .touchUpInside)
  128. let item1 = UIBarButtonItem(customView: navButton)
  129. navigationItem.rightBarButtonItems = [item1]
  130. }
  131. func _saveImage() {
  132. let actionSheet = UIActionSheet(title: nil, delegate: self, cancelButtonTitle: "取消", destructiveButtonTitle: nil, otherButtonTitles: "保存图片")
  133. actionSheet.show(in: view)
  134. }
  135. func makeImage(_ view: UIView) -> UIImage {
  136. // TODO:- 要改写
  137. return UIImage(named: "aa")!
  138. //
  139. // UIGraphicsBeginImageContextWithOptions(view.size, false, UIScreen.main.scale)
  140. // view.layer.render(in: UIGraphicsGetCurrentContext()!)
  141. // let image = UIGraphicsGetImageFromCurrentImageContext()
  142. // UIGraphicsEndImageContext()
  143. // return image!
  144. }
  145. }
  146. extension MyQRCodeViewController: UIActionSheetDelegate {
  147. @objc func actionSheet(_ actionSheet: UIActionSheet, clickedButtonAt buttonIndex: Int) {
  148. if buttonIndex == 1 {
  149. let image = makeImage(infoView)
  150. UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(image:didFinishSavingWithError:contextInfo:)), nil)
  151. }
  152. }
  153. @objc func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo:UnsafeRawPointer){
  154. if error == nil {
  155. MBProgressHUD_JChat.show(text: "保存成功", view: view)
  156. } else {
  157. MBProgressHUD_JChat.show(text: "保存失败,请重试", view: view)
  158. }
  159. }
  160. }