session-ios/Session/Conversations/Views & Modals/RoundIconButton.swift

81 lines
2.4 KiB
Swift

// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import UIKit
import SessionUIKit
final class RoundIconButton: UIView {
private let onTap: () -> ()
// MARK: - Settings
private static let size: CGFloat = 40
private static let iconSize: CGFloat = 16
// MARK: - Lifecycle
init(image: UIImage?, onTap: @escaping () -> ()) {
self.onTap = onTap
super.init(frame: CGRect.zero)
setUpViewHierarchy(image: image)
}
override init(frame: CGRect) {
preconditionFailure("Use init(delegate:) instead.")
}
required init?(coder: NSCoder) {
preconditionFailure("Use init(delegate:) instead.")
}
private func setUpViewHierarchy(image: UIImage?) {
// Background & blur
let backgroundView = UIView()
backgroundView.themeBackgroundColor = .backgroundSecondary
backgroundView.alpha = Values.lowOpacity
addSubview(backgroundView)
backgroundView.pin(to: self)
let blurView = UIVisualEffectView()
addSubview(blurView)
blurView.pin(to: self)
ThemeManager.onThemeChange(observer: blurView) { [weak blurView] theme, _ in
switch theme.interfaceStyle {
case .light: blurView?.effect = UIBlurEffect(style: .light)
default: blurView?.effect = UIBlurEffect(style: .dark)
}
}
// Size & shape
set(.width, to: RoundIconButton.size)
set(.height, to: RoundIconButton.size)
layer.cornerRadius = (RoundIconButton.size / 2)
layer.masksToBounds = true
// Border
self.themeBorderColor = .borderSeparator
layer.borderWidth = Values.separatorThickness
// Icon
let iconImageView = UIImageView(image: image)
iconImageView.themeTintColor = .textPrimary
iconImageView.contentMode = .scaleAspectFit
addSubview(iconImageView)
iconImageView.center(in: self)
iconImageView.set(.width, to: RoundIconButton.iconSize)
iconImageView.set(.height, to: RoundIconButton.iconSize)
// Gesture recognizer
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
addGestureRecognizer(tapGestureRecognizer)
}
// MARK: - Interaction
@objc private func handleTap() {
onTap()
}
}