6

ズームできるscrollViewに多数のテキストコントロールがあります。ぼやけたテキストを避けるために、より高い解像度でコントロールを再描画するために、ここで説明されているように、ビュー階層で各ビューの contentScaleFactor を設定します。ラベルとテキストフィールドではすべて正常に機能しますが、textView はより高い倍率で再描画されません。設定されている場合に違いを生む可能性のある textViews の他の唯一のサブビューは、UIWebView (つまり WebKit) のようなコンテンツを実装するプライベート クラス UIWebDocumentView ですが、いずれかのレベル ( UITextView または UIWebDocumentView ) で設定されている場合、新しいスケール ファクターは無視されることに気付きました。

特に TextViews の倍率 (解像度) をリセットする方法はありますか?

4

2 に答える 2

4

@dbotha が指摘したように、実際にはcontentScaleFactorandを設定することが重要ですが、実際にテキストのレンダリングを行うすべての内部に到達するには、ビューとレイヤーの階層を別々にたどる必要があります。画面のスケールも考慮する必要があります。contentsScaleCATiledLayer

実装は次のようになります。

- (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 )。回避策が添付されたサンプルプロジェクトもあります。

于 2015-06-18T17:45:18.297 に答える
3

UITextView のすべてのサブビューに contentScaleFactor を必ず適用してください。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];
    }
}
于 2013-11-20T23:24:47.293 に答える