제목을 업데이트 할 때 UIButton이 깜박이지 않도록하는 방법


85

UIButton에서 setTitle을 호출하면 iOS 7에서 버튼이 깜박입니다. myButton.highlighted = NO 설정을 시도했지만 버튼 깜박임이 중지되지는 않았습니다.

[myButton setTitle:[[NSUserDefaults standardUserDefaults] stringForKey:@"elapsedLabelKey"] forState:UIControlStateNormal];

myButton.highlighted = NO;

제목을 업데이트 한 타이머를 설정하는 방법은 다음과 같습니다.

- (void)actionTimer {
    if (myTimer == nil) {

        myTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0
                        target: self
                        selector: @selector(showActivity)
                        userInfo: nil
                        repeats: YES];
    }
}

실제로 제목을 업데이트하는 방법은 다음과 같습니다.

- (void)showActivity {

    NSString *sym = [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol];

    if (pauseInterval == nil) {

        // Update clock
        seconds = [[NSDate date] timeIntervalSinceDate:startInterval] - breakTime;

        // Update total earned
        secRate = rate.value / 60 / 60;
        total = secRate * seconds;
        [totalLabel setTitle:[NSString stringWithFormat:@"%@%.4f",sym,total] forState:UIControlStateNormal];

        days = seconds / (60 * 60 * 24);
        seconds -= days * (60 * 60 * 24);
        int hours = seconds / (60 * 60);
        fhours = (float)seconds / (60.0 * 60.0);
        seconds -= hours * (60 * 60);
        int minutes = seconds / 60;
        seconds -= minutes * 60;

        // Update the timer clock
        [elapsed setTitle:[NSString stringWithFormat:@"%.2i:%.2i:%.2i:%.2i",days,hours,minutes,seconds] forState:UIControlStateNormal];
    }
}

깜박이면 안됩니다. 백그라운드 스레드에서이 작업을 수행하려고합니까?
BergQuester 2013 년

예 (나는 자신의 스레드를 만들 생각) 매 초마다 버튼의 제목을 업데이트 타이머에 설정되는 것
FierceMonkey

타이머는 설정 한 경우에만 별도의 스레드에서 실행됩니다. 제목이 업데이트되는 방법과 타이머 설정 방법을 볼 수 있습니까?
BergQuester

요청 된 코드를 주요 질문에 추가했습니다
FierceMonkey 2013 년

답변:


208

버튼 유형을 UIButtonTypeCustom으로 설정하면 깜박임이 중지됩니다.


16
이것은 정말로 선호되는 대답이어야합니다. 가장 간단한 해결책. 그리고 작동합니다.
Johan Karlsson

4
동의합니다. 나는 많은 다른 솔루션을 시도했고 이것이 그 자체로 해낸 일입니다.
BBQ Steve

2
이것은 받아 들여진 대답이어야합니다. 지금까지 가장 간단한 솔루션.
Machado

1
매력처럼 작동합니다! 감사합니다

2
나는 이것이 코드를 작성하지 않고도 정말 좋은 솔루션이라고 생각합니다.
Chauyan

58

[UIView setAnimationsEnabled:NO]다른 애니메이션에 영향을 미칠 수있는 것보다 더 나은 방법 은 특정 타이틀 애니메이션 만 비활성화하는 것입니다.

목표 -C :

[UIView performWithoutAnimation:^{
  [myButton setTitle:text forState:UIControlStateNormal];
  [myButton layoutIfNeeded];
}];

빠른:

UIView.performWithoutAnimation { 
    myButton.setTitle(text, for: .normal)
    myButton.layoutIfNeeded()
}

방금 최신 iOS에서 Swift 솔루션을 사용해 보았습니다. 훌륭하게 작동합니다.
Ronen Rabinovici

1
데이 구세주. 건배!
pkc456

그냥 스위프트 3에서 이것을 시도, 그것은 layoutIfNeeded ()를 사용하지 않고 작동
user1898712

3
이것은 의심의 여지없이 받아 들여지는 대답이어야합니다!
Julius

1
이것이 가장 좋은 방법입니다. 좋은 대답입니다!
aecend

29

* 참고 *

_button의 " buttonType "이 "UIButtonTypeSystem"인 경우 아래 코드는 유효하지 않습니다 .

[UIView setAnimationsEnabled:NO];
[_button setTitle:@"title" forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

_button의 " buttonType "이 "UIButtonTypeCustom" 이면 위 코드가 유효합니다 .


19

제목 변경시 원치 않는 UIButton 애니메이션을 중지하는 방법 의 응답을 참조하십시오 . :

[UIView setAnimationsEnabled:NO];
[elapsed setTitle:[NSString stringWithFormat:@"%.2i:%.2i:%.2i:%.2i",days,hours,minutes,seconds] forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

7
에 전화를 추가하려고 @FierceMonkey layoutIfNeeded: [elapsed layoutIfNeeded];. 이것은 내 경우에 깜박임을 제거했습니다.
Klaas

1
layoutIfNeeded가 나를 위해 해냈습니다.
Kaolin Fire

그러나 오히려 더러운 해결 방법을 것으로 보인다 layoutIfNeeded작동하는 것으로 나타납니다
Przemysław Wrzesiński

7

나중에 쉽게 사용할 수 있도록 UIButton에 대한 다른 함수를 간단히 만들 수 있습니다.

extension UIButton {
    func setTitleWithoutAnimation(_ title: String?, for controlState: UIControlState) {
        UIView.performWithoutAnimation {
            self.setTitle(title, for: controlState)
            self.layoutIfNeeded()
        }
    }
}

그게 다야!

그리고 당신이 전에 만 교체하는 것처럼 제목 설정 setTitle과를setTitleWithoutAnimation


6

기본 "setTitle" 동작은 확실히 싫어요!

내 솔루션은 다음과 같습니다.

[UIView setAnimationsEnabled:NO];
[_button layoutIfNeeded]; 
[_button setTitle:[NSString stringWithFormat:@"what" forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

또한 스토리 보드의 버튼 속성에서 다음을 선택 취소합니다.

  • 하이라이트에서 반전
  • 강조 표시된 조정 이미지

그리고 확인 :

  • 비활성화 된 이미지 조정

iOS 8 에서도 테스트 및 작업했습니다 .

업데이트-Swift

사용자 지정 단추를 만들고 setTitle 메서드를 재정의하는 것이 좋습니다 .

class UnflashingButton: UIButton {
   
    override func setTitle(title: String?, forState state: UIControlState) {
        UIView.setAnimationsEnabled(false)
        self.layoutIfNeeded()
        super.setTitle(title, forState: state)
        UIView.setAnimationsEnabled(true)
    }

}

이 방법을 시도했습니다 (서브 클래 싱, setTitle : forState : 재정의 및 UIView.setAnimationsEnabled 비활성화). iOS 9 및 10 베타에서 나를 위해 작동하지 않습니다. 그것은 ... 난 단지 애니메이션을 사용하지 않으면 작동하지만 그들은이 모든 UIView의에 대한 손실거야
cdf1982

2

이것을 시도하십시오, 이것은 최신 버전의 IOS에서 작동합니다.

class CustomButtonWithNoEffect : UIButton {
    override func setTitle(_ title: String?, for state: UIControlState) {
        UIView.performWithoutAnimation {
            super.setTitle(title, for: state)
            super.layoutIfNeeded()
        }
    }

}

0

저는 코딩 및 Stackoverflow를 처음 사용하므로 https://stackoverflow.com/users/4673064/daniel-tseng 훌륭한 답변 에서 직접 확장 할 수있는 충분한 평판을 얻지 못했습니다 . 그래서 저는 저만의 새로운 답을 써야합니다.

extension UIButton {
    func setTitleWithoutAnimation(_ title: String?, for controlState: UIControlState) {
        UIView.performWithoutAnimation {
            self.setTitle(title, for: controlState)
            self.layoutIfNeeded()
        }
    }
}

다음을 제외하고 훌륭하게 작동합니다.

나중에 코드에서 "setTitleWithoutAnimation"에 대한 모든 호출이 발신자를 지정하지 않으면 CoreMedia 또는 CoreData와 관련된 이상한 메시지 (예 : "2526에서 CoreMedia 권한을 상속하지 못했습니다 : (null)")가 표시됩니다.

이것은 아마도 코딩 및 iOS에 아주 기본적인,하지만 나를 위해 새로운 코더, 그것은 같이 잠시 동안 토끼의 흔적에 나를 보내 : 오늘 확장에서 CoreMedia 권한을 상속 할 수 없습니다 사람들이 흥미있는 답변을했다 어디,하지만하지 않았다 내 문제의 근원에 도달합니다.

그래서 마침내 매개 변수가없는 함수 매개 변수를 제공해야한다는 것을 발견했습니다. 즉, 발신자를 지정해야했습니다. 해당 발신자는 UIButton, Any 또는 AnyObject 일 수 있습니다. 모두 작동했지만 궁극적으로 "self"가있는 버튼 확장을 추가하는 것과 나중에 버튼이이를 사용하고 있다고 구체적으로 말하지 않는 것 사이에 충돌이있는 것으로 보입니다.

다시 말하지만, 아마도 기본적이지만 나에게 새롭기 때문에 공유 할 가치가 있다고 생각했습니다.


0

또 다른 트릭

@IBOutlet private weak var button: UIButton! {
    didSet {
        button.setTitle(title, for: .normal)
    }
}

API를 호출하지 않고 제목의 값을 알고있는 경우에만 작동합니다. 버튼의 제목은 뷰가로드되기 전에 설정되므로 애니메이션이 표시되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.