ios – 使用文本包将UITextView插入UITextField?

ios – 使用文本包将UITextView插入UITextField?,第1张

概述我正在使用一个 text view替换占位符与UITextFields.我传递一个包含占位符标记的多个实例的文本的对象(一个结构体或一个字典).该字典还包含一组我们要从中收集数据的字段.我的目标是在我的文本中放置UITextField(或其他视图),并隐藏令牌. 使用NSLayoutManager方法来计算文本容器中占位符标记的位置,我将这些点转换为CGRects,然后将排除路径转换为文本字段周围 我正在使用一个 text view替换占位符与UITextFIElds.我传递一个包含占位符标记的多个实例的文本的对象(一个结构体或一个字典).该字典还包含一组我们要从中收集数据的字段.我的目标是在我的文本中放置UITextFIEld(或其他视图),并隐藏令牌.

使用NSLayoutManager方法来计算文本容器中占位符标记的位置,我将这些点转换为CGRects,然后将排除路径转换为文本字段周围的文本.这就是这样的:

func createAndAssignExclusionPathsForinputTextFIElds () {    var index = 0    let textFIEldCount = self.textFIElds.count    var exclusionPaths : [UIBezIErPath] = []    while index < textFIEldCount {        let textFIEld : AgreementTextFIEld = self.textFIElds[index]        let location = self.calculatepositionOfPlaceholderAtIndex(index)        let size = textFIEld.intrinsicContentSize()        textFIEld.frame = CGRectMake(location.x,location.y,size.wIDth,size.height)        exclusionPaths.append(textFIEld.exclusionPath())        index = index + 1    }    self.textContainer.exclusionPaths = exclusionPaths}

// …

func calculatepositionOfPlaceholderAtIndex(textIndex : NSInteger) -> CGPoint {    let layoutManager : NSLayoutManager = self.textContainer.layoutManager!    let delimiterRange = self.indices[textIndex]    let characterIndex = delimiterRange.location    let glyphRange = self.layoutManager.glyphRangeForCharacterRange(delimiterRange,actualCharacterRange:nil)    let glyphIndex = glyphRange.location    let rect = layoutManager.lineFragmentRectForGlyphAtIndex(glyphIndex,effectiveRange: nil,withoutAdditionalLayout: true)    let remainingRect : UnsafeMutablePointer<CGRect> = nil    let textContainerRect = self.textContainer.lineFragmentRectForProposedRect(rect,atIndex: characterIndex,writingDirection: .leftToRight,remainingRect: remainingRect)    let position = CGPointMake(textContainerRect.origin.x,textContainerRect.origin.y)    return position}

在这一点上,我有三个问题:

>一旦我将一个排除路径分配给了textContainer,其他占位符的计算字形位置现在都是错误的.
> calculatepositionOfPlaceholderAtIndex方法给我很好的y值,但是x值都是0.
>我还没有成功地隐藏占位符令牌.

所以,为了解决我的列表中的第一个问题,我尝试添加排除路径,然后再计算下一个,通过更改createAndAssignExclusionPathsForinputTextFIElds:

func createAndAssignExclusionPathsForinputTextFIElds () {    var index = 0    let textFIEldCount = self.textFIElds.count    while index < textFIEldCount {        let textFIEld : AgreementTextFIEld = self.textFIElds[index]        let location = self.calculatepositionOfPlaceholderAtIndex(index)        let size = textFIEld.intrinsicContentSize()        textFIEld.frame = CGRectMake(location.x,size.height)        self.textContainer.exclusionPaths.append(textFIEld.exclusionPath())        index = index + 1    }}

现在,我的计算头寸全都返回0,0不是我们想要的.添加排除路径可以理解,使计算的位置无效,但为每个rect方法获得0,0没有帮助.

在添加排除路径或隐藏字形后,如何让布局管理器重新计算屏幕上字形的位置?

编辑:每阿兰T答案,我没有运气尝试以下:

func createAndAssignExclusionPathsForinputTextFIElds () {    var index = 0    let textFIEldCount = self.textFIElds.count    var exclusionPaths : [UIBezIErPath] = []    while index < textFIEldCount {        let textFIEld : AgreementTextFIEld = self.textFIElds[index]        let location = self.calculatepositionOfPlaceholderAtIndex(index)        let size = textFIEld.intrinsicContentSize()        textFIEld.frame = CGRectMake(location.x,size.height)        exclusionPaths.append(textFIEld.exclusionPath())        self.textContainer.exclusionPaths = exclusionPaths        self.layoutManager.ensureLayoutForTextContainer(self.textContainer)        index = index + 1    }    self.textContainer.exclusionPaths = exclusionPaths}
解决方法 我只能提出我自己在TextKit上的新意见,但是在你的代码中瞪着我的东西,我以为我会提到它,以防它有帮助.

在你的createAndAssignExclusionPathsForinputTextFIElds函数中,你按照你的self.textFIElds数组的顺序处理你的字段.

当您在函数末尾设置self.textContainer.exclusionPaths的值时,布局管理器将(可能)重新流动所有排除的文本,从而使您的一些计算无效,而不考虑其他的影响排除.

这样做的方法是排序你的self.textFIElds数组,使它们对应于文本流(他们可能已经按照这个顺序,我不能告诉).然后,您必须清除self.textContainer.exclusionPath中的所有排除项,并将它们逐一添加,以便在计算下一个排除之前,布局管理器将围绕以前添加的排除的文本重新排列. (我相信它每次设置排除次数都是这样,但如果没有,则可能需要调用layoutManager的ensureLayoutForManager函数)

您必须以文本流顺序执行此 *** 作,以便将每个排除添加到文本区域,这些区域不会使任何先前的排除项无效.

优化这一点,以避免完全清除/重建排除也是可能的,但我建议在尝试之前达到工作基线.

总结

以上是内存溢出为你收集整理的ios – 使用文本包将UITextView插入UITextField?全部内容,希望文章能够帮你解决ios – 使用文本包将UITextView插入UITextField?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1111304.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存