2

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

参考图像

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

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

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

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
    }
}

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

三行文本示例: 在此处输入图像描述

六行文本示例: 在此处输入图像描述

足以通过 imageview 的文本示例: 在此处输入图像描述

有谁知道为什么会这样?

4

2 回答 2

5

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

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

而且我的结果不是很好:

在此处输入图像描述

正如你所看到的,问题依赖于CGRect给定的ticketContent UITextView作为它的排除路径,因为后者假设给定CGRect的被更正到它自己的框架,而不是它的超级视图的

修复非常简单,需要使用从一开始就存在的 API(iOS 2.0):

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

我们在这里所做的是将UIImageView' 框架转换为UITextView' 坐标系,因此从UITextView. 添加的偏移量只是为了对齐所有三个 myUITableViewCell的 text UIView

convert()是一种UIView方法。

在此处输入图像描述

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

希望这可以帮助。

于 2017-07-24T12:36:12.707 回答
-1
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 
}
于 2017-01-25T07:30:33.107 回答