Index: ios/chrome/browser/ui/omnibox/omnibox_popup_material_view_controller.mm |
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_popup_material_view_controller.mm b/ios/chrome/browser/ui/omnibox/omnibox_popup_material_view_controller.mm |
index ce278db71ab7317d037bc111a3f2da0cfbf2e742..96d23f78aeedbdaceb76ad00098c2940ebc8ccce 100644 |
--- a/ios/chrome/browser/ui/omnibox/omnibox_popup_material_view_controller.mm |
+++ b/ios/chrome/browser/ui/omnibox/omnibox_popup_material_view_controller.mm |
@@ -201,12 +201,11 @@ initWithPopupView:(OmniboxPopupViewIOS*)view |
const CGFloat kTextLabelHeight = 24; |
const CGFloat kTextDetailLabelHeight = 22; |
const CGFloat kAppendButtonWidth = 40; |
- const CGFloat kAnswerLabelHeight = 50; |
+ const CGFloat kAnswerLabelHeight = 36; |
const CGFloat kAnswerImageWidth = 30; |
const CGFloat kAnswerImageLeftPadding = -1; |
const CGFloat kAnswerImageRightPadding = 4; |
- const CGFloat kAnswerImageTopPadding = -3; |
- const CGFloat kAnswerRowPadding = 4; |
+ const CGFloat kAnswerImageTopPadding = 2; |
const BOOL alignmentRight = _alignment == NSTextAlignmentRight; |
BOOL LTRTextInRTLLayout = _alignment == NSTextAlignmentLeft && UseRTLLayout(); |
@@ -215,9 +214,6 @@ initWithPopupView:(OmniboxPopupViewIOS*)view |
const BOOL answerPresent = match.answer.get() != nil; |
row.rowHeight = answerPresent ? kAnswerRowHeight : kRowHeight; |
- [row.detailTruncatingLabel setTextAlignment:_alignment]; |
- [row.textTruncatingLabel setTextAlignment:_alignment]; |
- |
// Fetch the answer image if specified. Currently, no answer types specify an |
// image on the first line so for now we only look at the second line. |
const BOOL answerImagePresent = |
@@ -243,8 +239,7 @@ initWithPopupView:(OmniboxPopupViewIOS*)view |
imageLeftPadding = |
row.frame.size.width - (kAnswerImageWidth + kAppendButtonWidth); |
} |
- CGFloat imageTopPadding = |
- kDetailCellTopPadding + kAnswerRowPadding + kAnswerImageTopPadding; |
+ CGFloat imageTopPadding = kDetailCellTopPadding + kAnswerImageTopPadding; |
row.answerImageView.frame = |
CGRectMake(imageLeftPadding, imageTopPadding, kAnswerImageWidth, |
kAnswerImageWidth); |
@@ -256,7 +251,18 @@ initWithPopupView:(OmniboxPopupViewIOS*)view |
// DetailTextLabel and textLabel are fading labels placed in each row. The |
// textLabel is layed out above the detailTextLabel, and vertically centered |
// if the detailTextLabel is empty. |
- OmniboxPopupTruncatingLabel* detailTextLabel = row.detailTruncatingLabel; |
+ // For the detail text label, we use either the regular detail label, which |
+ // truncates by fading, or the answer label, which uses UILabel's standard |
+ // truncation by ellipse for the multi-line text sometimes shown in answers. |
+ row.detailTruncatingLabel.hidden = answerPresent; |
+ row.detailAnswerLabel.hidden = !answerPresent; |
+ // TODO(crbug.com/697647): The complexity of managing these two separate |
+ // labels could probably be encapusulated in the row class if we moved the |
+ // layout logic there. |
+ UILabel* detailTextLabel = |
+ answerPresent ? row.detailAnswerLabel : row.detailTruncatingLabel; |
+ [detailTextLabel setTextAlignment:_alignment]; |
+ |
// The width must be positive for CGContextRef to be valid. |
CGFloat labelWidth = |
MAX(40, floorf(row.frame.size.width) - kTextCellLeadingPadding); |
@@ -266,12 +272,10 @@ initWithPopupView:(OmniboxPopupViewIOS*)view |
CGFloat leadingPadding = |
(answerImagePresent && !alignmentRight ? answerImagePadding : 0) + |
kTextCellLeadingPadding; |
- CGFloat topPadding = |
- (answerPresent ? kAnswerRowPadding : 0) + kDetailCellTopPadding; |
LayoutRect detailTextLabelLayout = |
LayoutRectMake(leadingPadding, CGRectGetWidth(self.view.bounds), |
- topPadding, labelWidth, labelHeight); |
+ kDetailCellTopPadding, labelWidth, labelHeight); |
detailTextLabel.frame = LayoutRectGetRect(detailTextLabelLayout); |
// Details should be the URL (|match.contents|). For searches |match.contents| |
@@ -282,6 +286,15 @@ initWithPopupView:(OmniboxPopupViewIOS*)view |
if (answerPresent) { |
detailTextLabel.attributedText = |
[self attributedStringWithAnswerLine:match.answer->second_line()]; |
+ |
+ // Answers specify their own limit on the number of lines to show but we |
+ // additionally cap this at 3 to guard against unreasonable values. |
+ const SuggestionAnswer::TextField& first_text_field = |
+ match.answer->second_line().text_fields()[0]; |
+ if (first_text_field.has_num_lines() && first_text_field.num_lines() > 1) |
+ detailTextLabel.numberOfLines = MIN(3, first_text_field.num_lines()); |
+ else |
+ detailTextLabel.numberOfLines = 1; |
} else { |
const ACMatchClassifications* classifications = |
![self isSearchMatch:match.type] ? &match.contents_class : nil; |
@@ -295,6 +308,7 @@ initWithPopupView:(OmniboxPopupViewIOS*)view |
[detailTextLabel setNeedsDisplay]; |
OmniboxPopupTruncatingLabel* textLabel = row.textTruncatingLabel; |
+ [textLabel setTextAlignment:_alignment]; |
LayoutRect textLabelLayout = |
LayoutRectMake(kTextCellLeadingPadding, CGRectGetWidth(self.view.bounds), |
0, labelWidth, kTextLabelHeight); |