11

私は iOS SDK を試しており、次のUIView構造を持っています。

  • UIView
    • UIImageView- 背景画像のみ
    • UIImageViewCALayerマスクあり)
    • UIScrollView
      • Label

非常に単純な構造で、UIScrollView透明なレイヤーと 2 番目UIImageViewにマスクがあります。私がやろうとしているのは、CALayerマスクがスクロール ビュー内のコンテンツの位置に応じてその位置を移動することです。ユーザーがスクロールすると、マスクの位置が更新されます。UIScrollViewのデリゲートを使用して、この問題をすでに解決しました。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGPoint contentOffset = scrollView.contentOffset;
    contentOffset.y = -contentOffset.y;

    self.overlayImageView.viewlayer.mask.position = contentOffset;
}

マスクは で作成されviewDidLoad、View Controller のライフサイクル中に変更されません。

問題は、マスク位置の更新が遅すぎることです。こうすることで、マスクはスクロール ビューのコンテンツに従っているように見えますが、一緒にスクロールしていません。scrollViewDidScrollデリゲート メソッドが正しく呼び出されます。

問題をよりよく理解していただくために、iOS シミュレーターで作成したビデオを添付します。 http://www.youtube.com/watch?v=w3xRl3LTngY

質問は次のとおりです。

マスクの更新を速くする方法はありますか、それとも iOS の限界ですか?

4

1 に答える 1

17

CALayer は、position などの一部のプロパティに対して暗黙的にアニメーション化されます。それらを無効にします。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{

[CATransaction begin];
    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
CGPoint contentOffset = scrollView.contentOffset;
contentOffset.y = -contentOffset.y;

self.overlayImageView.viewlayer.mask.position = contentOffset;
[CATransaction commit];

}
于 2013-07-11T12:27:35.883 に答える