草庐IT

ios - Swift:用户在 UITextView 中键入时连续调整 tableViewCell 的大小

coder 2023-09-15 原文

简介

上下文:

我正在创建我的第一个应用程序,但遇到了一个我无法解决的问题。

  • 我有一个 tableView,其中包含很多 UIElement 的单元格。所有约束都是使用 EasyPeasy 库完成的,它基本上只是设置自动布局约束(我也尝试过手动设置它们)。有问题的 UITextView 受左、右、上、下各种数字的限制,我对它的高度或宽度没有限制。

  • 在 cellForRowAt indexPath: 我将每个单元格 textView 的 textView 委托(delegate)设置为自身,使用在单元格自定义类中声明的委托(delegate)属性。我还用它的单元格 indexPath.row 标记每个 textView(在 textViewDidChange 方法中给出 textView.tag 整数)。

问题/致谢:

  • 在浏览了很多之后,我发现了一些类似的问题,但我无法让它们为我工作,我已经实现了其中与我的案例相符的部分。我认为我的情况与这些问题的不同之处在于,要使我的单元格设计正常工作,单元格的高度必须为 itemHeight 或更高。
  • 我注意到,当我在 textview 中键入内容时,textview 本身的高度会增加(甚至低于单元格边框,但当它到达该点时它不可见),但是单元格本身不会调整大小。
  • 我试过使用仅包含 textView 的单元格,因此问题一定出在 textViewDidchange 或 heightForRowAt indexPath 方法中。

问题:

我在这里做错了什么?为什么当我在 textView 中键入内容时单元格高度没有动态变化?

代码:

    func textViewDidChange(_ textView: UITextView) {
       var newframe = textView.frame
       newframe.size.height = textView.contentSize.height - textView.frame.size.height + itemHeight[textView.tag]
       textView.frame = newframe
       let ndxPath = IndexPath(row: textView.tag, section: 0)
       let cell = tableView.cellForRow(at: ndxPath) as! EventsCell
       cell.frame = CGRect(x: cell.frame.origin.x, y: cell.frame.origin.y, width: cell.frame.width, height: textView.frame.height)

         tableView.beginUpdates()
         tableView.setNeedsLayout() //have tried without this line
         tableView.layoutIfNeeded() //have tried without this line
         tableView.endUpdates()

    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if UITableViewAutomaticDimension > itemHeight[indexPath.row] {
            return UITableViewAutomaticDimension
        } else {
            return itemHeight[indexPath.row]
        }
    }

TextView 约束:

   let containerView : UIView = {
        let cv = UIView(frame: .zero)
        cv.backgroundColor = .white
        cv.translatesAutoresizingMaskIntoConstraints = false
        cv.layer.cornerRadius = 7
        return cv
    }()

    let eventText : GrowingTextView = {   // GrowingTextView is a extension to a regular UITextView
        let tv = GrowingTextView()
        tv.allowsEditingTextAttributes = true
        tv.isScrollEnabled = false
        var delegate: UITextViewDelegate?
        tv.textContainerInset = UIEdgeInsetsMake(1, 1, 0, 1)
        tv.autoresizingMask = .flexibleHeight
        tv.translatesAutoresizingMaskIntoConstraints = false
        return tv
     }()

 override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    containerView.addSubview(eventText)
    contentView.addSubview(containerView)

    containerView .easy.layout([Height(CGFloat(95 * itemCount)), Left(8), Right(8)])
    eventText .easy.layout([Left(77), Right(5), Top(90), Bottom(4)])

 }

感谢阅读我的帖子。

最佳答案

  • 确定高度的约束应该以 textView 直接附加到 contentView 的顶部和底部或附加到 View 的方式布置连接到contentView的顶部和底部,以便自动布局可以通过连接约束来确定高度。
  • 确保您没有提及 textView 的高度和禁用滚动。让自动尺寸标注处理所有这些。
  • 现在您需要做的就是在 textViewDidChange 上调用 tableView.beginUpdates()tableView.endUpdates()

这是我的 repo这证明了相同的。


OP 编辑​​:

  • 您应该将添加的额外高度存储在单元格类的变量中,以便在重新加载 tableVIew 时单元格可以重新加载适当的高度。

  • 您还应该更改 textViewDidChange 方法

    cell.frame = CGRect(x: cell.frame.origin.x, y: cell.frame.origin.y, width: cell.frame.width, height: textView.frame.height) 
    

    let newFrame = ”originalCellHeight” - ”originalTextViewHeight” + textView.contentSize.height
    
    cell.frame = CGRect(x: cell.frame.origin.x, y: cell.frame.origin.y, width: cell.frame.width, height: newFrame )`
    

关于ios - Swift:用户在 UITextView 中键入时连续调整 tableViewCell 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51731451/

有关ios - Swift:用户在 UITextView 中键入时连续调整 tableViewCell 的大小的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  4. ruby - 按值降序排列散列,然后按升序键入 ruby - 2

    我有这样的哈希trial_hash={"key1"=>1000,"key2"=>34,"key3"=>500,"key4"=>500,"key5"=>500,"key6"=>500}我按值降序排列:my_hash=trial_hash.sort_by{|k,v|v}.reverse我现在是这样理解的:[["key1",1000],["key4",500],["key5",500],["key6",500],["key3",500],["key2",34]]但我希望当值相同时按键的升序排序。我该怎么做?例如:上面的散列将以这种方式排序:[["key1",1000],["key3",500

  5. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  6. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  7. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  8. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  9. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  10. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

随机推荐