EditScanCornerView.swift 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. //
  2. // EditScanCornerView.swift
  3. // WeScan
  4. //
  5. // Created by Boris Emorine on 3/5/18.
  6. // Copyright © 2018 WeTransfer. All rights reserved.
  7. //
  8. import UIKit
  9. /// A UIView used by corners of a quadrilateral that is aware of its position.
  10. final class EditScanCornerView: UIView {
  11. let position: CornerPosition
  12. /// The image to display when the corner view is highlighted.
  13. private var image: UIImage?
  14. private(set) var isHighlighted = false
  15. lazy private var circleLayer: CAShapeLayer = {
  16. let layer = CAShapeLayer()
  17. layer.fillColor = UIColor.clear.cgColor
  18. layer.strokeColor = UIColor.white.cgColor
  19. layer.lineWidth = 1.0
  20. return layer
  21. }()
  22. init(frame: CGRect, position: CornerPosition) {
  23. self.position = position
  24. super.init(frame: frame)
  25. backgroundColor = UIColor.clear
  26. clipsToBounds = true
  27. layer.addSublayer(circleLayer)
  28. }
  29. required init?(coder aDecoder: NSCoder) {
  30. fatalError("init(coder:) has not been implemented")
  31. }
  32. override func layoutSubviews() {
  33. super.layoutSubviews()
  34. layer.cornerRadius = bounds.width / 2.0
  35. }
  36. override func draw(_ rect: CGRect) {
  37. super.draw(rect)
  38. let bezierPath = UIBezierPath(ovalIn: rect.insetBy(dx: circleLayer.lineWidth, dy: circleLayer.lineWidth))
  39. circleLayer.frame = rect
  40. circleLayer.path = bezierPath.cgPath
  41. image?.draw(in: rect)
  42. }
  43. func highlightWithImage(_ image: UIImage) {
  44. isHighlighted = true
  45. self.image = image
  46. self.setNeedsDisplay()
  47. }
  48. func reset() {
  49. isHighlighted = false
  50. image = nil
  51. setNeedsDisplay()
  52. }
  53. }