2013-10-20 17 views
6

我有一個UILabel,hardWayLabel,在UIView,hardWayView。我需要這個視圖(以及標籤)來爲屏幕最左側的新位置設置動畫。然而,當標籤進入正確位置時,可以看到視圖繼續遠離屏幕左側。我用動畫的下面的代碼(這是我在我的應用程序使用其他許多次成功):爲什麼我的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]; 

我使用的NSLog以確保painPoint.x和painPoint.y是他們應該是什麼9which是證實UILabel結束了正確的位置。我猜真正的問題是爲什麼UIView會繼續移動過屏幕邊界(並且只有在UIView從屏幕中心向左側動畫的情況下才會這樣做)?

我確實啓用了Autolayout,但我不認爲這是罪魁禍首。當我在iOS 7的iPhone模擬器上運行應用程序時,會發生此問題,並且我無法使模擬器運行於iOS 6,因此我無法將問題隔離到iOS 7(雖然可以嗎?舊版本的Xcode和應用程序不使用故事板)。

這裏是屏幕錄像的問題。正如你所看到的,將這兩個視圖從左到右移動通常是可以正常工作的。雖然將視圖移回左側,但其中一個視圖(黑色背景)顯示爲通過左上角離開屏幕,而標籤(以橙色文本顯示)轉到正確的位置。 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]; 

我曾試圖使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

真棒路易斯..喜歡你的奉獻,以幫助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]; 

      }]; 

另外,如果是我,我會用每個矩形的不同名稱來幫助調試。例如不要總是叫你的矩形「框架」。稱它爲centerFrame,leftFrame,rightFrame。

當您在動畫結束時註銷hardWayView的框架時,它是否報告您期望的內容?

當您在動畫開始時註銷hardWayView的框架時,它是否報告您期望的內容?

我的猜測是hardWayView的框架不是你認爲的那樣。

如果您直接設置框架而不設置動​​畫效果,它是否像您期望的那樣工作?

相關問題