PhotoEditorViewController.swift 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. //
  2. // ViewController.swift
  3. // Photo Editor
  4. //
  5. // Created by Mohamed Hamed on 4/23/17.
  6. // Copyright © 2017 Mohamed Hamed. All rights reserved.
  7. //
  8. import UIKit
  9. public final class PhotoEditorViewController: UIViewController {
  10. /** holding the 2 imageViews original image and drawing & stickers */
  11. @IBOutlet weak var canvasView: UIView!
  12. //To hold the image
  13. @IBOutlet var imageView: UIImageView!
  14. @IBOutlet weak var imageViewHeightConstraint: NSLayoutConstraint!
  15. //To hold the drawings and stickers
  16. @IBOutlet weak var canvasImageView: UIImageView!
  17. @IBOutlet weak var topToolbar: UIView!
  18. @IBOutlet weak var bottomToolbar: UIView!
  19. @IBOutlet weak var topGradient: UIView!
  20. @IBOutlet weak var bottomGradient: UIView!
  21. @IBOutlet weak var doneButton: UIButton!
  22. @IBOutlet weak var deleteView: UIView!
  23. @IBOutlet weak var colorsCollectionView: UICollectionView!
  24. @IBOutlet weak var colorPickerView: UIView!
  25. @IBOutlet weak var colorPickerViewBottomConstraint: NSLayoutConstraint!
  26. //Controls
  27. @IBOutlet weak var cropButton: UIButton!
  28. @IBOutlet weak var stickerButton: UIButton!
  29. @IBOutlet weak var drawButton: UIButton!
  30. @IBOutlet weak var textButton: UIButton!
  31. @IBOutlet weak var saveButton: UIButton!
  32. @IBOutlet weak var shareButton: UIButton!
  33. @IBOutlet weak var clearButton: UIButton!
  34. @IBOutlet weak var continueButton: UIButton!
  35. @IBOutlet weak var cancelButton: UIButton!
  36. public var cropButtonImage: UIImage?
  37. public var stickerButtonImage: UIImage?
  38. public var drawButtonImage: UIImage?
  39. public var textButtonImage: UIImage?
  40. public var saveButtonImage: UIImage?
  41. public var shareButtonImage: UIImage?
  42. public var clearButtonImage: UIImage?
  43. public var continueButtonImage: UIImage?
  44. public var cancelButtonImage: UIImage?
  45. public var image: UIImage?
  46. /**
  47. Array of Stickers -UIImage- that the user will choose from
  48. */
  49. public var stickers : [UIImage] = []
  50. /**
  51. Array of Colors that will show while drawing or typing
  52. */
  53. public var colors : [UIColor] = []
  54. public var photoEditorDelegate: PhotoEditorDelegate?
  55. var colorsCollectionViewDelegate: ColorsCollectionViewDelegate!
  56. // list of controls to be hidden
  57. public var hiddenControls : [control] = []
  58. var stickersVCIsVisible = false
  59. var drawColor: UIColor = UIColor.black
  60. var textColor: UIColor = UIColor.white
  61. var isDrawing: Bool = false
  62. var lastPoint: CGPoint!
  63. var swiped = false
  64. var lastPanPoint: CGPoint?
  65. var lastTextViewTransform: CGAffineTransform?
  66. var lastTextViewTransCenter: CGPoint?
  67. var lastTextViewFont:UIFont?
  68. var activeTextView: UITextView?
  69. var imageViewToPan: UIImageView?
  70. var isTyping: Bool = false
  71. var stickersViewController: StickersViewController!
  72. //Register Custom font before we load XIB
  73. public override func loadView() {
  74. registerFont()
  75. super.loadView()
  76. }
  77. override public func viewDidLoad() {
  78. super.viewDidLoad()
  79. self.setImageView(image: image!)
  80. setCustomImages()
  81. deleteView.layer.cornerRadius = deleteView.bounds.height / 2
  82. deleteView.layer.borderWidth = 2.0
  83. deleteView.layer.borderColor = UIColor.white.cgColor
  84. deleteView.clipsToBounds = true
  85. let edgePan = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(screenEdgeSwiped))
  86. edgePan.edges = .bottom
  87. edgePan.delegate = self
  88. self.view.addGestureRecognizer(edgePan)
  89. NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow),
  90. name: UIResponder.keyboardDidShowNotification, object: nil)
  91. NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide),
  92. name: UIResponder.keyboardWillHideNotification, object: nil)
  93. NotificationCenter.default.addObserver(self,selector: #selector(keyboardWillChangeFrame(_:)),
  94. name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
  95. configureCollectionView()
  96. stickersViewController = StickersViewController(nibName: "StickersViewController", bundle: Bundle(for: StickersViewController.self))
  97. hideControls()
  98. }
  99. func configureCollectionView() {
  100. let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
  101. layout.itemSize = CGSize(width: 30, height: 30)
  102. layout.scrollDirection = .horizontal
  103. layout.minimumInteritemSpacing = 0
  104. layout.minimumLineSpacing = 0
  105. colorsCollectionView.collectionViewLayout = layout
  106. colorsCollectionViewDelegate = ColorsCollectionViewDelegate()
  107. colorsCollectionViewDelegate.colorDelegate = self
  108. if !colors.isEmpty {
  109. colorsCollectionViewDelegate.colors = colors
  110. }
  111. colorsCollectionView.delegate = colorsCollectionViewDelegate
  112. colorsCollectionView.dataSource = colorsCollectionViewDelegate
  113. colorsCollectionView.register(
  114. UINib(nibName: "ColorCollectionViewCell", bundle: Bundle(for: ColorCollectionViewCell.self)),
  115. forCellWithReuseIdentifier: "ColorCollectionViewCell")
  116. }
  117. func setImageView(image: UIImage) {
  118. imageView.image = image
  119. let size = image.suitableSize(widthLimit: UIScreen.main.bounds.width)
  120. imageViewHeightConstraint.constant = (size?.height)!
  121. }
  122. func setCustomImages() {
  123. setImage(cropButtonImage, forButton: cropButton)
  124. setImage(stickerButtonImage, forButton: stickerButton)
  125. setImage(drawButtonImage, forButton: drawButton)
  126. setImage(textButtonImage, forButton: textButton)
  127. setImage(saveButtonImage, forButton: saveButton)
  128. setImage(shareButtonImage, forButton: shareButton)
  129. setImage(clearButtonImage, forButton: clearButton)
  130. setImage(continueButtonImage, forButton: continueButton)
  131. setImage(cancelButtonImage, forButton: cancelButton)
  132. }
  133. func setImage(_ image: UIImage?, forButton button: UIButton) {
  134. guard let image = image else { return }
  135. button.setTitle(nil, for: .normal)
  136. button.setImage(image.withRenderingMode(.alwaysTemplate), for: .normal)
  137. button.tintColor = .white
  138. }
  139. func hideToolbar(hide: Bool) {
  140. topToolbar.isHidden = hide
  141. topGradient.isHidden = hide
  142. bottomToolbar.isHidden = hide
  143. bottomGradient.isHidden = hide
  144. }
  145. }
  146. extension PhotoEditorViewController: ColorDelegate {
  147. func didSelectColor(color: UIColor) {
  148. if isDrawing {
  149. self.drawColor = color
  150. } else if activeTextView != nil {
  151. activeTextView?.textColor = color
  152. textColor = color
  153. }
  154. }
  155. }