2011-10-05 8 views
6

UIScrollViewのスケールファクタを知ったので、ズームインした後にデータを再レンダリングできるという人がいるようです。あなたのレイヤーをCATiledLayerにし、levelsOfDetailBiasとlevelsOfDetailを設定することについての記事もあります。UIScrollViewのズームイン後のコンテンツのレンダリング

私は何を持っていることはUIScrollViewのであり、それには、UIViewのサブクラスですResultsView:私はUIScrollViewのとResultsViewを持っている私のクラスで

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     CATiledLayer *tiledLayer = (CATiledLayer *)self.layer; 
     tiledLayer.levelsOfDetailBias = 3; 
     tiledLayer.levelsOfDetail = 3; 
     self.opaque = YES; 
    } 
    return self; 
} 

/* 
// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
} 
*/ 

+ (Class)layerClass { 
    return [CATiledLayer class]; 
} 

、私は:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    return self.ResultsView; 
} 

テキストを再レンダリング(シャープ)するには十分ですか?または、何かを実装する必要がありますか?

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 
} 

もしそうなら、どうすればよいか分かりません。私のクラスUIScrollViewとResultsView、ResultsView(XIB)で、私はちょうどUILabelsとUIViews(UIViews見出し/フッターのビューに使用)があります。だから私はResultsViewからそれらを再描画する方法を知らない。 ResultsViewはXIBでUILabelsとUIViewを子として持っていますが、どのようにそれらをResultsViewクラスから再描画するのか、とにかく何をする必要があるのか​​分かりません。

これは間違ったアプローチですか? scrollViewDidEndZoomingのデリゲートメソッドでスケールファクタでUILabelとUIViewのサイズを変更するだけですか? TIA

答えて

18

あなたは間違ったアプローチをしていると思います。あなたのビューがUILabelsとカスタム描画をしないUIViewで構成されている場合、私はCATiledLayerのバックビューを使用して混乱することはありません。代わりにscrollViewDidEndZoomingを実装:withView:atScale:私は誰にもに走るだけの場合には私の痛みの数分を引き起こし受け入れソリューションに追加する小さな何かを持っている

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { 
    scale *= [[[self.scrollView window] screen] scale]; 
    [view setContentScaleFactor:scale]; 
    for (UIView *subview in view.subviews) { 
     [subview setContentScaleFactor:scale]; 
    } 
} 
+0

ありがとうございます。本当にうまくいった。私は自分でこのタイプの答えを見つけたとは思わない。最初のラインスケールが必要な理由を説明できますか?= ...ウィンドウ/スクリーン/スケールが返す値はデバイスごとに異なりますか?ありがとう。 –

+0

はい、それは網膜ディスプレイと互換性があります。 iPadおよびRetinaディスプレイのiPhone/iPodタッチでは、ウィンドウ画面の縮尺が1.0になるため、効果はありません。網膜ディスプレイでは2.0ですので、それらのディスプレイのスケールを適切に調整します。 – afarnham

+0

さらに洗練されたアプローチは、UIViewのサブクラスをズームしているビューを作成していない場合は作成し、各サブビューにすべてのサブビューをループするのではなく直接contentScaleFactorを更新するように指示するメソッドを作成することです。 setNeedsDisplayと同様にカスタム描画を行ういくつかのサブビューがあれば、よりきめ細かな制御が可能です。 – afarnham

4

:メソッドを委譲し、このような何かを行います同じこと。

拡大表示しているビュー内のすべてのサブビューをループし、setContentScaleFactorを呼び出すと、サブビュー自体にサブビューがある場合は考慮されません。このような複雑な設定をしている場合は、これらのコンテナビューのサブビューをループして、それぞれ

[subview setContentScaleFactor:scale]; 

と呼び出すようにしてください。私は、特定のビューのすべてのサブビューでsetContentScaleFactorを呼び出して、画面上の各「コンテナビュー」に対して呼び出すメソッドを作成しました。

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale 
{ 
    scale *= [[[self.scrollView window] screen] scale]; 
    [view setContentScaleFactor:scale]; 
    for (UIView *subview in view.subviews) 
    { 
     [self setContentSizeForView:subview andScore:scale]; 

     //Loop through all the subviews inside the subview 
     for(UIView *subSubview in subview.subviews) 
     { 
      [self setContentSizeForView:subSubview andScale:scale]; 
     } 
    } 
} 

- (void) setContentSizeForView:(UIView*) view andScale:(float)scale 
{ 
    [view setContentScaleFactor:scale]; 
} 
+0

他のコールをする必要がありますか?私のUIViewサブクラス(ビューは描画とズームのために使用されます)のcontentScaleFactorを設定すると、(UIScrollViewデリゲートメソッドの)スケールの値と等しくなり、私のアプリケーションは本当に遅くなりクラッシュします。 – Sebastian

+0

はい、サブビューがたくさんある場合、これは非常に遅い操作であることに気付きました。私は最終的にコンテンツを鮮明化することをあきらめましたが、複雑すぎるビュー/サブビュー階層をズームするのは遅すぎました。 – DiscDev

+0

あなたが作った方法で貼り付けてみませんか? –

関連する問題