2013-10-20 15 views
6

UIViewの内部にhardWayLabelのUILabelがあります。hardWayViewです。このビュー(およびその結果としてのラベル)は、画面の左端の新しい位置にアニメートする必要があります。ただし、ラベルが正しい位置に移動している間は、画面の左側から遠くに移動し続けていることがわかります。私はpainPoint.xとpainPoint.yは、彼らが9whichがどうあるべきかであることを確認するためのNSLogを使用しているなぜ私のUIViewは間違った位置にアニメーション化されますか?

 CGRect frame = hardWayView.frame; 
     frame.origin.x = painPoint.x; 
     frame.origin.y = painPoint.y; 
     hardWayView.frame = frame; 
     [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDuration:.25]; 

:私は(私が正常に私のアプリでは、他の多くの時間を使用)、アニメーションのための次のコードを使用しますUILabelが正しい位置に終わるという事実によって確認されます。私は実際の質問は、なぜUIViewは、画面の境界を越えて移動し続けるだろうと思います(UIViewが画面の中央から左にアニメーション化されている場合にのみこの例でそうします)。

私はAutolayoutを有効にしていますが、これは原因ではないと思います。この問題は、iPhone SimulatorでiOS 7でアプリケーションを実行したときに発生し、シミュレータをiOS 6で動作させることができないため、iOS 7に問題を切り分けることができませんでした。古いバージョンのXcodeとアプリはストーリーボードを使用していません)。

ここに問題の画面が表示されます。ご覧のとおり、2つのビューを左から右に動かすと正常に動作します。ビューを左に動かすと、ビュー(黒い背景)の1つが画面の左上隅に表示され、ラベル(オレンジ色のテキスト)は正しい場所に表示されます。 Explanatory video

更新:ここにいくつかのコードがあります。私のアプリケーションの他の部分とほぼ同じですが、完璧に動作します。ちょっとした脳のブラスターです。

NSString *stringOfRands = tDict[@"originalRand"]; 
if ([stringOfRands rangeOfString:@"+"].location != NSNotFound) 
{ 
    NSArray *arrayOfRands = [stringOfRands componentsSeparatedByString:@" + "]; 

    for (int z=1; z<[arrayOfRands count]; z++) 
    { 
      NSString *updateValue = arrayOfRands[z]; 
      NSInteger newHiddenPosition = [self findBlank:leftSpaces]; 

      NSDictionary *updateStuff = @{@"updateValue": updateValue, @"workingMasterDict":tDict, @"newPos":@(newHiddenPosition), @"newCGPto":@"left", @"@parent":colorV}; 

      [self revealHidden:updateStuff]; 

     } 
} 

私はこの問題は本当にアニメーションが呼び出されるrevealHidden方法、中に起こっていると考えています。

[leftSpaces replaceObjectAtIndex:[hardWayPos intValue] withObject:[NSString stringWithFormat:@"full"]]; 
CGPoint painPoint = [[leftPoints objectAtIndex:[hardWayPos intValue]] CGPointValue];  
[UIView animateWithDuration:0.25 animations:^{ 
     CGRect frame = hardWayView.frame; 
     frame.origin.x = painPoint.x; 
     frame.origin.y = painPoint.y; 
     hardWayView.frame = frame; 
    } completion:^(BOOL finished) { 
     // 
    }]; 

hardWayView.hidden=0; 
hardWayView.backgroundColor = [UIColor blueColor]; 
hardWayLabel.textColor = [UIColor orangeColor]; 

Iは、(変数に対して)frame.origin.x.y実際の数字を作る試みたと同じパターンが行なわれる:UILabelが正しい場所にアニメーションとのUIViewは、画面の左上隅からオフアニメーション

+0

自動レイアウトをオフにしてテストします。それはおそらく原因です。 – Joel

+0

@Joel alas no。 Autolayoutをオフにしても同じ動きが起こります。 – zch

+0

まず、フレームを変更してからアニメーションを開始します。 – Exploring

答えて

10

Whooaa!私は最終的に問題を見つけた! :)私に教えてあげましょう...そこに興味深いコードがあります。とにかく、問題がどれほど愚かであるか知っていると驚くでしょう。あなたは〜を用意する?ここで

は問題です:ライン540周り

あなたは記号「@」余分を持っている、あなたはそれを見つけることができない値を取得しようとする理由です:

//ERROR HERE 
NSArray *arrayOfRands = [stringOfRands componentsSeparatedByString:@" + "]; 

for (int z=1; z<[arrayOfRands count]; z++) 
{ 
    NSString *updateValue = arrayOfRands[z]; 
    NSInteger newHiddenPosition = [self findBlank:leftSpaces]; 

    // This is the line with the error!! 
    // You have @"@parent" but it should be @"parent"  
    NSDictionary *updateStuff = @{@"updateValue": updateValue, @"workingMasterDict":tDict, @"newPos":@(newHiddenPosition), @"newCGPto":@"left", @"@parent":colorV}; 

    [self revealHidden:updateStuff]; 

} 

でしたあなたのコードをデバッグするのは非常に興味深い!

乾杯:

+0

あなたは素晴らしいです。確かにそれは問題だったし、あなたの時間のためにこのような愚かなタイプミスを追跡してくれてありがとう。私は誰かに私のコードを尋ねることを謝罪するという前提を嫌いですが、あなたがデバッグしたそのファイルの醜さは例外です。私はちょうどそのアプリを書いて、それをクリーンアップしたい/ Objective-Cについて後で学びたいと思っていたので、このコードが将来、多くのクリーンアップをしていると言うことは無用です。乾杯! – zch

+0

驚くばかりのLuis .. zchを助けるためにあなたの献身のように。 :) – dRAGONAIR

+0

@dRAGONAIRありがとうございます。だから私たちはここにいるのです...お互いを助けるために – LuisCien

6

その外観からアニメーションが開始する前にhardWayView.frame = frame;を設定しているので、UIViewは場所を変更してからアニメーションします。

hardWayView.frame = frame; 
[UIView beginAnimations:nil context:nil]; 

の間で切り替える必要があります。

いずれにせよ、アニメーションブロックに移行することを強くお勧めします。上記のコードは次のようになります:

[UIView animateWithDuration:0.4 animations:^{ 
CGRect frame = hardWayView.frame; 
frame.origin.x = painPoint.x; 
frame.origin.y = painPoint.y; 
hardWayView.frame = frame; 
} completion:^(BOOL finished) { 
    // 
}]; 
+0

提案していただきありがとうございます。私はすべてのアニメーションコードをブロッキングメソッドに置き換えてください。しかし、この変更は効果がないようです。問題は、 '' frame.origin.x''と '' .y''に何が設定されているかにかかわらず、UIViewがまだオフスクリーンに動いていることにあります。 – zch

1

完了ブロック内にコードを入れたほうがよいでしょうか? (またはanimateWithDurationブロックの前)。

[UIView animateWithDuration:0.25 animations:^{ 
       CGRect frame = hardWayView.frame; 
       frame.origin.x = painPoint.x; 
       frame.origin.y = painPoint.y; 
       hardWayView.frame = frame; 
      } completion:^(BOOL finished) { 

      hardWayView.hidden=0; 
      hardWayView.backgroundColor = [UIColor blueColor]; 
      hardWayLabel.textColor = [UIColor orangeColor]; 

      NSDictionary *hardWay = @{@"view": hardWayView, @"label": hardWayLabel, @"intValue":[NSString stringWithFormat: @"%@", hardWayLabel.text], @"hiddenBool":@0, @"position":@([hardWayPos intValue]), @"originalRand": [NSString stringWithFormat: @"%@", hardWayLabel.text]}; 
      [masterDict replaceObjectAtIndex:[masterDict indexOfObject:miniMaser] withObject:hardWay]; 

      }]; 

また、私の場合は、デバッグを助けるために各矩形にも別の名前を使用します。例えば常にあなたのrect "フレーム"を呼び出すとは限りません。それをcenterFrame、leftFrame、rightFrameと呼んでください。

hardWayViewのフレームをアニメーションの最後にログアウトすると、期待どおりのことが報告されますか?

アニメーションの開始時にhardWayViewのフレームをログアウトすると、期待したことが報告されますか?

私の推測では、hardWayViewのフレームはあなたの考えではありません。

フレームをアニメーション化せずに直接設定すると、期待どおりに機能しますか?

関連する問題