【问题标题】:UITextView and contentScaleFactorUITextView 和 contentScaleFactor
【发布时间】:2013-06-18 02:42:40
【问题描述】:

我在滚动视图中有许多可以缩放的文本控件。为了以更高的分辨率重绘控件以避免文本模糊,我在视图层次结构中设置了每个视图的 contentScaleFactor,如 here 一切都适用于标签和文本字段,但 textViews 不会重绘较高的比例因子。我注意到 textViews 的唯一其他子视图在设置时可能会有所不同,这是一个私有类 UIWebDocumentView,它实现了 UIWebView (即 WebKit)之类的内容,但如果在任一级别( UITextView 或 UIWebDocumentView )设置,新的比例因子将被忽略。

任何想法如何专门为 TextViews 重置比例因子(分辨率)?

【问题讨论】:

    标签: zooming uitextview


    【解决方案1】:

    设置contentScaleFactorcontentsScale 实际上是关键,正如@dbotha 指出的那样,但是您必须分别遍历视图和层层次结构才能访问实际执行文本渲染的每个内部CATiledLayer .您还需要考虑屏幕比例。

    实现是这样的:

    - (void)updateForZoomScale:(CGFloat)zoomScale {
        CGFloat screenAndZoomScale = zoomScale * [UIScreen mainScreen].scale;
        // Walk the layer and view hierarchies separately. We need to reach all tiled layers.
        [self applyScale:(zoomScale * [UIScreen mainScreen].scale) toView:self.textView];
        [self applyScale:(zoomScale * [UIScreen mainScreen].scale) toLayer:self.textView.layer];
    }
    
    - (void)applyScale:(CGFloat)scale toView:(UIView *)view {
        view.contentScaleFactor = scale;
        for (UIView *subview in view.subviews) {
            [self applyScale:scale toView:subview];
        }
    }
    
    - (void)applyScale:(CGFloat)scale toLayer:(CALayer *)layer {
        layer.contentsScale = scale;
        for (CALayer *sublayer in layer.sublayers) {
            [self applyScale:scale toLayer:sublayer];
        }
    }
    

    您可以在缩放比例发生变化时调用它(UIScrollViewDelegate 的一部分):

    - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
        [self updateForZoomScale:scale];
    }
    

    我在这里提交了增强请求:rdar://21443666 (http://www.openradar.me/21443666)。还有一个带有解决方法的示例项目。

    【讨论】:

      【解决方案2】:

      确保将 contentScaleFactor 应用于 UITextView 的所有子视图。我刚刚用 UITextView 测试了以下内容,发现它可以工作:

      - (void)applyScale:(CGFloat)scale toView:(UIView *)view {
          view.contentScaleFactor = scale;
          view.layer.contentsScale = scale;
          for (UIView *subview in view.subviews) {
              [self applyScale:scale toView:subview];
          }
      }
      

      【讨论】:

      • 对我来说,这在第一次创建文本视图时有效,但在执行缩放后更新时无效。为了解决这个问题,我从视图层次结构中删除了旧的文本视图,并将其替换为具有适当 contentScaleFactor 应用的精确副本。
      猜你喜欢
      • 2011-08-21
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2012-04-30
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      相关资源
      最近更新 更多