如何将自定义贝塞尔路径应用于UITableViewCell内的UITextView

时间:2014-08-20 18:02:01

标签: ios uitableview xcode5 uibezierpath nstextcontainer

我正在使用UITableViewCell。该单元格包含许多图像,标签和UITextView。我希望将其他视图绘制的UITextView作为其排除路径。所以在MyUITableViewCell类中,我在方法awakeFromNib中有以下代码。

UIBezierPath *image =[UIBezierPath bezierPathWithRect:self.animalImageView.bounds];
UIBezierPath *label =[UIBezierPath bezierPathWithRect:self.animalTitleView.bounds];
UIBezierPath *rating =[UIBezierPath bezierPathWithRect:self.ratingOfAnimal.bounds];

self.animalBioTextView.bounds=self.bounds;//resize textview to fill table cell; exclusions will come later
self.animalBioTextView.textContainer.exclusionPaths=@[image, label, rating];//apply exclusions
NSLog(@"Bezier path set");

这些编辑似乎都没有生效。

BWT:我在故事板中的UITableView中声明了TableViewCell。然后我将故事板单元链接到MyUITableViewCell,然后从那里开始。澄清:一切正常;除了我现在要自定义textContainer。

- UPDATE -

我认为我的代码示例显示了我想要做的事情,还有一些解释:

  • 我希望textview在各方面与TableViewCell连续。由于我无法在故事板中完成此操作,因此我在代码中添加以下行:self.animalBioTextView.bounds=self.bounds

  • 因为textview与单元格是连续的,所以我应该能够“轻松地”使用子视图的边界并将它们传递给textView。但显然,这些限制是针对孩子们自己的。那么如何获得UITableViewCell的坐标?在我的情况下是self

2 个答案:

答案 0 :(得分:0)

首先,你忽略了对坐标系的思考。其他观点的界限各自都是自己的;例如,它们的边界起源都是(0,0)。但是必须根据文本容器自己的边界原点设置排除路径(投影到现实生活空间中);其他视图的起源不太可能都在文本视图的文本容器的左上角!因此,您需要将所有这些rects转换为文本容器自己的坐标系。

(另外,请记住,如果文本视图是可滚动的,事情就更复杂了,因为其他视图相对于滚动文本内容的位置会随着用户滚动而改变,所以你必须在计算中考虑到这一点并再次更改排除路径。)

答案 1 :(得分:0)

您可以使用convertRect:fromView:获取相对于文本视图的坐标。 E.g:

CGRect animalImageRect = [self.animalBioTextView convertRect:self.animalImageView.bounds fromView:self.animalImageView];
UIBezierPath *imagePath = [UIBezierPath bezierPathWithRect:animalImageRect];