2012-10-30 6 views
0

나는이 머리카락을 당기는 데 어려움을 겪고 있습니다. 누군가가 나를 도울 수 있기를 바랍니다. 그것은 작은 일처럼 보이지만 나는 어떤 해결책을 찾을 수 없었습니다.UIButton은 항상 첫 번째 위치로 다시 이동합니까?

나는 애니메이션 블록으로 돌아 다니고 싶은 UIButton을 가지고있다. 단추를 클릭 할 때마다 새 위치로 이동해야하며 단추는 항상 올바른 위치로 이동합니다. 문제는 항상 첫 번째 위치에서 새 위치로 이동한다는 것입니다.

내가 (0,0)에 단추가 있다고 말하면 나는 그것을 (0,50)으로 움직입니다. 아름답게 작동합니다! 이제 단추를 (0,100)으로 옮기고 (0,50)에서 (0,100)으로 애니메이션을 적용 할 것을 기대하지만 에서 (0,100)으로 애니메이션을 적용하므로 올바른 위치로 이동하지만 잘못된 위치에서 이동합니다.

는 난이 완료 블록의 단추를 이동 제 경우에 애니메이션 블록

[UIView animateWithDuration:0.5f 
           delay:0.0f 
          options:UIViewAnimationCurveLinear 
         animations:^{ 
         } 
         completion:nil]; 

를 A A 새로운 프레임을 설정하여 UIButton를 이동할 때 다른 컨트롤 완성 이동.

나는 누군가가 거기에서 이야기하고있는 것을 정말로 알고있다. 나는 무엇에 대해 이야기하고 있고, 나를 위해 대답을 가지고있다.

내가있는 UIButton이 인 애니메이션에 사용하는 코드는 버튼의 이름은

[UIView animateWithDuration:1 
         delay:0 
        options:UIViewAnimationCurveLinear 
       animations:^{ 
        txtNewPhoneNumber.frame = CGRectMake(newXnumber, newYnumber, txtPhoneNumber.frame.size.width, txtPhoneNumber.frame.size.height); 

       } 
       completion:^(BOOL finished) { 
        txtNewPhoneNumber.placeholder = @"here you go!"; 

        //animate add textfield button. 
        [UIView animateWithDuration:0.5f 
              delay:0 
             options:UIViewAnimationCurveLinear 
             animations:^{ 



              [sender setFrame:CGRectMake(btnAddPhoneNumber.frame.origin.x, newYnumber, btnAddPhoneNumber.frame.size.width, btnAddPhoneNumber.frame.size.height)]; 

              txtNewPhoneNumberTitle.frame = CGRectMake(newXtitle, newYtitle, txtPhoneNumberTitle.frame.size.width, txtPhoneNumberTitle.frame.size.height); 

              [btnDelete setFrame:btnDeleteRect]; 
             } 
             completion:^(BOOL finished) { 
             }]; 
       }]; 

내 질문을 읽어 주셔서 감사하고 도와 내가 해결책을 찾기 "btnAddPhoneNumber"하고 또한 "보낸 사람"입니다 .

편집 (추가 코드 예제)

+0

둘 다 위해 작성한 코드를 게시 할 수 있습니까? – iDev

+0

안녕하세요. ACB, 나는 완벽한 애니메이션 블록을 추가했습니다. – MortenHN

+0

완료 블록에서 콘솔에 txtNewPhoneNumber의 프레임을 인쇄하고 완료 블록에있을 때 프레임을 올바르게 업데이트했는지 확인할 수 있습니까? – iDev

답변

0

이 문제를 해결한다면, 시도 두 번째 애니메이션의 옵션 UIViewAnimationOptionBeginFromCurrentState을 추가 참조하십시오.

[UIView animateWithDuration:0.5f 
           delay:0.0f 
          options:UIViewAnimationCurveLinear | UIViewAnimationOptionBeginFromCurrentState 
         animations:^{ 
         } 
         completion:nil]; 

번째 애니메이션의 종료 처리기 (동일한 값) 다시 버튼의 프레임을 설정하는 것 이동하는 또 다른 방법.

+0

안녕하세요. Tobi. 나는 둘 다 시도하고 그것의 원래 프레임에서 여전히 animates 다른 어떤하지 않습니다. – MortenHN

+0

관련 코드를 모두 제공해 주시겠습니까? 버튼과 'newYnumber'에 대한 값을 설정하는 부분에 대한 액션을 포함합니다. – Tobi

0

이 문제를 확인하십시오. 덧글에서 언급했듯이 이것을 마지막 옵션으로 사용할 수 있습니다. 권장 접근법이 아닙니다.

[UIView animateWithDuration:1 
         delay:0 
        options:UIViewAnimationCurveLinear 
       animations:^{ 
        txtNewPhoneNumber.frame = CGRectMake(newXnumber, newYnumber, txtPhoneNumber.frame.size.width, txtPhoneNumber.frame.size.height); 

       } 
       completion:^(BOOL finished) { 
        txtNewPhoneNumber.placeholder = @"here you go!"; 

        [self performSelector:@selector(callSecondAnimation) withObject:nil afterDelay:1.5f)]; //or 0.5f 
       }]; 

- (void)callSecondAnimation { 
    //animate add textfield button. 
    [UIView animateWithDuration:0.5f 
          delay:0 
         options:UIViewAnimationCurveLinear 
        animations:^{ 

         [sender setFrame:CGRectMake(btnAddPhoneNumber.frame.origin.x, newYnumber, btnAddPhoneNumber.frame.size.width, btnAddPhoneNumber.frame.size.height)]; 

         txtNewPhoneNumberTitle.frame = CGRectMake(newXtitle, newYtitle, txtPhoneNumberTitle.frame.size.width, txtPhoneNumberTitle.frame.size.height); 

         [btnDelete setFrame:btnDeleteRect]; 
        } 
        completion:^(BOOL finished) { 
        }]; 
} 

이 업데이트 : 자동 레이아웃에서 진드기를 제거 할 때

내가 문제, 자동 레이아웃에 사용되는 뷰를 발견

[UIView animateWithDuration:1 
         delay:0 
        options:UIViewAnimationCurveLinear 
       animations:^{ 
        txtNewPhoneNumber.frame = CGRectMake(newXnumber, newYnumber, txtPhoneNumber.frame.size.width, txtPhoneNumber.frame.size.height); 

       } 
       completion:^(BOOL finished) { 
        txtNewPhoneNumber.placeholder = @"here you go!"; 
        txtNewPhoneNumber.frame = CGRectMake(newXnumber, newYnumber, txtPhoneNumber.frame.size.width, txtPhoneNumber.frame.size.height);//try setting it here once and then call next one 
        [self callSecondAnimation]; 
       }]; 

- (void)callSecondAnimation { 
    //animate add textfield button. 
    [UIView animateWithDuration:0.5f 
          delay:0 
         options:UIViewAnimationCurveLinear 
        animations:^{ 

         [sender setFrame:CGRectMake(btnAddPhoneNumber.frame.origin.x, newYnumber, btnAddPhoneNumber.frame.size.width, btnAddPhoneNumber.frame.size.height)]; 

         txtNewPhoneNumberTitle.frame = CGRectMake(newXtitle, newYtitle, txtPhoneNumberTitle.frame.size.width, txtPhoneNumberTitle.frame.size.height); 

         [btnDelete setFrame:btnDeleteRect]; 
        } 
        completion:^(BOOL finished) { 
        }]; 
} 
+0

두 가지 제안 중 아무 것도 변경되지 않습니다. 이러한 접근 방식을 제안하고 있기 때문에 문제의 원인을 아십니까? 도와 주셔서 감사합니다. 정말로 감사드립니다. – MortenHN

+0

내 생각 엔 이전 애니메이션이 끝나기 전에 완료 블록이 호출되는 것입니다. 따라서이 두 애니메이션 사이에 지연을 도입하여 사용자가 연속적인 느낌을 갖도록하는 것이 계획이었습니다. 따라서 두 번째 애니메이션을 삭제하면 첫 번째 애니메이션이 제대로 작동하여 원하는 시점으로 이동할 수 있습니까? – iDev

+0

나는 당신이 의미하는 바를 알고 있지만, 슬프게도 그것은 내 문제를 해결하지 못하는 것 같습니다. 이 아주 이상한 것을 발견하고있는 Im! – MortenHN

0

이 첫 번째 시도, 내 버튼의 새로운 위치는 저장되고 다음 애니메이션은 이전 위치에서 계속됩니다.

ACB 및 Tobi에게 도움을 주신 덕분에 문제 해결에 도움이되는 다양한 솔루션을 시도해 볼 수있었습니다.

관련 문제