Scroll only as far as necessary

// FREEBIE
This commit is contained in:
Michael Kirk 2017-11-15 12:50:56 -05:00
parent 15a407de13
commit 9675cbb1e1
2 changed files with 20 additions and 12 deletions

View File

@ -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]);
}

View File

@ -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)
}
}
}