JCImageBrowserViewController.swift 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. //
  2. // JCImageBrowserViewControllerswift
  3. // JChatSwift
  4. //
  5. // Created by oshumini on 16/6/7.
  6. // Copyright © 2016年 HXHG. All rights reserved.
  7. //
  8. import UIKit
  9. class JCImageBrowserViewController: UIViewController {
  10. var messages: [JCMessageType]?
  11. var conversation: JMSGConversation!
  12. var currentMessage: JCMessageType!
  13. var imageArr: [UIImage]!
  14. var imgCurrentIndex:Int = 0
  15. fileprivate lazy var CellIdentifier = "JCMessageImageCollectionViewCell"
  16. fileprivate var imageBrowser: UICollectionView!
  17. fileprivate var imageMessages: [JMSGMessage]!
  18. fileprivate var isMessageType = false
  19. fileprivate var selectImage: UIImage?
  20. override func viewDidLoad() {
  21. super.viewDidLoad()
  22. view.backgroundColor = UIColor.black
  23. if let messages = messages {
  24. imageMessages = getImageMessages(messages)
  25. if imageMessages.count > 0 {
  26. if let index = imageMessages.index(where: { (m) -> Bool in
  27. m.msgId == currentMessage.msgId
  28. }) {
  29. imgCurrentIndex = index
  30. } else {
  31. imgCurrentIndex = 0
  32. }
  33. isMessageType = true
  34. }
  35. }
  36. setupImageBrowser()
  37. }
  38. override var preferredStatusBarStyle: UIStatusBarStyle {
  39. return UIStatusBarStyle.lightContent
  40. }
  41. override func viewDidLayoutSubviews() {
  42. imageBrowser.scrollToItem(at: IndexPath(item: imgCurrentIndex, section: 0), at: .left, animated: false)
  43. }
  44. func getImageMessages(_ messages: [JCMessageType]) -> [JMSGMessage] {
  45. var imageMessages: [JMSGMessage] = []
  46. for message in messages {
  47. guard let msg = conversation.message(withMessageId: message.msgId) else {
  48. continue
  49. }
  50. if msg.contentType == .image {
  51. imageMessages.append(msg)
  52. }
  53. }
  54. return imageMessages
  55. }
  56. func setupImageBrowser() {
  57. let flowLayout = UICollectionViewFlowLayout()
  58. flowLayout.scrollDirection = .horizontal
  59. flowLayout.minimumLineSpacing = 0
  60. imageBrowser = UICollectionView(frame: CGRect.zero, collectionViewLayout: flowLayout)
  61. view.addSubview(imageBrowser)
  62. imageBrowser.frame = view.frame
  63. imageBrowser.backgroundColor = UIColor.clear
  64. imageBrowser.delegate = self
  65. imageBrowser.dataSource = self
  66. imageBrowser.minimumZoomScale = 0
  67. imageBrowser.isPagingEnabled = true
  68. imageBrowser.register(UINib(nibName: "JCMessageImageCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: CellIdentifier)
  69. }
  70. func singleTapImage(_ gestureRecognizer:UITapGestureRecognizer) {
  71. dismiss(animated: true, completion: nil)
  72. }
  73. func doubleTapImage(_ gestureRecognizer:UITapGestureRecognizer) {
  74. let cell = imageBrowser.cellForItem(at: currentIndex()) as! JCMessageImageCollectionViewCell
  75. cell.adjustImageScale()
  76. }
  77. fileprivate func currentIndex() -> IndexPath {
  78. let itemIndex:Int = Int(imageBrowser.contentOffset.x / imageBrowser.frame.size.width)
  79. return IndexPath(item: itemIndex, section: 0)
  80. }
  81. }
  82. extension JCImageBrowserViewController: UICollectionViewDelegate, UICollectionViewDataSource {
  83. func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
  84. if isMessageType {
  85. return imageMessages.count
  86. }
  87. return imageArr.count
  88. }
  89. func collectionView(_ collectionView: UICollectionView,
  90. layout collectionViewLayout: UICollectionViewLayout,
  91. sizeForItemAtIndexPath indexPath: IndexPath) -> CGSize {
  92. return CGSize(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
  93. }
  94. func collectionView(_ collectionView: UICollectionView,
  95. cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
  96. let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CellIdentifier, for: indexPath)
  97. if let cell = cell as? JCMessageImageCollectionViewCell {
  98. if isMessageType {
  99. cell.setMessage(imageMessages[indexPath.row])
  100. } else {
  101. cell.setImage(image: imageArr[indexPath.row])
  102. }
  103. cell.delegate = self
  104. }
  105. return cell
  106. }
  107. func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
  108. dismiss(animated: true, completion: nil)
  109. }
  110. }
  111. extension JCImageBrowserViewController: JCImageBrowserCellDelegate {
  112. func singleTap() {
  113. dismiss(animated: true, completion: nil)
  114. }
  115. func longTap(tableviewCell cell: JCMessageImageCollectionViewCell) {
  116. selectImage = cell.messageImage.image
  117. let actionSheet = UIAlertAction(title: "保存到手机", style: .default, handler: { (action) in
  118. self.view.becomeFirstResponder()
  119. if let image = self.selectImage {
  120. UIImageWriteToSavedPhotosAlbum(image, self, #selector(self.image(image:didFinishSavingWithError:contextInfo:)), nil)
  121. }
  122. })
  123. self.showSheetAction(title: nil, message: nil, actions: [actionSheet])
  124. SAIInputBarLoad()
  125. }
  126. @objc func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo:UnsafeRawPointer){
  127. if error == nil {
  128. MBProgressHUD_JChat.show(text: "保存成功", view: view)
  129. } else {
  130. MBProgressHUD_JChat.show(text: "保存失败,请重试", view: view)
  131. }
  132. }
  133. }