InitialsBadge.swift 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import UIKit
  2. import DcCore
  3. public class InitialsBadge: UIView {
  4. private let size: CGFloat
  5. var leadingImageAnchorConstraint: NSLayoutConstraint?
  6. var trailingImageAnchorConstraint: NSLayoutConstraint?
  7. var topImageAnchorConstraint: NSLayoutConstraint?
  8. var bottomImageAnchorConstraint: NSLayoutConstraint?
  9. public var imagePadding: CGFloat = 0 {
  10. didSet {
  11. leadingImageAnchorConstraint?.constant = imagePadding
  12. topImageAnchorConstraint?.constant = imagePadding
  13. trailingImageAnchorConstraint?.constant = -imagePadding
  14. bottomImageAnchorConstraint?.constant = -imagePadding
  15. }
  16. }
  17. private var label: UILabel = {
  18. let label = UILabel()
  19. label.textAlignment = NSTextAlignment.center
  20. label.textColor = UIColor.white
  21. label.translatesAutoresizingMaskIntoConstraints = false
  22. label.isAccessibilityElement = false
  23. return label
  24. }()
  25. private var recentlySeenView: UIView = {
  26. let view = UIView()
  27. view.translatesAutoresizingMaskIntoConstraints = false
  28. view.backgroundColor = DcColors.recentlySeenDot
  29. view.clipsToBounds = true
  30. view.isHidden = true
  31. return view
  32. }()
  33. private var imageView: UIImageView = {
  34. let imageViewContainer = UIImageView()
  35. imageViewContainer.clipsToBounds = true
  36. imageViewContainer.translatesAutoresizingMaskIntoConstraints = false
  37. return imageViewContainer
  38. }()
  39. private lazy var unreadMessageCounter: MessageCounter = {
  40. let view = MessageCounter(count: 0, size: 20)
  41. view.backgroundColor = DcColors.unreadBadge
  42. view.isHidden = true
  43. view.isAccessibilityElement = false
  44. return view
  45. }()
  46. public convenience init(name: String, color: UIColor, size: CGFloat, accessibilityLabel: String? = nil) {
  47. self.init(size: size, accessibilityLabel: accessibilityLabel)
  48. setName(name)
  49. setColor(color)
  50. }
  51. public convenience init (image: UIImage, size: CGFloat, accessibilityLabel: String? = nil) {
  52. self.init(size: size, accessibilityLabel: accessibilityLabel)
  53. setImage(image)
  54. }
  55. public init(size: CGFloat, accessibilityLabel: String? = nil) {
  56. self.size = size
  57. super.init(frame: CGRect(x: 0, y: 0, width: size, height: size))
  58. self.accessibilityLabel = accessibilityLabel
  59. let radius = size / 2
  60. layer.cornerRadius = radius
  61. translatesAutoresizingMaskIntoConstraints = false
  62. heightAnchor.constraint(equalToConstant: size).isActive = true
  63. widthAnchor.constraint(equalToConstant: size).isActive = true
  64. label.font = UIFont.systemFont(ofSize: size * 3 / 5)
  65. setupSubviews(with: radius)
  66. isAccessibilityElement = true
  67. }
  68. private func setupSubviews(with radius: CGFloat) {
  69. addSubview(imageView)
  70. imageView.layer.cornerRadius = radius
  71. leadingImageAnchorConstraint = imageView.constraintAlignLeadingToAnchor(leadingAnchor)
  72. trailingImageAnchorConstraint = imageView.constraintAlignTrailingToAnchor(trailingAnchor)
  73. topImageAnchorConstraint = imageView.constraintAlignTopToAnchor(topAnchor)
  74. bottomImageAnchorConstraint = imageView.constraintAlignBottomToAnchor(bottomAnchor)
  75. addSubview(label)
  76. label.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
  77. label.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
  78. label.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
  79. addSubview(recentlySeenView)
  80. addSubview(unreadMessageCounter)
  81. let imgViewConstraints = [recentlySeenView.constraintAlignBottomTo(self),
  82. recentlySeenView.constraintAlignTrailingTo(self),
  83. recentlySeenView.constraintHeightTo(radius * 0.6),
  84. recentlySeenView.constraintWidthTo(radius * 0.6),
  85. unreadMessageCounter.constraintAlignTopTo(self),
  86. unreadMessageCounter.constraintAlignTrailingTo(self, paddingTrailing: -8)
  87. ]
  88. recentlySeenView.layer.cornerRadius = radius * 0.3
  89. addConstraints(imgViewConstraints)
  90. }
  91. required init?(coder _: NSCoder) {
  92. fatalError("init(coder:) has not been implemented")
  93. }
  94. public func setName(_ name: String) {
  95. label.text = DcUtils.getInitials(inputName: name)
  96. label.isHidden = name.isEmpty
  97. imageView.isHidden = !name.isEmpty
  98. }
  99. public func setLabelFont(_ font: UIFont) {
  100. label.font = font
  101. }
  102. public func setImage(_ image: UIImage) {
  103. self.imageView.image = image
  104. self.imageView.contentMode = UIView.ContentMode.scaleAspectFill
  105. self.imageView.isHidden = false
  106. self.label.isHidden = true
  107. }
  108. public func showsInitials() -> Bool {
  109. return !label.isHidden
  110. }
  111. public func setColor(_ color: UIColor) {
  112. backgroundColor = color
  113. }
  114. public func setRecentlySeen(_ seen: Bool) {
  115. recentlySeenView.isHidden = !seen
  116. }
  117. public func setUnreadMessageCount(_ messageNo: Int) {
  118. unreadMessageCounter.setCount(messageNo)
  119. unreadMessageCounter.isHidden = messageNo == 0
  120. }
  121. public func reset() {
  122. imageView.image = nil
  123. label.text = nil
  124. accessibilityLabel = nil
  125. }
  126. public func asImage() -> UIImage? {
  127. UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0.0)
  128. if let context = UIGraphicsGetCurrentContext() {
  129. layer.render(in: context)
  130. let image = UIGraphicsGetImageFromCurrentImageContext()
  131. UIGraphicsEndImageContext()
  132. return image
  133. }
  134. return nil
  135. }
  136. }