// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. import UIKit final class ScrollToBottomButton: UIView { private weak var delegate: ScrollToBottomButtonDelegate? // MARK: - Settings private static let size: CGFloat = 40 private static let iconSize: CGFloat = 16 // MARK: - Lifecycle init(delegate: ScrollToBottomButtonDelegate) { self.delegate = delegate super.init(frame: CGRect.zero) setUpViewHierarchy() } override init(frame: CGRect) { preconditionFailure("Use init(delegate:) instead.") } required init?(coder: NSCoder) { preconditionFailure("Use init(delegate:) instead.") } private func setUpViewHierarchy() { // Background & blur let backgroundView = UIView() backgroundView.backgroundColor = isLightMode ? .white : .black backgroundView.alpha = Values.lowOpacity addSubview(backgroundView) backgroundView.pin(to: self) let blurView = UIVisualEffectView(effect: UIBlurEffect(style: .regular)) addSubview(blurView) blurView.pin(to: self) // Size & shape let size = ScrollToBottomButton.size set(.width, to: size) set(.height, to: size) layer.cornerRadius = size / 2 layer.masksToBounds = true // Border layer.borderWidth = Values.separatorThickness let borderColor = (isLightMode ? UIColor.black : UIColor.white).withAlphaComponent(Values.veryLowOpacity) layer.borderColor = borderColor.cgColor // Icon let tint = isLightMode ? UIColor.black : UIColor.white let icon = UIImage(named: "ic_chevron_down")!.withTint(tint) let iconImageView = UIImageView(image: icon) iconImageView.set(.width, to: ScrollToBottomButton.iconSize) iconImageView.set(.height, to: ScrollToBottomButton.iconSize) iconImageView.contentMode = .scaleAspectFit addSubview(iconImageView) iconImageView.center(in: self) // Gesture recognizer let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap)) addGestureRecognizer(tapGestureRecognizer) } // MARK: - Interaction @objc private func handleTap() { delegate?.handleScrollToBottomButtonTapped() } } // MARK: - ScrollToBottomButtonDelegate protocol ScrollToBottomButtonDelegate: AnyObject { func handleScrollToBottomButtonTapped() }