应用变换和设置新的输入属性后,UITextView被裁剪了。

3

我有一个UITextView,可以进行缩放和旋转。用户可以编辑其文本,也可以更改文本属性,例如文本颜色、背景颜色、字体等。

现在有个有趣的问题,如果我应用一个缩放变换来缩小视图(例如0.5),那么其中的文本就会被裁剪。如果设置view.transformview.layer.transform,行为是相同的。这是由于内部的UITextContainerView被缩放了两次,例如如果文本视图被缩放了0.5倍,则UITextContainerView的大小只有缩小后的文本视图的一半。而UITextContainerViewframebounds具有相同的值,即缩小后的文本视图的大小,看起来是正确的。UITextContainerView的变换及其图层的变换都是恒等的。

enter image description here

手动更改UITextContainerViewframebounds会自动重置,因此无法解决该问题。而clipsToBoundsmasksToBounds也无法修复裁剪问题。

这在模拟器和真实设备上的iOS 11.4中发生。如果我仅删除新输入属性的设置,则UITextContainerView将表现正确,文本不会被裁剪。

这是导致问题的原因,如果我将其删除,则文本不再被裁剪:

textView.typingAttributes = updatedTypingAttributes

有人遇到这个bug吗?我该如何解决?


我正在遇到完全相同的问题。我们允许用户输入文本,并且他们可以捏合以缩放TextView,但是一段时间后,UITextContainerView的边界变得小于UITextView。你怎么解决这个问题? - ahoang
@ahoang请查看已接受的答案。简而言之,将文本视图包装在另一个视图中。 - shelll
2个回答

3

通过在我的UITextView子类上重写transform方法解决了这个问题。不需要父UIView

override var transform: CGAffineTransform {
    didSet {
        guard transform != oldValue else { return }

        // alternatively, if transform == .identity
        if transform.a == 1 {
            setNeedsLayout()
            layoutIfNeeded()
        }
    }
}

如果您可以使用子类,那就是一个不错的解决方案。 - shelll

0
最终,我通过将文本视图包装在另一个UIView中,并将变换应用于UIView而不是内部的文本视图来解决了这个操作系统错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接