ios 如何正确调整表头视图中包含exclusionPaths的文本视图的大小

qgzx9mmu  于 2022-11-26  发布在  iOS
关注(0)|答案(3)|浏览(160)

我在tableView的头中添加了一个视图,它由imageView和textView组成,其中imageView在左上角左对齐,而textView在imageView上延伸到屏幕右侧,如下所示。

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

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

我已经禁用了文本视图的滚动,并在标题视图中设置了以下约束:
文本视图:左-8像素,右-8像素,上-0像素,下-8像素
图像视图:左侧-8像素,宽度-100像素,高度100像素,顶部-8像素,底部-大于或等于8像素
我在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
    }
}

这会调整标题的大小。但是,当textView的文本少于图像的高度时,视图的大小会增大。
三行文本示例:

六行文本示例:

足以传递imageview的文本示例:

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

jm2pwxwz

jm2pwxwz1#

我有一个解决这个问题的方法,因为我自己也遇到过这个问题:)你看,我试图做一些非常类似的事情,其中一个UITextView的文本应该避免它左边的UIImageView。我的代码如下:

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

我的成绩不太好:

正如您所看到的,这个问题依赖于ticketContentUITextViewCGRect作为其排除路径,因为后者假定给定的CGRect被纠正到它自己的帧,而不是它的超级视图的
修复非常简单,需要使用自iOS 2.0问世以来就存在的API:

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

我们在这里所做的是将UIImageView的框架转换到UITextView的坐标系,从而从UITextView的Angular 提供正确的排除路径。添加的偏移量只是为了对齐我的UITableViewCell的所有三个文本UIView
convert()是一个UIView方法。

正如您所看到的,文本现在很好地环绕在ticketProfilePictureUIImageView周围。
希望这对你有帮助。

yjghlzjz

yjghlzjz2#

对于任何使用自动布局的用户,请确保在viewDidLayoutSubviews()中添加exclusionPathFrame。

2guxujil

2guxujil3#

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 
}

相关问题