From 314e3cbf03625cb7f3c6c0f9136dec9664c4351e Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Mon, 9 Apr 2018 18:13:44 -0400 Subject: [PATCH] Drive quote authoring with QuotedMessageView // FREEBIE --- Signal/src/views/QuotedReplyPreview.swift | 118 ++++++---------------- 1 file changed, 32 insertions(+), 86 deletions(-) diff --git a/Signal/src/views/QuotedReplyPreview.swift b/Signal/src/views/QuotedReplyPreview.swift index 02ce456ca..dcb6dc3e9 100644 --- a/Signal/src/views/QuotedReplyPreview.swift +++ b/Signal/src/views/QuotedReplyPreview.swift @@ -13,100 +13,40 @@ protocol QuotedReplyPreviewDelegate: class { class QuotedReplyPreview: UIView { public weak var delegate: QuotedReplyPreviewDelegate? + private let quotedReply: OWSQuotedReplyModel + private var quotedMessageView: OWSQuotedMessageView + private var heightConstraint: NSLayoutConstraint! + required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } init(quotedReply: OWSQuotedReplyModel) { + self.quotedReply = quotedReply + self.quotedMessageView = OWSQuotedMessageView(forPreview: quotedReply) + super.init(frame: .zero) - let quotedMessageView = OWSQuotedMessageView(forPreview: quotedReply) - quotedMessageView.backgroundColor = .clear + self.heightConstraint = self.autoSetDimension(.height, toSize: 0) - let isQuotingSelf = quotedReply.authorId == TSAccountManager.localNumber() + updateContents() - // used for stripe and author - // FIXME actual colors TBD - let authorColor: UIColor = isQuotingSelf ? .ows_materialBlue : .black + NotificationCenter.default.addObserver(self, selector: #selector(contentSizeCategoryDidChange), name: .UIContentSizeCategoryDidChange, object: nil) + } - // used for text and cancel - let foregroundColor: UIColor = .darkGray + func updateContents() { + subviews.forEach { $0.removeFromSuperview() } + self.quotedMessageView = OWSQuotedMessageView(forPreview: quotedReply) -// let authorLabel: UILabel = UILabel() -// authorLabel.textColor = authorColor -// if isQuotingSelf { -// authorLabel.text = NSLocalizedString("MEDIA_GALLERY_SENDER_NAME_YOU", comment: "") -// } else { -// authorLabel.text = Environment.current().contactsManager.displayName(forPhoneIdentifier: quotedReply.authorId) -// } -// authorLabel.font = .ows_dynamicTypeHeadline -// -// let bodyLabel: UILabel = UILabel() -// bodyLabel.textColor = foregroundColor -// bodyLabel.font = .ows_dynamicTypeFootnote -// -// bodyLabel.text = { -// if let contentType = quotedReply.contentType { -// let emoji = TSAttachmentStream.emoji(forMimeType: contentType) -// return "\(emoji) \(quotedReply.body ?? "")" -// } else { -// return quotedReply.body -// } -// }() -// -// let thumbnailView: UIView? = { -// if let image = quotedReply.thumbnailImage { -// let imageView = UIImageView(image: image) -// imageView.contentMode = .scaleAspectFill -// imageView.autoPinToSquareAspectRatio() -// imageView.layer.cornerRadius = 3.0 -// imageView.clipsToBounds = true -// -// return imageView -// } -// return nil -// }() + quotedMessageView.backgroundColor = .clear let cancelButton: UIButton = UIButton(type: .custom) - // FIXME proper image asset/size + let buttonImage: UIImage = #imageLiteral(resourceName: "quoted-message-cancel").withRenderingMode(.alwaysTemplate) cancelButton.setImage(buttonImage, for: .normal) - cancelButton.imageView?.tintColor = foregroundColor + cancelButton.imageView?.tintColor = .darkGray cancelButton.addTarget(self, action: #selector(didTapCancel), for: .touchUpInside) -//// let quoteStripe: UIView = UIView() -//// quoteStripe.backgroundColor = authorColor -//// -//// let textColumn = UIView.container() -//// textColumn.addSubview(authorLabel) -//// textColumn.addSubview(bodyLabel) -//// -//// authorLabel.autoPinEdges(toSuperviewMarginsExcludingEdge: .bottom) -//// authorLabel.autoPinEdge(.bottom, to: .top, of: bodyLabel) -//// bodyLabel.autoPinEdges(toSuperviewMarginsExcludingEdge: .top) -//// -//// let contentViews: [UIView] = [textColumn, thumbnailView, cancelButton].flatMap { return $0 } -// -// let contentViews: [UIView] = [quotedMessageView, cancelButton] -// let contentRow = UIStackView(arrangedSubviews: contentViews) -// contentRow.axis = .horizontal -// self.addSubview(contentRow) -//// self.addSubview(quoteStripe) -//// -//// // Layout -//// -//// let kQuoteStripeWidth: CGFloat = 4 -//// self.layoutMargins = UIEdgeInsets(top: 6, -//// left: kQuoteStripeWidth + 8, -//// bottom: 2, -//// right: 4) -//// -//// quoteStripe.autoPinEdge(toSuperviewEdge: .leading) -//// quoteStripe.autoPinHeightToSuperview() -//// quoteStripe.autoSetDimension(.width, toSize: kQuoteStripeWidth) -//// -// contentRow.autoPinEdgesToSuperviewMargins() - self.layoutMargins = .zero self.addSubview(quotedMessageView) @@ -118,20 +58,26 @@ class QuotedReplyPreview: UIView { cancelButton.autoSetDimensions(to: CGSize(width: 40, height: 40)) - // TODO this is arbitrary and breaks with dynamic type - self.autoSetDimension(.height, toSize: 70) - } - - // MARK: UIViewOverrides - - // Used by stack view to determin size. - override var intrinsicContentSize: CGSize { - return CGSize(width: 0, height: 50) + updateHeight() } // MARK: Actions + @objc func didTapCancel(_ sender: Any) { self.delegate?.quotedReplyPreviewDidPressCancel(self) } + + // MARK: Sizing + + func updateHeight() { + let size = self.quotedMessageView.size(forMaxWidth: CGFloat.infinity) + self.heightConstraint.constant = size.height + } + + func contentSizeCategoryDidChange(_ notification: Notification) { + Logger.debug("\(self.logTag) in \(#function)") + + updateContents() + } }