Nav apraksta

IndeedLogoView.swift 2.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. //
  2. // IndeedLogoView.swift
  3. // App for Indeed
  4. //
  5. import Cocoa
  6. /// App logo from the asset catalog for splash and branding surfaces.
  7. enum IndeedBrandLogo {
  8. enum Variant {
  9. case standard
  10. case compact
  11. }
  12. static func logoImage(variant: Variant = .standard) -> NSImage? {
  13. switch variant {
  14. case .standard:
  15. NSImage(named: NSImage.Name("IndeedLogo"))
  16. case .compact:
  17. NSImage(named: NSImage.Name("IndeedLogoSmall"))
  18. }
  19. }
  20. }
  21. final class IndeedLogoView: NSView {
  22. private let imageView = NSImageView()
  23. private let variant: IndeedBrandLogo.Variant
  24. private var displayHeight: CGFloat
  25. private var sizeConstraints: [NSLayoutConstraint] = []
  26. override var intrinsicContentSize: NSSize {
  27. NSSize(width: displayHeight, height: displayHeight)
  28. }
  29. init(displayHeight: CGFloat = 44, variant: IndeedBrandLogo.Variant = .standard) {
  30. self.displayHeight = displayHeight
  31. self.variant = variant
  32. super.init(frame: .zero)
  33. setUp()
  34. }
  35. @available(*, unavailable)
  36. required init?(coder: NSCoder) {
  37. fatalError("init(coder:) has not been implemented")
  38. }
  39. func setDisplayHeight(_ height: CGFloat) {
  40. displayHeight = height
  41. sizeConstraints.forEach { $0.constant = height }
  42. invalidateIntrinsicContentSize()
  43. }
  44. private func setUp() {
  45. translatesAutoresizingMaskIntoConstraints = false
  46. setContentHuggingPriority(.required, for: .horizontal)
  47. setContentHuggingPriority(.required, for: .vertical)
  48. setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
  49. setContentCompressionResistancePriority(.defaultLow, for: .vertical)
  50. imageView.translatesAutoresizingMaskIntoConstraints = false
  51. imageView.imageScaling = .scaleProportionallyUpOrDown
  52. imageView.image = IndeedBrandLogo.logoImage(variant: variant)
  53. addSubview(imageView)
  54. let width = widthAnchor.constraint(equalToConstant: displayHeight)
  55. let height = heightAnchor.constraint(equalToConstant: displayHeight)
  56. sizeConstraints = [width, height]
  57. NSLayoutConstraint.activate(sizeConstraints + [
  58. imageView.leadingAnchor.constraint(equalTo: leadingAnchor),
  59. imageView.trailingAnchor.constraint(equalTo: trailingAnchor),
  60. imageView.topAnchor.constraint(equalTo: topAnchor),
  61. imageView.bottomAnchor.constraint(equalTo: bottomAnchor)
  62. ])
  63. setAccessibilityElement(true)
  64. setAccessibilityRole(.image)
  65. setAccessibilityLabel(AppMarketingLinks.displayName)
  66. }
  67. }