6

hardWayLabelUIView の中にUILabel がありhardWayViewます。画面の左端の新しい位置にアニメーション化するには、このビュー (およびその結果としてラベル) が必要です。ただし、ラベルが正しい位置に移動している間、ビューは画面の左側から遠く離れて移動し続けていることがわかります。アニメーションには次のコードを使用します (これは、アプリで何度も使用しています)。

        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];

私はNSLogを使用して、painPoint.xとpainPoint.yが本来あるべきものであることを確認しました。これは、UILabelが最終的に正しい位置にあるという事実によって確認されます。本当の問題は、UIView が画面の境界を越えて移動し続ける理由だと思います (この例では、UIView が画面の中央から左にアニメーション化されている場合にのみそうします)。

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

これが問題の画面記録です。ご覧のとおり、2 つのビューを左から右に移動すると正常に動作します。ただし、ビューを左に戻すと、ビューの 1 つ (黒い背景) が左上隅を通って画面から外れるように見えますが、ラベル (オレンジ色のテキスト) は正しい場所に移動します)。解説動画

更新: ここにいくつかのコードがあります。これは、問題なく動作する私のアプリケーションの他の部分とほぼ同じです。これはちょっとした頭の体操です。

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];

私は実際の数字を(変数に対して)試してみましframe.origin.x.yが、同じパターンが続きます.UILabelは正しい場所にアニメーション化し、UIViewは画面の左上隅からアニメーション化します

4

3 に答える 3

10

おっと!muuuchデバッグの後、私はついに問題を発見しました!! :) 教えてください...興味深いコードがいくつかあります。とにかく、この問題がいかにばかげていたかを知って驚かれることでしょう。あなたは〜を用意する?

問題は次のとおりです。

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];

}

あなたのコードをデバッグするのはとても面白かったです!

乾杯 :)

于 2013-10-23T18:41:43.997 に答える
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) {
    //
}];
于 2013-10-22T17:53:29.923 に答える
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 のフレームはあなたが思っているものではありません。

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

于 2013-10-23T16:06:08.137 に答える