UITextView 仅在 iPad 上无法正确调整大小

UITextView not resizing correctly on iPad only

我有一个静态 UITableView,其中 1 个部分有 3 行。每行包含一个应根据内容调整大小的 UITextView。每个 UITextView 对象都禁用滚动以强制其增长。每个都固定在单元格的 contentView 的所有 4 个边上,没有其他限制。

当我在 iPad(真实或模拟)上 运行 时,无论 UITextView 的内容如何,​​单元格都会调整为单行文本。当我在调试器中检查视图层次结构时,我看到 UITextView 高度被设置为 27.5,即使内容视图高度为 183.5。这似乎是 UITableViewCellContentView 上限制单元格高度的高度约束的结果。这不是我设置的约束。我的 table 视图控制器没有 heightForRow 或 cellForRow 方法,因为它是静态 table 视图并且对所有内容都使用自动布局。我不知道如何添加此约束。

这是在 iPod touch 上 运行 时在完全相同的点上具有完全相同的内容的完全相同的层次结构。请注意,这次 UITextView 高度和内容高度相同。在这种情况下,UITableViewCellContentView 的高度约束足够大以适应 UITextView 的高度。

在这两种情况下,这是执行和显示相同内容的相同来源。该内容包含带回车符 returns 的短文本行,这就是为什么它在两种屏幕尺寸下的内容大小应相同。 UITextView 想要将其高度调整为 183.5,但在 iPad 上,单元格高度受到 iOS.

生成的约束的不必要约束

这是 viewDidLoad 的代码:

- (void)viewDidLoad {
    [super viewDidLoad];

    //shrink the uiswitch a little bit
    self.displayRegexCharsSwitch.transform  = CGAffineTransformMakeScale(0.70, 0.70);

    //these next 2 lines set up the table to automatically resize based on content
    self.tableView.estimatedRowHeight = 100.0f;
    self.tableView.rowHeight = UITableViewAutomaticDimension;

    //next line hides the blank cells
    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

    //these are needed on iPad or rows with accessory view don't resize
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

同样,由于使用静态 table 视图,table 视图控制器中没有 heightForRow 或 cellForRow。

我很困惑。如果内容相同且代码相同,为什么 UITextField 在 iPad 上报告的内容大小与在 iPod 上不同?从层次结构视图可以清楚地看出,UITextField 内部知道其高度为 200,但 contentSize 返回的是 27.5。这是一个静态 table 视图,因此没有 heightForRow 方法和 cellForRow 方法。我依靠自动布局来管理所有布局 - 它在 iPad.

上正确执行

编辑

仅供参考 - 该设计完全基于 Any/Any 尺寸 class。

找到了!我将布局移植到一个新项目,以将问题与项目中发生的其他事情隔离开来。新项目没有出现布局问题。因此,我比较了整体项目设置,发现新项目的部署目标为 iOS 8.3,而原始项目的部署目标为 iOS 6.0。当我将新项目部署目标设置为 iOS 6.0 时,出现了布局问题。 iOS 7.0 相同。但是,对于 iOS 8.0 及更高版本,问题就消失了。是时候强制我的用户升级到 iOS 8.