3

リンクがタップされたときに、右の境界線から画面に UIWebView をアニメーション化しようとしています。これを行うために、2 つの UIView を使用しています。1 つは onScreenWebView と呼ばれ、もう 1 つは offScreenWebView と呼ばれます。アイデアは、offscreenWebView を画面上で右からアニメーション化し、onScreenWebView を画面外で左からアニメーション化できるということです。次に、ビューを交換します (画面上のビューが onScreenWebView になり、その逆も同様です) が、アニメーションに問題があります。初めてうまく機能することに注意する必要があります。その後、まったくうまくいきません。

ビューはそのように整列されています

      __________ __________
      |        | |        |
      |   on   | |  off   |
      | screen | | screen |
      |________| |________|

アニメーションコードは次のとおりです。

offScreenWebView.hidden = true;

offScreenWebView.frame = self.frame;
[offScreenWebView offSetX:self.bounds.size.width + kOffsetPadding];         // move offscreen to the right
[self logWebRects:@"begin"];
offScreenWebView.hidden = false;
[self bringSubviewToFront:offScreenWebView];

[UIView animateWithDuration:0.5f delay:0.0f options:UIViewAnimationCurveEaseInOut animations:^{
    [self logWebRects:@"during 1"];
    offScreenWebView.frame = self.frame;
    onScreenWebView.frame = CGRectMake(-(self.bounds.size.width + kOffsetPadding), 0, onScreenWebView.bounds.size.width, onScreenWebView.bounds.size.height);
    [self logWebRects:@"during 2"];
}completion:^(BOOL finished) {
    [self logWebRects:@"finished b4 swap"];
    [self swapWebViews];
    [self logWebRects:@"finished -- done"];
}];

これが私のlogWebRectsメソッドの出力です(各ビューの起源のみ)

Navigation Type ::      Link Clicked
Rect of self frame   ::  {{0, 0}, {320, 460}} 

99  --  Point of offscreen origin   begin          ::  {335, 0}
0   --  Point of onscreen origin    begin          ::  {0, 0}
99  --  Point of offscreen origin   during 1       ::  {335, 0}
0   --  Point of onscreen origin    during 1       ::  {0, 0}
99  --  Point of offscreen origin   during 2       ::  {0, 0}
0   --  Point of onscreen origin    during 2       ::  {-335, 0}
Navigation Type ::      Other
99  --  Point of offscreen origin   finished b4 swap       ::  {0, 0}
0   --  Point of onscreen origin    finished b4 swap       ::  {-335, 0}
0   --  Point of offscreen origin   finished -- done       ::  {-335, 0}
99  --  Point of onscreen origin    finished -- done       ::  {0, 0}


Navigation Type ::      Link Clicked
Rect of self frame   ::  {{0, 0}, {320, 460}} 

0   --  Point of offscreen origin   begin          ::  {335, 0}
99  --  Point of onscreen origin    begin          ::  {0, 0}
0   --  Point of offscreen origin   during 1       ::  {335, 0}
99  --  Point of onscreen origin    during 1       ::  {0, 0}
0   --  Point of offscreen origin   during 2       ::  {0, 0}
99  --  Point of onscreen origin    during 2       ::  {-335, 0}
Navigation Type ::      Other
0   --  Point of offscreen origin   finished b4 swap       ::  {335, 0}
99  --  Point of onscreen origin    finished b4 swap       ::  {0, 0}
99  --  Point of offscreen origin   finished -- done       ::  {0, 0}
0   --  Point of onscreen origin    finished -- done       ::  {335, 0}

これらのログは、最初の実行からのものです。続いて二回戦も。なんらかの理由で、完了ブロックの直前でアニメーション ブロックが各 Web ビューのフレームをリセットしていることに気付くでしょう。

Web ビューを従来の一時変数スワップと交換することに注意してください。また、それらは兄弟ビューです。

4

2 に答える 2

3

これは少し古いことは知っていますが、同じ問題があり、これについて見つけた唯一のスレッドです。

問題は、bringSubviewToFront が暗黙的なアニメーション (推測) を実行し、アニメーション ブロックが正しいフレームを割り当てられないことです。

暗黙的なアニメーションを無効にすることで解決しました。プレーンな BringSubviewToFront の代わりに、このコード スニップを試してください。

[CATransaction begin];
[CATransaction setDisabledActions:YES];
[self bringSubviewToFront:offScreenWebView];
[CATransaction commit];
于 2012-10-17T09:27:31.630 に答える
1

私のアプリの1つに、あなたと同様の設定があります。残念ながら、実装に重大な問題は見当たりません (ただし、スワッピングとロギングの方法はわかりません)。私は他のメソッドを呼び出したり、フレームを処理したりしません。一時変数のスワップに問題があったため、次のビュー コントローラーをメソッドのパラメーターとして使用するように戻しましたが、はるかにうまく機能しました。

centreOffRightcentreOffLeftは、画面の中心をそれぞれ左右にオフセットする CGPoints です。nextおよびpreviousは、各ビューのビュー コントローラーです。このメソッドは、コンテナ ビュー コントローラから呼び出されます。

-(void)moveNext:(PlayerViewController*)sender
{
    // Need to push this one from the right
    next.view.center = centreOffRight; 
    [self.view bringSubviewToFront:next.view];
    [UIView animateWithDuration:0.3 
                     animations:^{
                         next.view.center = centreOfScreen;
                         current.view.center = centreOffLeft;} 
                     completion:^(BOOL finished){ 
                         [current wasMovedOffScreen];
                         current = next;
                         next = sender;
                         currentDouble = nextIndex;}];

}

これを回答として投稿するのは気が進まないので、あなたのものが機能しないのになぜこれが機能するのかわかりませんが、役に立てば幸いです。

于 2012-08-08T06:09:38.267 に答える