2012-07-03 4 views
2

두 개의 UILabels를 업데이트하고 화면의 오프 스크린에서 개체 애니메이션을 시작하는 데 사용하는 일련의 UIButton이 있습니다. 진행은 이것 같이 간다. 버튼 1 & 2가 표시되고 사용자가 버튼을 누르면 UILabel이 업데이트되고 새 UIImageView가 화면에 표시됩니다. 이것은 두 번째 라운드에서 첫 번째 반복이 잘 작동하고, 숨겨진 버튼 3과 4는 보이게됩니다. 사용자가 버튼 3 또는 4를 선택하면 다른 UIImageView가 화면에 애니메이션으로 표시되어야합니다 (다른 이미지 위에 ... "스태킹"). UIImageView는 사용자가 버튼 1 또는 2 중 하나를 눌렀을 때 애니메이션으로 나타나 사라지고 아무 것도 움직이지 않습니다. UILabels가 단추 선택에 따라 업데이트해야하는 경우에만 발생합니다. UILabel에서 업데이트 할 필요가 없으므로 애니메이션이 올바르게 작동합니다.UIImageView가 사라질 때 UILabel이 업데이트되었습니다.

와 관계있는 코드 : 나는 그것을 방지하는 방법을 바로 확인하지 UILabel의 ... 임을 업데이트 다시 도달로

-(IBAction)didTapSizeButton:(id) sender { 

if ([sender tag] == 1) { 
    sizeLabel.text = @"12 oz"; 
} 
else if ([sender tag] == 2) { 
    sizeLabel.text = @"24 oz"; 
} 

if (coasterTwo.center.x != 150) { 

    [UIView animateWithDuration:0.35 
          delay:0 
         options:(UIViewAnimationOptionCurveEaseOut) 
        animations:^{ 
         coasterTwo.center = CGPointMake(150, 220); 

        } completion:^(BOOL finished) { 


        }]; 

} 

containerOne.hidden = NO; 
containerTwo.hidden = NO; 

} 

-(IBAction)didTapContainerButton:(id)sender { 

if ([sender tag] == 3) { 
    containerLabel.text = @"Bottle"; 
} 

else if ([sender tag] == 4) { 
    containerLabel.text = @"Can"; 
} 

if (coasterTwo.center.x == 150 && coasterThree.center.x != 150) { 

    [UIView animateWithDuration:0.35 
          delay:0 
         options:(UIViewAnimationOptionCurveEaseOut) 
        animations:^{ 
         CGPoint center = coasterThree.center; 
         center.x += 305; 
         coasterThree.center = center; 

        } 
        completion:^(BOOL finished){ 

        }]; 

} 


} 

UIImageViews은 분명히 즉시 자신의 시작 위치로 재설정됩니다.

[UIView beginAnimations:nil context:nil]; 
//Code for changing frames/alpha/anything else that is animatable 
[UIView commitAnimations]; 

이이 밖으로 시도 도움이된다면 참조 : 당신이 완료 블록을 필요로하지 않기 때문에

+0

이상한. 당신은 서브 클래 싱 된 UIView 또는 이와 비슷한 것을 사용하지 않습니다. 그렇습니까? 왜 "UIImageViews가 분명히 시작 위치로 재설정됩니다"라고합니까? 위 코드에서 제안 할 사항은 없습니다. 일반적으로 자신의 'drawRect'와 같은 위치 (프레임, 원점 또는 중심)를 다시 설정하는 코드가 없으면 시작 위치로 재설정되지 않습니다. 'viewDidLoad'가 아닌 다른 코드를 가지고 있다면 그것을 공유하십시오. – Rob

+0

매우 이상하게 ... .m 파일에는 단추 사용자 지정을 처리하고 단추에 .hidden 및 .tag 속성을 설정하는 것 외의 다른 코드가 없습니다. 'viewDidLoad'와'shouldAutorotateToInterfaceOrientation'을 제외하고 전체 .m이 보여집니다. UIImageView 위치 재설정은 적절한 단어가 아닐 수도 있지만 버튼 3 또는 4를 누를 때 UIlabel이 업데이트 될 때 발생하는 동작을 가장 잘 나타냅니다. – blueHula

+0

그러나 문제는 여기에 있지 않습니다. – Rob

답변

0

나는 정적의 UIView commitAnimations 방법을 사용하는 것이 좋습니다 것입니다.

+0

거기에는 운이 없지만 여전히 같은 행동을합니다. 애니메이션은 태그에 관한 if/else 문을 주석 처리하고 UILabels을 업데이트하지 않고 버튼을 기능 시키면 잘 작동합니다. 나는 그 문제가 어딘가에 있다고 생각하고있다. – blueHula

0

간단한 것이 있어야합니다. 내가 말했듯이 didTapContainerButton 코드는 용의자로 보입니다. (때마다 coasterThree으로 바뀌고 오른쪽으로는155 포인트가됩니다.) 위의 아무 것도 나타나지 않아서 coasterTwo이 사라집니다. 그럴 수있는 유일한 방법은 (a) 일부 IB 링크가 엉망인 경우입니다 (버튼 3 또는 4를 눌렀을 때 이미지가 사라질 수있는 방법이 명확하지 않지만). (b) 표시하지 않는 코드가 숨겨져있을 수 있습니다. 또는 (c) 창을 숨기고있는 다른 컨트롤을 가지고있다. (라벨을 업데이트 할 때 그 라벨이 뒤에서 뒤 틀릴 수있는 상황을 보았다. 레이블을 투명한 배경으로 만들거나, 명시 적으로 이미지를 포 그라운드로 이동하거나, 알파 채널을 0.5로 설정하여 디버깅하는 동안 물건을 볼 수 있도록하십시오.

첫 번째 가능성을 진단하려면 프로젝트를 DropBox 또는 다른 것으로 업로드해야합니다. 우리는이 작업을 편하게 수행 할 수 있습니다. 그렇지 않다면 프로젝트 사본을 만드십시오. 기밀 또는 독점권을 제거하고 업로드하십시오.

두 번째 가능성을 진단하려면 질문을보기 컨트롤러 .m 파일의 전체 코드로 업데이트하면됩니다.

이 세 번째 가능성을 진단하려면 이미지를 애니메이션 앞에 배치하기 전에 (coasterThree에 애니메이션을 적용하기 전에 [self.view bringSubviewToFront:coasterThree];) 이미지를 앞쪽으로 이동해야합니다. 모든 컨트롤 중 backgroundColor (및 IB에 추가 한 컨테이너 UIView가있는 경우)도 투명하게 표시되도록 할 수 있습니다. [UIColor clearColor]. 또한 진단 목적으로 일시적으로 알파를 줄여서 볼 수 있습니다. (따라서 IB에서 수행 할 수있는 작업은 기본 UIView 배경을 클릭하고 + A를 누르십시오.을 사용하여 모든 컨트롤을 선택하고 알파를 0.5로 변경하십시오.)

결론 옵션 3을 원합니다. 행운이 없다면 프로젝트를 공유하거나 포괄적 인 코드 샘플을 공유하십시오.만약 당신이 편안하게 느끼지 않는다면, 당신이 오래된 NIB를 던져 버리고 그것을 처음부터 다시 만들 것을 제안 할 수도 있습니다 (당신이 가지고있는 것에 이상한 것이있을 경우를 대비해서). 또는 완전히 새로운 테스트 프로젝트를 점차적으로 구축하기 시작할 수도 있습니다. UI를 다시 구현하고 어디에 잘못되었는지 파악할 수 있는지 확인하십시오.

하지만 UIImageViews가 UILabel 텍스트 값을 애니메이션으로 설정하고 설정하는 것과 일관성이 없습니다. 아래쪽에는 두 개의 버튼이있는 코드와 두 개 이미지가 켜지고 꺼지는 레이블, 업데이트 된 레이블이 있으며 모두 잘 작동합니다. (저는 자신감이 없었습니다. 저는 UILabels와 애니메이션과의 이상한 상호 작용이 있었음을 두려워하기 시작했습니다.) 한숨.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    CGPoint center; 

    self.label.text = @""; 

    // move image 1 (dog image) off screen to the left 

    center = self.image1.center; 
    center.x = -0.5 * self.view.frame.size.width; 
    self.image1.center = center; 
    self.image1.hidden = YES; 

    // move image 2 (cat image) off screen to the right 

    center = self.image2.center; 
    center.x = 1.5 * self.view.frame.size.width; 
    self.image2.center = center; 
    self.image2.hidden = YES; 

    // Do any additional setup after loading the view. 
} 

// if you hit button 1 (dog) button, change label, and animate the dog image on and cat image off 

- (IBAction)button1:(id)sender 
{ 
    self.label.text = @"Dog"; 

    self.image1.hidden = NO; 

    [UIView animateWithDuration:0.5 
        animations:^{ 
         CGPoint center; 

         // move image 1 (dog image) onscreen 

         center = self.image1.center; 
         center.x = 0.5 * self.view.frame.size.width; 
         self.image1.center = center; 

         // move image 2 (cat image) off screen to the right (if it's not there already) 

         center = self.image2.center; 
         center.x = 1.5 * self.view.frame.size.width; 
         self.image2.center = center; 
        }]; 
} 

// if you hit button 2 (cat) button, change label, and animate the dog image off and cat image on 

- (IBAction)button2:(id)sender 
{ 
    self.label.text = @"Cat"; 

    self.image2.hidden = NO; 

    [UIView animateWithDuration:0.5 
        animations:^{ 
         CGPoint center; 

         // move image 1 (dog image) off screen to the left 

         center = self.image1.center; 
         center.x = -0.5 * self.view.frame.size.width; 
         self.image1.center = center; 

         // move image 2 (cat image) on screen 

         center = self.image2.center; 
         center.x = 0.5 * self.view.frame.size.width; 
         self.image2.center = center; 
        }]; 
} 
0

제 학생 중 한 명과 같은 일이 생겼습니다. 당신이 미치지 않는다는 것을 증명하기 위해 ... iOS 5.x 시뮬레이터에서 실행 해보십시오 (그리고 바라는 바는 원하는 동작을 관찰하십시오).

iOS 6의 경우 UIView에 대한 일부 상태 보존 코드를 작성해야합니다. 그렇지 않으면 사랑하지 않아도되고, 없으면 살 수 없다고 생각하면됩니다. 파일 관리자에서 "Use Autolayout"을 선택 취소하여 xib 파일의 제약 조건을 확인하십시오.

희망이 도움이됩니다.

관련 문제