2010-12-08 74 views
0

好吧,這是一個新手問題,所以我提前道歉。我有一個UIView,我在界面生成器中放置在屏幕外。當用戶按下按鈕時,我想在屏幕上爲此視圖製作動畫。它的工作原理,但我不能與UIView中的任何按鈕進行交互。我已經讀過,當你設置動畫時,只有視圖被移動,並且實際的對象保留了它們的位置,所以我試圖設置UIViews圖層的位置,但是它導致我的UIView菜單在左邊顯示額外的81個像素。發生這種情況時,我可以與按鈕交互,但我需要將它與屏幕右側齊平。下面是我在IBAction爲代碼在openMenu按鈕:iPad - 沒有用戶互動在屏幕上查看動畫

CABasicAnimation *moveView = [CABasicAnimation animationWithKeyPath:@"position"]; 
moveView.delegate = self; 
moveView.duration=0.5; 

// If the menu is displayed, close it! 
CGPoint currentPosView = [[entirePage layer] position]; 
CGPoint destView; 

[moveView setFromValue:[NSValue valueWithCGPoint:currentPosView]]; 

if (menuDisplayed) { 
    // Move right to our destination 
    destView.x = currentPosView.x; 
    destView.y = currentPosView.y + 81; 

    [moveView setToValue:[NSValue valueWithCGPoint:destView]]; 

// Otherwise, open it 
} else { 
    // Move left to our destination 
    destView.x = currentPosView.x; 
    destView.y = currentPosView.y - 81; 

    [moveView setToValue:[NSValue valueWithCGPoint:destView]]; 
} 

// Animate the view 
[[entirePage layer] addAnimation:moveView forKey:@"move"]; 

// Set the final position of our layer 
[[entirePage layer] setPosition:destView]; 

menuDisplayed = !menuDisplayed; 

然後在animationDidStop方法:

CGPoint currentPosMenu = [[menuBar layer] position]; 

if (menuDisplayed) { 
    currentPosMenu.x -= 81; 
} else { 
    currentPosMenu.x += 81; 
} 

[[menuBar layer] setPosition:currentPosMenu]; 

幫助???

+0

我最近有類似的問題。在其父視圖邊界之外繪製的視圖不能與之交互。核心動畫只做動畫也是正確的。它不會改變實際的屬性。嘗試試用userInteractionEnabled。如果這不起作用,那麼一旦動畫完成後,您可能會變髒並從其超級視圖中移除視圖,然後立即再次將其添加。 – 2010-12-08 22:05:13

+0

該項目的截止日期臨近,但我找到了一個解決方法(但它不是我想要的)。我最初顯示UIView,然後將所有內容都滑出視圖。當菜單被帶回時,觸摸交互工作,但必須有另一種方式。 – Jacob 2010-12-08 22:40:24

回答

0

你應該不需要搞亂圖層。通過在界面構建器中將視圖放置到視圖中動畫後的位置,可以達到所需的效果。換句話說,首先把它們放在最終/正確的位置。在IB中不要做任何事情。

在您的代碼中,在應用程序啓動後或在使用UIViewController的-viewDidAppear:方法中,您可以將視圖偏移一定量,然後將它們恢復到它們在動畫塊中的原始位置:

myView.transform = CGAffineTransformMakeTranslation(0,81); 

[UIView beginAnimations:@"slideUp" context:nil]; 
myView.transform = CGAffineTransformIdentity; 
[UIView commitAnimations]; 

至於缺乏對你的看法用戶交互,這可能是一些事情。如果你的所有視圖都是UIImageView的子視圖,UIImageView默認情況下將userInteractionEnabled設置爲NO(至少如果你在代碼中創建一個 - 我不確定IB的默認設置是否適用於圖像視圖)。這也可能意味着你的觀點的超級觀點實際上太小,其框架不包含子視圖。 (如果剪輯已開啓了上海華,你甚至不能夠看到那些有這方面的問題的子視圖。)

編輯:

我更仔細地閱讀的東西,看你想要的東西移動在按下按鈕時,換句話說,視圖需要從一開始就隱藏起來。在這種情況下,你仍然可以將所有東西都放在IB的最終位置上,但只要將它們設置爲隱藏在IB中即可。當您按下按鈕時,在翻譯它們之前將視圖設置爲可見(隱藏=否)。這應該允許他們在IB的最終/正確位置進行佈局,確保他們位於適當的超級視圖等位置,同時仍然獲得所需的動畫效果。

0

暫時忘掉動畫;您應該通過設置其frame屬性來移動您的視圖。

例如爲:

CGRect menuFrame = entirePage.frame; 
if (menuDisplayed) 
{ 
    menuFrame.origin.x += 81; 
} 
else 
{ 
    menuFrame.origin.x -= 81; 
} 
entirePage.frame = menuFrame; 

// Do your animation here, after the view has been moved 

不要擔心動畫,直到您確認您的觀點被放置在正確的位置。一旦你確認代碼工作正常,然後在之後執行你的動畫你設置了frame屬性。

請注意,您可能根本不需要使用CoreAnimation API,除非您正在做一些複雜的事情。 UIKit可以自己做動畫。 E.g:

[UIView beginAnimations:@"MyAnimation" context:NULL]; 
myFirstView.frame = ...; 
myOtherView.frame = ...; 
[UIView commitAnimations];