如何使用 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
UITextView
的 CGRect
作为其排除路径,因为 后者假定给定的 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
。
希望这对您有所帮助。
我在我的 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
UITextView
的 CGRect
作为其排除路径,因为 后者假定给定的 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
。
希望这对您有所帮助。