NetNewsWire/iOS/IconView.swift

124 lines
3.0 KiB
Swift
Raw Normal View History

2019-09-18 00:00:23 +02:00
//
// IconView.swift
2019-09-18 00:00:23 +02:00
// NetNewsWire-iOS
//
// Created by Maurice Parker on 9/17/19.
// Copyright © 2019 Ranchero Software. All rights reserved.
//
import UIKit
import UIKitExtras
import Images
2019-09-18 00:00:23 +02:00
final class IconView: UIView {
2019-09-18 00:00:23 +02:00
var iconImage: IconImage? = nil {
2019-09-18 00:00:23 +02:00
didSet {
guard iconImage !== oldValue else {
return
2019-09-18 00:00:23 +02:00
}
imageView.image = iconImage?.image
if traitCollection.userInterfaceStyle == .dark {
let isDark = iconImage?.isDark ?? false
isDiscernable = !isDark
}
else {
let isBright = iconImage?.isBright ?? false
isDiscernable = !isBright
}
setNeedsLayout()
2019-09-18 00:00:23 +02:00
}
}
2021-03-06 23:25:10 +01:00
private var isDiscernable = true
2019-09-18 00:00:23 +02:00
private let imageView: UIImageView = {
2024-07-10 06:11:21 +02:00
let imageView = NonIntrinsicImageView(image: AppAsset.faviconTemplate)
2019-09-18 00:00:23 +02:00
imageView.contentMode = .scaleAspectFit
imageView.clipsToBounds = true
imageView.layer.cornerRadius = 2.0
2019-09-18 00:00:23 +02:00
return imageView
}()
private var isVerticalBackgroundExposed: Bool {
2019-09-18 00:00:23 +02:00
return imageView.frame.size.height < bounds.size.height
}
private var isSymbolImage: Bool {
return iconImage?.isSymbol ?? false
}
private var isBackgroundSuppressed: Bool {
return iconImage?.isBackgroundSupressed ?? false
}
2019-09-18 00:00:23 +02:00
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
convenience init() {
self.init(frame: .zero)
}
override func didMoveToSuperview() {
setNeedsLayout()
}
override func layoutSubviews() {
imageView.setFrameIfNotEqual(rectForImageView())
updateBackgroundColor()
2019-09-18 00:00:23 +02:00
}
}
private extension IconView {
2019-09-18 00:00:23 +02:00
func commonInit() {
2024-02-26 17:37:15 +01:00
layer.cornerRadius = TimelineDefaultCellLayout.iconCornerRadius
2019-10-29 02:01:15 +01:00
clipsToBounds = true
2019-09-18 00:00:23 +02:00
addSubview(imageView)
}
func rectForImageView() -> CGRect {
guard let image = iconImage?.image else {
2019-09-18 00:00:23 +02:00
return CGRect.zero
}
let imageSize = image.size
let viewSize = bounds.size
if imageSize.height == imageSize.width {
if imageSize.height >= viewSize.height * 0.75 {
// Close enough to viewSize to scale up the image.
return CGRect(x: 0.0, y: 0.0, width: viewSize.width, height: viewSize.height)
}
let offset = floor((viewSize.height - imageSize.height) / 2.0)
return CGRect(x: offset, y: offset, width: imageSize.width, height: imageSize.height)
}
else if imageSize.height > imageSize.width {
let factor = viewSize.height / imageSize.height
let width = imageSize.width * factor
let originX = floor((viewSize.width - width) / 2.0)
return CGRect(x: originX, y: 0.0, width: width, height: viewSize.height)
}
// Wider than tall: imageSize.width > imageSize.height
let factor = viewSize.width / imageSize.width
let height = imageSize.height * factor
let originY = floor((viewSize.height - height) / 2.0)
return CGRect(x: 0.0, y: originY, width: viewSize.width, height: height)
}
private func updateBackgroundColor() {
if !isBackgroundSuppressed && ((iconImage != nil && isVerticalBackgroundExposed) || !isDiscernable) {
backgroundColor = AppAssets.iconBackgroundColor
} else {
backgroundColor = nil
}
}
2019-09-18 00:00:23 +02:00
}