Signal-iOS/SignalMessaging/ViewControllers/Stickers/StickerKeyboard.swift
2019-04-26 12:15:11 -04:00

225 lines
6.7 KiB
Swift

//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
import Foundation
@objc
public protocol StickerKeyboardDelegate {
func didSelectSticker(stickerInfo: StickerInfo)
}
// MARK: -
@objc
public class StickerKeyboard: UIStackView {
@objc
public weak var delegate: StickerKeyboardDelegate?
@objc
override public var frame: CGRect {
didSet {
logLayout()
}
}
@objc
override public var bounds: CGRect {
didSet {
logLayout()
}
}
private func logLayout() {
Logger.verbose("----- frame: \(frame), bounds: \(bounds)")
Logger.verbose("----- \t: \(headerView.frame)")
Logger.verbose("----- \t: \(stickerCollectionView.frame)")
Logger.verbose("----- \t: \(footerView.frame)")
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2.0) {
Logger.verbose("----- frame: \(self.frame), bounds: \(self.bounds)")
Logger.verbose("----- \t: \(self.headerView.frame)")
Logger.verbose("----- \t: \(self.stickerCollectionView.frame)")
Logger.verbose("----- \t: \(self.footerView.frame)")
}
}
private let headerView = UIStackView()
private let stickerCollectionView = StickerPackCollectionView()
private let footerView = UIStackView()
private var stickerPacks = [StickerPack]()
private var stickerPack: StickerPack? {
didSet {
AssertIsOnMainThread()
stickerCollectionView.stickerPack = stickerPack
}
}
@objc
public required init() {
super.init(frame: .zero)
createSubviews()
reloadStickers()
NotificationCenter.default.addObserver(self,
selector: #selector(stickersOrPacksDidChange),
name: StickerManager.StickersOrPacksDidChange,
object: nil)
}
@objc
public override var intrinsicContentSize: CGSize {
// Since we have `self.autoresizingMask = UIViewAutoresizingFlexibleHeight`, we must specify
// an intrinsicContentSize. Specifying CGSize.zero causes the height to be determined by autolayout.
return CGSize(width: 0, height: 200)
// return .zero
}
private func createSubviews() {
self.axis = .vertical
self.layoutMargins = .zero
self.autoresizingMask = .flexibleHeight
self.alignment = .fill
self.addBackgroundView(withBackgroundColor: .red)
headerView.axis = .horizontal
addArrangedSubview(headerView)
headerView.setContentHuggingVerticalHigh()
headerView.setCompressionResistanceVerticalHigh()
headerView.autoSetDimension(.height, toSize: 44)
headerView.backgroundColor = .green
stickerCollectionView.backgroundColor = .orange
stickerCollectionView.stickerDelegate = self
addArrangedSubview(stickerCollectionView)
stickerCollectionView.setContentHuggingVerticalLow()
stickerCollectionView.setCompressionResistanceVerticalLow()
// stickerCollectionView.autoSetDimension(.height, toSize: 100)
// footerView.axis = .horizontal
// footerView.alignment = .center
// addArrangedSubview(footerView)
// footerView.setContentHuggingVerticalHigh()
// footerView.setCompressionResistanceVerticalHigh()
}
private func reloadStickers() {
stickerPacks = StickerManager.installedStickerPacks()
guard stickerPacks.count > 0 else {
stickerPack = nil
return
}
if stickerPack == nil {
stickerPack = stickerPacks.first
}
// TODO: Reload header?
}
// MARK: Events
@objc func stickersOrPacksDidChange() {
AssertIsOnMainThread()
Logger.verbose("")
reloadStickers()
}
// @objc
// public required init(thread: TSThread, contactsManager: OWSContactsManager) {
//
// let avatarView = ConversationAvatarImageView(thread: thread, diameter: 36, contactsManager: contactsManager)
// self.avatarView = avatarView
// // remove default border on avatarView
// avatarView.layer.borderWidth = 0
//
// titleLabel = UILabel()
// titleLabel.textColor = Theme.navbarTitleColor
// titleLabel.lineBreakMode = .byTruncatingTail
// titleLabel.font = titlePrimaryFont
// titleLabel.setContentHuggingHigh()
//
// subtitleLabel = UILabel()
// subtitleLabel.textColor = Theme.navbarTitleColor
// subtitleLabel.lineBreakMode = .byTruncatingTail
// subtitleLabel.font = subtitleFont
// subtitleLabel.setContentHuggingHigh()
//
// let textRows = UIStackView(arrangedSubviews: [titleLabel, subtitleLabel])
// textRows.axis = .vertical
// textRows.alignment = .leading
// textRows.distribution = .fillProportionally
// textRows.spacing = 0
//
// textRows.layoutMargins = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 8)
// textRows.isLayoutMarginsRelativeArrangement = true
//
// // low content hugging so that the text rows push container to the right bar button item(s)
// textRows.setContentHuggingLow()
//
// super.init(frame: .zero)
//
// self.layoutMargins = UIEdgeInsets(top: 4, left: 2, bottom: 4, right: 2)
// self.isLayoutMarginsRelativeArrangement = true
//
// self.axis = .horizontal
// self.alignment = .center
// self.spacing = 0
// self.addArrangedSubview(avatarView)
// self.addArrangedSubview(textRows)
//
// let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTapView))
// self.addGestureRecognizer(tapGesture)
// }
required public init(coder: NSCoder) {
notImplemented()
}
// required public override init(frame: CGRect) {
// notImplemented()
// }
//
// public override var intrinsicContentSize: CGSize {
// // Grow to fill as much of the navbar as possible.
// return UIView.layoutFittingExpandedSize
// }
//
// @objc
// public func updateAvatar() {
// self.avatarView.updateImage()
// }
//
// // MARK: Delegate Methods
//
// @objc func didTapView(tapGesture: UITapGestureRecognizer) {
// guard tapGesture.state == .recognized else {
// return
// }
//
// self.delegate?.didTapConversationHeaderView(self)
// }
}
// MARK: -
extension StickerKeyboard: StickerPackCollectionViewDelegate {
public func didTapSticker(stickerInfo: StickerInfo) {
AssertIsOnMainThread()
Logger.verbose("")
delegate?.didSelectSticker(stickerInfo: stickerInfo)
}
}