TableViewCell在iPhone 6S中内容超出边界,求排查原因
我创建了一个UITableView,其中包含一个右侧带有UILabel的TableViewCell。该Cell在iPhone XR上显示正常,但在iPhone 6S上运行时,UILabel被推出屏幕边界。以下是视图控制器的代理实现代码:
import UIKit class TableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() tableView.dataSource = self tableView.delegate = self tableView.separatorStyle = .none let headerViewNibName = UINib(nibName: "HeaderCell", bundle: nil) tableView.register(headerViewNibName, forCellReuseIdentifier: "headerCell") } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 1 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if indexPath.row == 0 { let cell = tableView.dequeueReusableCell(withIdentifier: "headerCell", for: indexPath) as! HeaderCell cell.isUserInteractionEnabled = false return cell } return UITableViewCell() } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if indexPath.row == 0 { return 138 } return 0 } }
补充:已附上显示约束的Cell截图。
请问此适配异常的原因是什么?
问题原因分析
这个适配问题的核心肯定出在HeaderCell的Auto Layout约束设置上,结合iPhone 6S(375pt宽)和iPhone XR(414pt宽)的屏幕宽度差异,具体可能是以下几种情况之一:
UILabel的右侧约束未绑定到contentView:如果你的Label右侧约束是绑定到固定数值(比如直接设距离屏幕右侧多少pt),或者错误绑定到Cell根视图而非
contentView,那在更窄的屏幕上,Label就会因为没有足够的横向空间被挤出屏幕。记住,Cell内所有子视图的约束都应该关联到contentView,这是UITableViewCell布局的标准做法。UILabel设置了固定宽度,且未配置内容优先级:要是给Label设了固定宽度,小屏幕上这个宽度加上左侧视图的宽度会超过Cell的可用宽度,直接导致Label溢出。正确的做法是让Label宽度自适应内容,同时设置合适的
contentCompressionResistancePriority(抗压缩优先级)和contentHuggingPriority(内容收缩优先级),确保空间不足时,Label或左侧视图能合理收缩(取决于你的布局需求)。XIB中Cell设置了固定宽度:如果在HeaderCell的XIB文件里,把Cell的Size设成了固定宽度,那在不同宽度的屏幕上,Cell不会自动适配宽度,内部视图自然会溢出。要保证XIB里Cell的Size设置为
Automatic,或者选择Freeform但不手动固定宽度值。
另外你代码里固定Cell高度为138pt的操作,本身不会影响水平方向的适配,但如果Cell内垂直约束有冲突,可能间接干扰水平布局,不过这个概率比较低。
建议你重点检查HeaderCell的约束:确保Label的leading连接到左侧视图(或contentView的leading),trailing连接到contentView的trailing(并设置合理间距,比如16pt),同时不要给Label设置固定宽度,让它根据内容和可用空间自动调整。
内容的提问来源于stack exchange,提问作者Ankit Arora

