应用转换并设置新的键入属性后,UITextView 被裁剪

UITextView is clipped after applying a transform and setting new typing attributes

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

有趣的是,如果我应用缩放变换缩小 视图(例如 0.5),那么它的文本将被剪裁。如果我设置 view.transformview.layer.transform,行为是相同的。它是由内部 UITextContainerView 引起的,看起来它被缩放了两次,例如如果文本视图缩放 0.5 倍,则 UITextContainerView 具有缩小文本视图的一半大小。 UITextContainerViewframebounds的值一样,都是缩小后的文本视图的大小,看起来是正确的。 UITextContainerView 变换及其层的变换是同一性的。

手动更改frameboundsUITextContainerView会自动重置因此不起作用。 clipsToBoundsmasksToBounds 也没有修复剪辑。

这发生在 iOS 11.4 的模拟器和真实设备中。如果我只删除新输入属性的设置,那么 UITextContainerView 会正确运行并且文本不会被剪裁。

这是大小写问题,如果我将其删除,文本将不再被剪裁:

textView.typingAttributes = updatedTypingAttributes

有人遇到过这个错误吗?我该如何解决?

最后,我通过将文本视图包装在另一个 UIView 中修复了这个 OS 错误,并将转换应用于 UIView 而不是内部的文本视图。

通过在我的 UITextView 子类上覆盖 transform 解决了这个问题。不需要 parent UIView.

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

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