diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index aa46ef9f5..5a97d4ba8 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -4180,13 +4180,10 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { // Canary check in case we later have another reason to set navigationController.delegate - we don't // want to inadvertently clobber it here. - OWSAssert(self.navigationController.delegate == nil) self.navigationController.delegate = self; - TSMessage *message = (TSMessage *)interaction; - MessageDetailViewController *view = - [[MessageDetailViewController alloc] initWithViewItem:conversationItem - message:message - mode:MessageMetadataViewModeFocusOnMetadata]; - [self.navigationController pushViewController:view animated:YES]; + OWSAssert(self.navigationController.delegate == nil); + self.navigationController.delegate = self; + + [self showMetadataViewForViewItem:conversationItem]; } else { OWSFail(@"%@ Can't show message metadata for message of type: %@", self.logTag, [interaction class]); } diff --git a/Signal/src/ViewControllers/MessageDetailViewController.swift b/Signal/src/ViewControllers/MessageDetailViewController.swift index bac831bcd..2c20f4371 100644 --- a/Signal/src/ViewControllers/MessageDetailViewController.swift +++ b/Signal/src/ViewControllers/MessageDetailViewController.swift @@ -38,7 +38,7 @@ class MessageDetailViewController: OWSViewController, UIScrollViewDelegate { var messageTextProxyViewHeightConstraint: NSLayoutConstraint? var bubbleViewWidthConstraint: NSLayoutConstraint? - var scrollView: UIScrollView? + var scrollView: UIScrollView! var contentView: UIView? var attachment: TSAttachment? @@ -96,11 +96,22 @@ class MessageDetailViewController: OWSViewController, UIScrollViewDelegate { view.setNeedsLayout() view.layoutIfNeeded() + let contentHeight = scrollView.contentSize.height + let scrollViewHeight = scrollView.frame.size.height + guard contentHeight >= scrollViewHeight else { + // All content is visible within the scroll view. No need to offset. + return + } + + // We want to include at least a little portion of the message, but scroll no farther than necessary. let showAtLeast: CGFloat = 50 - let middleCenter = CGPoint(x: bubbleView.frame.origin.x + bubbleView.frame.width / 2, - y: bubbleView.frame.origin.y + bubbleView.frame.height - showAtLeast) - let offset = bubbleView.superview!.convert(middleCenter, to: scrollView) - self.scrollView!.setContentOffset(offset, animated: false) + let bubbleViewBottom = bubbleView.superview!.convert(bubbleView.frame, to: scrollView).maxY + let maxOffset = bubbleViewBottom - showAtLeast + let lastPage = contentHeight - scrollViewHeight + + let offset = CGPoint(x: 0, y: min(maxOffset, lastPage)) + + scrollView.setContentOffset(offset, animated: false) } } }