如何使用 table header 视图中的 exclusionPaths 正确调整 textview 的大小

How to properly resize textview with exclusionPaths inside of table header view

我在我的 tableView header 中添加了一个视图,其中包含一个 imageView 和一个 textView。图像视图在顶角左对齐,文本视图在图像视图上延伸到屏幕右侧,如下所示。

textView 可以有动态内容,并有如下设置的排除路径:

let imagePath = UIBezierPath(rect: imageView.frame)
self.textView.textContainer.exclusionPaths = [imagePath]

我已禁用文本视图的滚动并在 header 视图中设置了以下约束:

TextView:左 - 8px,右 - 8px,上 - 0px,下 - 8px

ImageView: left - 8px, width - 100px, height 100px, top - 8px, bottom - 大于等于8px

我在 textView 中填充了动态文本后添加了这段代码:

if let headerView = self.tableView.tableHeaderView {
    let height = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
    var headerFrame = headerView.frame

    if height != headerFrame.size.height {
        headerFrame.size.height = height
        headerView.frame = headerFrame
        self.tableView.tableHeaderView = headerView
    }
}

调整header的大小。但是,当 textView 的文本少于图像的高度时,视图的大小会增加。

三行文本示例:

六行文本示例:

足以通过 imageview 的文本示例:

有人知道为什么会这样吗?

You can calculate textview text height with content size.

let tempTextview = UITextView(frame: CGRect(x: 50, y: 50, width: 120, height: 250))
tempTextview.text = "Dynamic Text"
let height = tempTextview.contentSize.height

Add you extra top and bottom padding to this height. 

height = height + padding 

if imageview.frame.size.height > height 
{
  return imageview.frame.size.height 
}
else
{
   return height 
}

我有一个解决办法,因为我自己也遇到过这个问题:) 你看,我正在尝试做一些非常相似的事情,其中​​ UITextView 的文本应该避免在其左侧出现 UIImageView。我的代码如下:

let ticketProfileExclusionPath = UIBezierPath(roundedRect: ticketProfilePicture.frame, cornerRadius: Constants.ProfilePictureExclusionRadius)
ticketContent.textContainer.exclusionPaths.append(ticketProfileExclusionPath)

而我的成绩不是很好:

如您所见,问题依赖于给定 ticketContent UITextViewCGRect 作为其排除路径,因为 后者假定给定的 CGRect 被更正为它自己的框架,而不是它的父视图的

修复非常简单,需要使用 API 自黎明以来的存在 (iOS 2.0):

let exclusionPathFrame = convert(ticketProfilePicture.frame, to: ticketContent).offsetBy(dx: Constants.SystemMargin, dy: Constants.Zero)

我们这里所做的是将UIImageView的坐标系转换为UITextView的坐标系,从而从UITextView的角度提供正确的排除路径.添加的偏移量只是为了对齐所有三个 UITableViewCell 的文本 UIView

convert() 是一个 UIView 方法。

如您所见,文本现在很好地环绕 ticketProfilePicture UIImageView

希望这对您有所帮助。