2010-12-08 4 views
0

괜찮습니까?이 질문은 초보자 용 질문이므로 미리 사과드립니다. Interface Builder에서 스크린 밖에서 레이아웃 한 UIView가 있습니다. 사용자가 버튼을 누르면이 화면에 애니메이션을 적용하려고합니다. 그것은 작동하지만 UIView의 모든 버튼과 상호 작용할 수 없습니다. UIViews 레이어의 위치를 ​​설정하려고 시도했지만 실제로 UIView 메뉴에서 왼쪽에 여분의 81 픽셀을 표시합니다. 이런 일이 생기면 버튼과 상호 작용할 수 있지만 화면 오른쪽에 있어야합니다.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 방법에 : 다음은 openMenu 버튼에 IBAction를 내 코드입니다

CGPoint currentPosMenu = [[menuBar layer] position]; 

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

[[menuBar layer] setPosition:currentPosMenu]; 

도움말 ???

+0

최근에 비슷한 문제가있었습니다. 상위 뷰의 경계 외부에서 그려진 뷰는 상호 작용할 수 없습니다. 또한 Core Animation은 애니메이션 만 수행하는 것이 맞습니다. 실제 속성을 변경하지 않습니다. userInteractionEnabled를 시험 사용해보십시오. 이 방법으로 효과가 없으면 더러운 상태가되어 애니메이션이 끝나면 슈퍼 뷰에서 뷰를 제거한 다음 즉시 다시 추가 할 수 있습니다. –

+0

이 프로젝트의 기한이 가까워 지지만 해결 방법을 찾았습니다 (그러나 원하는 것은 아닙니다). 처음에는 UIView를 표시 한 다음 모든 것을 슬라이드하여 봅니다. 터치 상호 작용은 메뉴를 가져 왔을 때 작동하지만 다른 방법이 있어야합니다. – Jacob

답변

0

레이어를 엉망으로 만들 필요가 없습니다. Interface Builder에서 뷰를 애니메이션으로 표시 한 후 배치 할 위치에 뷰를 배치하여 원하는 효과를 얻을 수 있습니다. 즉, 처음에는 최종/올바른 위치에 놓습니다. IB에서 아무 것도하지 마십시오.

코드가 앱 실행 후 또는 UIViewController를 사용하는 경우 -viewDidAppear : 메서드에서 뷰를 어느 정도 오프셋 한 다음 애니메이션 블록의 원래 위치로 복원 할 수 있습니다.

myView.transform = CGAffineTransformMakeTranslation(0,81); 

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

사용자 상호 작용이 부족하다는 점은 여러 가지 일 수 있습니다. 모든 뷰가 UIImageView와 같은 서브 뷰일 경우 UIImageView는 기본적으로 NO로 설정된 userInteractionEnabled를 가지고 있습니다. 적어도 코드에서 하나를 빌드하면 IB의 기본 설정이 이미지 뷰에 맞는지 확실하지 않습니다. 또한보기의 수퍼 뷰가 실제로 너무 작고 프레임에 하위보기가 포함되어 있지 않을 수도 있습니다. (클리핑은 수퍼에 대해 설정 한 경우, 당신은이 특별한 문제가있는 하위 뷰를 참조 할 수 없습니다.)

편집 :

좀 더 신중하게 물건을 읽고 당신이 일 이동하려는 참조 버튼 누름에 대한 응답으로 다른 말로보기가 처음부터 숨겨져 있어야합니다. 이 경우 IB에서 모든 것을 최종 위치에 놓을 수 있지만 IB에서 숨겨진 것으로 설정하십시오. 버튼을 누르면 번역하기 전에보기가 표시되도록 설정됩니다 (숨김 = 아니오). 그렇게하면 IB에서 최종/올바른 위치에 배치되어 적절한 애니메이션 효과를 얻는 동안 적절한 수퍼 뷰 등에 배치되도록 할 수 있습니다.

+0

죄송 합니다만, 후속 조치를 취하지 않았지만 위의 해결 방법은 myView.transform = CGAffineTransformMakeTranslation (81,0)이며 변형을 다시 ID로 설정하면 멋지게 작동합니다. 고맙습니다! – Jacob

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은 자체적으로 애니메이션을 수행 할 수 있습니다. 이자형.g :

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