diff --git a/SignalMessaging/ViewControllers/AttachmentApprovalViewController.swift b/SignalMessaging/ViewControllers/AttachmentApprovalViewController.swift index 32541bfb7..d3967042e 100644 --- a/SignalMessaging/ViewControllers/AttachmentApprovalViewController.swift +++ b/SignalMessaging/ViewControllers/AttachmentApprovalViewController.swift @@ -197,6 +197,11 @@ public class AttachmentApprovalViewController: UIPageViewController, UIPageViewC } self.setCurrentItem(firstItem, direction: .forward, animated: false) + + NotificationCenter.default.addObserver(self, + selector: #selector(keyboardWillChangeFrame(notification:)), + name: .UIKeyboardWillChangeFrame, + object: nil) } override public func viewWillAppear(_ animated: Bool) { @@ -230,6 +235,35 @@ public class AttachmentApprovalViewController: UIPageViewController, UIPageViewC return true } + var lastKnownBottomToolbarInset: CGFloat = 0 + + @objc + func keyboardWillChangeFrame(notification: Notification) { + Logger.debug("") + + // NSDictionary *userInfo = [notification userInfo]; + guard let userInfo = notification.userInfo else { + owsFailDebug("userInfo was unexpectedly nil") + return + } + + guard let keyboardEndFrame = userInfo[UIKeyboardFrameEndUserInfoKey] as? CGRect else { + owsFailDebug("keyboardEndFrame was unexpectedly nil") + return + } + + lastKnownBottomToolbarInset = keyboardEndFrame.size.height + + viewControllers?.forEach { viewController in + guard let prepViewController = viewController as? AttachmentPrepViewController else { + owsFailDebug("unexpected prepViewController: \(viewController)") + return + } + + prepViewController.update(bottomToolbarInset: lastKnownBottomToolbarInset) + } + } + // MARK: - View Helpers func remove(attachmentItem: SignalAttachmentItem) { @@ -516,6 +550,10 @@ extension AttachmentApprovalViewController: AttachmentPrepViewControllerDelegate func prepViewController(_ prepViewController: AttachmentPrepViewController, didUpdateCaptionForAttachmentItem attachmentItem: SignalAttachmentItem) { self.approvalDelegate?.attachmentApproval?(self, changedCaptionOfAttachment: attachmentItem.attachment) } + + var bottomToolbarInset: CGFloat { + return lastKnownBottomToolbarInset + } } // MARK: GalleryRail @@ -563,6 +601,8 @@ extension AttachmentApprovalViewController: GalleryRailViewDelegate { protocol AttachmentPrepViewControllerDelegate: class { func prepViewController(_ prepViewController: AttachmentPrepViewController, didUpdateCaptionForAttachmentItem attachmentItem: SignalAttachmentItem) + + var bottomToolbarInset: CGFloat { get } } public class AttachmentPrepViewController: OWSViewController, PlayerProgressBarDelegate, OWSVideoPlayerDelegate { @@ -718,53 +758,16 @@ public class AttachmentPrepViewController: OWSViewController, PlayerProgressBarD // 1. when no keyboard is popped (e.g. initially) to be *just* above the rail // 2. when the CaptionTextView is first responder, to be *just* above the keyboard // 3. when the MessageTextView is first responder, to be behind the keyboard - captionViewBottomConstraint = captionView.autoPinEdge(toSuperviewMargin: .bottom, withInset: kDefaultCaptionViewBottomInset) - NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChangeFrame(notification:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil) - } - - @objc - func keyboardWillChangeFrame(notification: Notification) { - Logger.debug("") - - // NSDictionary *userInfo = [notification userInfo]; - guard let userInfo = notification.userInfo else { - owsFailDebug("userInfo was unexpectedly nil") + guard let prepDelegate = self.prepDelegate else { + owsFailDebug("prepDelegate was unexpectedly nil") return } -// NSValue *_Nullable keyboardBeginFrameValue = userInfo[UIKeyboardFrameBeginUserInfoKey]; -// if (!keyboardBeginFrameValue) { -// OWSFailDebug(@"Missing keyboard begin frame"); -// return; -// } -// -// NSValue *_Nullable keyboardEndFrameValue = userInfo[UIKeyboardFrameEndUserInfoKey]; -// if (!keyboardEndFrameValue) { -// OWSFailDebug(@"Missing keyboard end frame"); -// return; -// } -// -// CGRect keyboardEndFrame = [keyboardEndFrameValue CGRectValue]; - - guard let keyboardEndFrame = userInfo[UIKeyboardFrameEndUserInfoKey] as? CGRect else { - owsFailDebug("keyboardEndFrame was unexpectedly nil") - return - } - - Logger.debug("keyboardEndFrame: \(keyboardEndFrame)") - let totalInset = kDefaultCaptionViewBottomInset + keyboardEndFrame.size.height - captionViewBottomConstraint.constant = -totalInset - - captionView.superview?.layoutIfNeeded() -// -// UIEdgeInsets oldInsets = self.collectionView.contentInset; -// UIEdgeInsets newInsets = oldInsets; + let bottomToolbarInset = prepDelegate.bottomToolbarInset + captionViewBottomConstraint = captionView.autoPinEdge(toSuperviewMargin: .bottom, withInset: bottomToolbarInset) } - let kDefaultCaptionViewBottomInset: CGFloat = 0 - var captionViewBottomConstraint: NSLayoutConstraint! - override public func viewWillLayoutSubviews() { Logger.debug("") super.viewWillLayoutSubviews() @@ -775,6 +778,14 @@ public class AttachmentPrepViewController: OWSViewController, PlayerProgressBarD ensureAttachmentViewScale(animated: false) } + // MARK: CaptionView lifts with keyboard + + var captionViewBottomConstraint: NSLayoutConstraint! + func update(bottomToolbarInset: CGFloat) { + captionViewBottomConstraint.constant = -bottomToolbarInset + captionView.superview?.layoutIfNeeded() + } + // MARK: - @objc public func didTapPlayerView(_ gestureRecognizer: UIGestureRecognizer) {