PrototypeCell 中的 UITextView 在两个 iPhone 模拟器中具有不同的行为

Posted

技术标签:

【中文标题】PrototypeCell 中的 UITextView 在两个 iPhone 模拟器中具有不同的行为【英文标题】:UITextView inside PrototypeCell have different behavior in two iPhone simulators 【发布时间】:2018-10-18 16:58:49 【问题描述】:

我有一个UITableView,有两个单元格用于用户输入信息。

第一个单元格:“取消”和“完成”两个按钮。 第二个单元格:UITextView 用于用户类型信息。

这在 iPhone 7、6s 中运行良好……但在 iPhone SE 和 5C 中屏幕不同。我使用了自动布局,在情节提要中看起来效果很好。 详细信息:我需要将 Height Constraint 设置为 TextView 才能工作。

如下图所示:

故事板:

TableView 的约束:

视图控制器:

class LiberarViewController : UIViewController, UITableViewDelegate, UITableViewDataSource, UITextViewDelegate 

    @IBOutlet weak var tableViewForm: UITableView!

    var callback : ((String)-> ())?

    override func viewDidLoad() 
        tableViewForm.dataSource = self
        tableViewForm.delegate = self
//        tableViewForm.tableFooterView = UIView()        
    

    @objc func cancelar(_ sender: Any) 
        self.dismiss(animated: true, completion: )
    

    @objc func finalizar(_ sender: Any) 
        self.dismiss(animated: true, completion: )
    

    func textViewDidEndEditing(_ textView: UITextView) 
        print("End edigint: \(textView.text!)")
    

    func numberOfSections(in tableView: UITableView) -> Int 
        return 2
    

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
        if section == 1 
            return "Digite a justificativa: "
        
        return nil
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        switch indexPath.section 
            case 0:
            let cell = tableView.dequeueReusableCell(withIdentifier: "CellBotoesLiberar") as! CellBotoesLiberar
            cell.selectionStyle = .none
            cell.btCancelar.addTarget(self, action: #selector(cancelar), for: .touchUpInside)
            cell.btFinalizar.addTarget(self, action: #selector(finalizar), for: .touchUpInside)
            return cell

        case 1:
            let cell = tableView.dequeueReusableCell(withIdentifier: "CellJustificativaLiberar") as! CellJustificativaLiberar
            cell.txtViewJustificativa.delegate = self
            return cell

            default: return UITableViewCell()
        
    


class CellJustificativaLiberar : UITableViewCell 
    @IBOutlet weak var txtViewJustificativa: UITextView!


class CellBotoesLiberar : UITableViewCell 
    @IBOutlet weak var btFinalizar: UIButton!
    @IBOutlet weak var btCancelar: UIButton!

【问题讨论】:

你为 TableView 设置了什么约束? 我已经编辑了..... 【参考方案1】:

您的 TableView 对安全区域的最高约束导致了问题。添加以下约束:

    水平和垂直居中到超级视图。 修复高度并修复宽度/前导和尾随到 Superview。

希望这对你有用。

【讨论】:

这行得通,你可以向我解释为什么顶部约束是一个问题?而且,如果我想自动扩展视图的高度给用户放置长文本? @Augusto 您已将水平居中约束设置为 tableview 并设置顶部 AutoLayout 引擎将首先尝试将您的 tableview 居中而不是保持它的高度。这导致了问题。 @Augusto 对于可扩展的TextView高度,您需要设置textView.textContainer.heightTracksTextView = true textView.isScrollEnabled = false,并且需要将UITextView的高度约束优先级设置为Low。 如果我需要放置一个大视图的新单元格,我需要更改高度约束吗? 是的,如果你想要新的单元格大视图应该在屏幕上显示而不滚动。

以上是关于PrototypeCell 中的 UITextView 在两个 iPhone 模拟器中具有不同的行为的主要内容,如果未能解决你的问题,请参考以下文章

原型 CellView 中的 TableView 没有反应

在 Swift 中的 UITextView 上放置阴影

带有 UITextView 的 UITableViewCell 中的自动布局

详细视图中的 TableView 在原型单元格上方有空格

来自 Prototype Cell 的 pushViewController

iOS UIScrollView 滚动检测