From a6a09f4d9fde486d747c81b1219d0c3956a59407 Mon Sep 17 00:00:00 2001
From: Michael Kirk <michael@signal.org>
Date: Tue, 17 Jul 2018 12:24:21 -0600
Subject: [PATCH] fix squashed cells on ios9/10

must specify rowHeight automatic

Furthermore, we can't mix static and automatic sizing within a single tableView
---
 .../OWSConversationSettingsViewController.m   | 92 +++++++++----------
 .../ShowGroupMembersViewController.m          |  3 +
 2 files changed, 44 insertions(+), 51 deletions(-)

diff --git a/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m b/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m
index f5f109360..112662c78 100644
--- a/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m
+++ b/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m
@@ -231,6 +231,9 @@ const CGFloat kIconViewLength = 24;
 {
     [super viewDidLoad];
 
+    self.tableView.estimatedRowHeight = 45;
+    self.tableView.rowHeight = UITableViewAutomaticDimension;
+
     _disappearingMessagesDurationLabel = [UILabel new];
 
     self.disappearingMessagesDurations = [OWSDisappearingMessagesConfiguration validDurationsSeconds];
@@ -372,19 +375,10 @@ const CGFloat kIconViewLength = 24;
                                  cell.contentView.preservesSuperviewLayoutMargins = YES;
                                  cell.selectionStyle = UITableViewCellSelectionStyleNone;
 
-                                 UIView *topView = [UIView containerView];
-                                 [cell.contentView addSubview:topView];
-                                 [topView autoPinLeadingAndTrailingToSuperviewMargin];
-                                 [topView autoPinEdgeToSuperviewEdge:ALEdgeTop];
-                                 [topView autoSetDimension:ALDimensionHeight toSize:kOWSTable_DefaultCellHeight];
-
                                  NSString *iconName
                                      = (strongSelf.disappearingMessagesConfiguration.isEnabled ? @"ic_timer"
                                                                                                : @"ic_timer_disabled");
                                  UIImageView *iconView = [strongSelf viewForIconWithName:iconName];
-                                 [topView addSubview:iconView];
-                                 [iconView autoVCenterInSuperview];
-                                 [iconView autoPinLeadingToSuperviewMargin];
 
                                  UILabel *rowLabel = [UILabel new];
                                  rowLabel.text = NSLocalizedString(
@@ -392,19 +386,19 @@ const CGFloat kIconViewLength = 24;
                                  rowLabel.textColor = [UIColor blackColor];
                                  rowLabel.font = [UIFont ows_dynamicTypeBodyFont];
                                  rowLabel.lineBreakMode = NSLineBreakByTruncatingTail;
-                                 [topView addSubview:rowLabel];
-                                 [rowLabel autoVCenterInSuperview];
-                                 [rowLabel autoPinLeadingToTrailingEdgeOfView:iconView offset:weakSelf.iconSpacing];
 
                                  UISwitch *switchView = [UISwitch new];
                                  switchView.on = strongSelf.disappearingMessagesConfiguration.isEnabled;
                                  [switchView addTarget:strongSelf
                                                 action:@selector(disappearingMessagesSwitchValueDidChange:)
                                       forControlEvents:UIControlEventValueChanged];
-                                 [topView addSubview:switchView];
-                                 [switchView autoVCenterInSuperview];
-                                 [switchView autoPinLeadingToTrailingEdgeOfView:rowLabel offset:weakSelf.iconSpacing];
-                                 [switchView autoPinTrailingToSuperviewMargin];
+
+                                 UIStackView *topRow =
+                                     [[UIStackView alloc] initWithArrangedSubviews:@[ iconView, rowLabel, switchView ]];
+                                 topRow.spacing = self.iconSpacing;
+                                 topRow.alignment = UIStackViewAlignmentCenter;
+                                 [cell.contentView addSubview:topRow];
+                                 [topRow autoPinEdgesToSuperviewMarginsExcludingEdge:ALEdgeBottom];
 
                                  UILabel *subtitleLabel = [UILabel new];
                                  subtitleLabel.text = NSLocalizedString(
@@ -414,7 +408,7 @@ const CGFloat kIconViewLength = 24;
                                  subtitleLabel.numberOfLines = 0;
                                  subtitleLabel.lineBreakMode = NSLineBreakByWordWrapping;
                                  [cell.contentView addSubview:subtitleLabel];
-                                 [subtitleLabel autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:topView];
+                                 [subtitleLabel autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:topRow withOffset:8];
                                  [subtitleLabel autoPinEdge:ALEdgeLeading toEdge:ALEdgeLeading ofView:rowLabel];
                                  [subtitleLabel autoPinTrailingToSuperviewMargin];
                                  [subtitleLabel autoPinBottomToSuperviewMargin];
@@ -435,25 +429,21 @@ const CGFloat kIconViewLength = 24;
                             cell.contentView.preservesSuperviewLayoutMargins = YES;
                             cell.selectionStyle = UITableViewCellSelectionStyleNone;
 
-                            UIView *topView = [UIView containerView];
-                            [cell.contentView addSubview:topView];
-                            [topView autoPinLeadingAndTrailingToSuperviewMargin];
-                            [topView autoPinEdgeToSuperviewEdge:ALEdgeTop];
-                            [topView autoSetDimension:ALDimensionHeight toSize:kOWSTable_DefaultCellHeight];
-
                             UIImageView *iconView = [strongSelf viewForIconWithName:@"ic_timer"];
-                            [topView addSubview:iconView];
-                            [iconView autoVCenterInSuperview];
-                            [iconView autoPinLeadingToSuperviewMargin];
 
                             UILabel *rowLabel = strongSelf.disappearingMessagesDurationLabel;
                             [strongSelf updateDisappearingMessagesDurationLabel];
                             rowLabel.textColor = [UIColor blackColor];
                             rowLabel.font = [UIFont ows_dynamicTypeBodyFont];
-                            rowLabel.lineBreakMode = NSLineBreakByTruncatingTail;
-                            [topView addSubview:rowLabel];
-                            [rowLabel autoVCenterInSuperview];
-                            [rowLabel autoPinLeadingToTrailingEdgeOfView:iconView offset:weakSelf.iconSpacing];
+                            // don't truncate useful duration info which is in the tail
+                            rowLabel.lineBreakMode = NSLineBreakByTruncatingHead;
+
+                            UIStackView *topRow =
+                                [[UIStackView alloc] initWithArrangedSubviews:@[ iconView, rowLabel ]];
+                            topRow.spacing = self.iconSpacing;
+                            topRow.alignment = UIStackViewAlignmentCenter;
+                            [cell.contentView addSubview:topRow];
+                            [topRow autoPinEdgesToSuperviewMarginsExcludingEdge:ALEdgeBottom];
 
                             UISlider *slider = [UISlider new];
                             slider.maximumValue = (float)(strongSelf.disappearingMessagesDurations.count - 1);
@@ -464,7 +454,7 @@ const CGFloat kIconViewLength = 24;
                                           action:@selector(durationSliderDidChange:)
                                 forControlEvents:UIControlEventValueChanged];
                             [cell.contentView addSubview:slider];
-                            [slider autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:topView];
+                            [slider autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:topRow withOffset:6];
                             [slider autoPinEdge:ALEdgeLeading toEdge:ALEdgeLeading ofView:rowLabel];
                             [slider autoPinTrailingToSuperviewMargin];
                             [slider autoPinBottomToSuperviewMargin];
@@ -531,9 +521,6 @@ const CGFloat kIconViewLength = 24;
                         cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
 
                         UIImageView *iconView = [strongSelf viewForIconWithName:@"table_ic_notification_sound"];
-                        [cell.contentView addSubview:iconView];
-                        [iconView autoVCenterInSuperview];
-                        [iconView autoPinLeadingToSuperviewMargin];
 
                         UILabel *rowLabel = [UILabel new];
                         rowLabel.text = NSLocalizedString(@"SETTINGS_ITEM_NOTIFICATION_SOUND",
@@ -541,9 +528,13 @@ const CGFloat kIconViewLength = 24;
                         rowLabel.textColor = [UIColor blackColor];
                         rowLabel.font = [UIFont ows_dynamicTypeBodyFont];
                         rowLabel.lineBreakMode = NSLineBreakByTruncatingTail;
-                        [cell.contentView addSubview:rowLabel];
-                        [rowLabel autoVCenterInSuperview];
-                        [rowLabel autoPinLeadingToTrailingEdgeOfView:iconView offset:weakSelf.iconSpacing];
+
+                        UIStackView *contentRow =
+                            [[UIStackView alloc] initWithArrangedSubviews:@[ iconView, rowLabel ]];
+                        contentRow.spacing = self.iconSpacing;
+                        contentRow.alignment = UIStackViewAlignmentCenter;
+                        [cell.contentView addSubview:contentRow];
+                        [contentRow autoPinEdgesToSuperviewMargins];
 
                         OWSSound sound = [OWSSounds notificationSoundForThread:self.thread];
                         cell.detailTextLabel.text = [OWSSounds displayNameForSound:sound];
@@ -568,9 +559,6 @@ const CGFloat kIconViewLength = 24;
                         cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
 
                         UIImageView *iconView = [strongSelf viewForIconWithName:@"table_ic_mute_thread"];
-                        [cell.contentView addSubview:iconView];
-                        [iconView autoVCenterInSuperview];
-                        [iconView autoPinLeadingToSuperviewMargin];
 
                         UILabel *rowLabel = [UILabel new];
                         rowLabel.text = NSLocalizedString(@"CONVERSATION_SETTINGS_MUTE_LABEL",
@@ -578,9 +566,6 @@ const CGFloat kIconViewLength = 24;
                         rowLabel.textColor = [UIColor blackColor];
                         rowLabel.font = [UIFont ows_dynamicTypeBodyFont];
                         rowLabel.lineBreakMode = NSLineBreakByTruncatingTail;
-                        [cell.contentView addSubview:rowLabel];
-                        [rowLabel autoVCenterInSuperview];
-                        [rowLabel autoPinLeadingToTrailingEdgeOfView:iconView offset:weakSelf.iconSpacing];
 
                         NSString *muteStatus = NSLocalizedString(@"CONVERSATION_SETTINGS_MUTE_NOT_MUTED",
                             @"Indicates that the current thread is not muted.");
@@ -611,6 +596,13 @@ const CGFloat kIconViewLength = 24;
                                 [dateFormatter stringFromDate:mutedUntilDate]];
                         }
 
+                        UIStackView *contentRow =
+                            [[UIStackView alloc] initWithArrangedSubviews:@[ iconView, rowLabel ]];
+                        contentRow.spacing = self.iconSpacing;
+                        contentRow.alignment = UIStackViewAlignmentCenter;
+                        [cell.contentView addSubview:contentRow];
+                        [contentRow autoPinEdgesToSuperviewMargins];
+
                         cell.detailTextLabel.text = muteStatus;
                         return cell;
                     }
@@ -692,19 +684,17 @@ const CGFloat kIconViewLength = 24;
     cell.preservesSuperviewLayoutMargins = YES;
     cell.contentView.preservesSuperviewLayoutMargins = YES;
 
-    [cell.contentView addSubview:iconView];
-    [iconView autoVCenterInSuperview];
-    [iconView autoPinLeadingToSuperviewMargin];
-
     UILabel *rowLabel = [UILabel new];
     rowLabel.text = name;
     rowLabel.textColor = [UIColor blackColor];
     rowLabel.font = [UIFont ows_dynamicTypeBodyFont];
     rowLabel.lineBreakMode = NSLineBreakByTruncatingTail;
-    [cell.contentView addSubview:rowLabel];
-    [rowLabel autoVCenterInSuperview];
-    [rowLabel autoPinLeadingToTrailingEdgeOfView:iconView offset:self.iconSpacing];
-    [rowLabel autoPinTrailingToSuperviewMargin];
+
+    UIStackView *contentRow = [[UIStackView alloc] initWithArrangedSubviews:@[ iconView, rowLabel ]];
+    contentRow.spacing = self.iconSpacing;
+
+    [cell.contentView addSubview:contentRow];
+    [contentRow autoPinEdgesToSuperviewMargins];
 
     return cell;
 }
diff --git a/Signal/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.m b/Signal/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.m
index 2e890a740..717a67624 100644
--- a/Signal/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.m
+++ b/Signal/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.m
@@ -102,6 +102,9 @@ NS_ASSUME_NONNULL_BEGIN
 
     self.title = _thread.groupModel.groupName;
 
+    self.tableView.rowHeight = UITableViewAutomaticDimension;
+    self.tableView.estimatedRowHeight = 45;
+
     [self updateTableContents];
 }