source

제목 변경 시 원치 않는 UIButton 애니메이션을 중지하는 방법

manycodes 2023. 4. 11. 22:12
반응형

제목 변경 시 원치 않는 UIButton 애니메이션을 중지하는 방법

iOS 7에서는 UIButton 타이틀이 잘못된 시각에 애니메이션화/애니메이션되고 있습니다.iOS 6에서는 이 문제가 발생하지 않습니다. 단지 다음을 사용하고 있을 뿐입니다.

[self setTitle:text forState:UIControlStateNormal];

빈 프레임 없이 바로 이 일이 일어나길 바랍니다.이 깜박임은 특히 주의를 산만하게 하고 다른 애니메이션으로부터 주의를 끌게 한다.

하다를 사용하세요.performWithoutAnimation:메서드를 사용하여 레이아웃을 나중에가 아니라 즉시 실행하도록 합니다.

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

이것은 커스텀 버튼에 대해서 유효합니다.

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

시스템 버튼의 경우 애니메이션을 다시 활성화하기 전에 다음을 추가해야 합니다(@Klaas 감사합니다).

[_button layoutIfNeeded];

Swift에서는 다음을 사용할 수 있습니다.

UIView.performWithoutAnimation {
    self.someButtonButton.setTitle(newTitle, forState: .normal)
    self.someButtonButton.layoutIfNeeded()
}

버튼 유형을 사용자 정의 양식 인터페이스 작성기로 변경합니다.

여기에 이미지 설명 입력

이건 나한테 효과가 있었어.

주의:

_ 버튼의 "버튼 유형"이 "UIButtonTypeSystem"인 경우 아래 코드는 유효하지 않습니다.

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

_button의 "button Type"이 "UIButton Type Custom"이면 위의 코드가 유효합니다.

7.한 유일한 은 iOS 7.1 을 초기화하는 이었습니다.UIButtonTypeCustom.

스위프트 5

myButton.titleLabel?.text = "title"
myButton.setTitle("title", for: .normal)

효과적인 해결책을 찾습니다.

_logoutButton.titleLabel.text = NSLocalizedString(@"Logout",);
[_logoutButton setTitle:_logoutButton.titleLabel.text forState:UIControlStateNormal];

먼저 버튼의 제목을 변경한 후 이 제목에 맞게 버튼 크기를 조정합니다.

[ ]와 [UIButton]system을 가지고 있습니다.setTitle(_:for:) 두 할 수 두 가지 방법으로 수정할 수 있습니다.

  1. 를 '버튼 종류'로 합니다.customInterface Builder builder중 :
let button = UIButton(type: .custom)

여기에 이미지 설명 입력

  1. 코드에서 애니메이션 사용 안 함:
UIView.performWithoutAnimation {
    button.setTitle(title, for: .normal)
    button.layoutIfNeeded()
}

버튼 타입을 [UIButton Type Custom](UIButton 타입 커스텀)으로 설정하면, 점멸이 정지합니다.

이를 위해 Swift를 확장했습니다.

extension UIButton {
    func setTitleWithoutAnimation(title: String?) {
        UIView.setAnimationsEnabled(false)

        setTitle(title, forState: .Normal)

        layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }
}

9에서 작동 UIButtonTypeSystem.

(Swift 2, Swift 3 및 Objective-C의 코드는 유사해야 합니다.)

UIButton 유형을 Custom으로 설정합니다.페이드인 및 페이드아웃 애니메이션을 제거합니다.

보통 버튼 타입을 Custom으로 설정하기만 하면 됩니다만, 그 외의 이유로 UIButton을 서브클래스로 해, 버튼 타입을 디폴트(시스템)로 설정할 필요가 있었기 때문에, 점멸이 재발했습니다.

★★UIView.setAnimationsEnabled(false)전, 그 후로 바뀌기 전, 그리고 사실로 바뀌기 전,.self.layoutIfNeeded()그렇지 않으면.

iOS 9 및 10 베타에서는 이것만 다음과 같은 순서로 동작했습니다.

1) UIButton용 서브클래스를 만듭니다(Storyboard 버튼의 커스텀 클래스도 설정하는 것을 잊지 말아 주세요).

오버라이드 2) 오버라이드setTitle:forState:음음음같 뭇매하다

override func setTitle(title: String?, forState state: UIControlState) {

    UIView.performWithoutAnimation({

        super.setTitle(title, forState: state)

        self.layoutIfNeeded()
    })
}

Interface Builder 에서는 버튼 타입을 System(시스템)에 남겨둘 수 있습니다.이 접근방식이 기능하기 위해 버튼 타입을 Custom Type(커스텀타입)으로 변경할 필요는 없습니다.

이것이 다른 사람에게 도움이 되기를 바랍니다.저는 오랫동안 귀찮은 점멸 버튼에 시달려왔기 때문에 다른 사람에게 주지 않았으면 합니다.

커스텀 버튼을 작성하기만 하면 제목을 변경하는 동안 애니메이션이 정지됩니다.

        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn setTitle:@"the title" forState:UIControlStateNormal];

Storyboard 체크박스에서도 할 수 있습니다.스토리보드의 버튼을 선택합니다.-> 속성인스펙터를 선택합니다(왼쪽에서 네 번째).-> 'Type' 드롭다운 메뉴에서 'System' 대신 'Custom'을 선택합니다.

행운을 빕니다.

Xhacker Liu의 Swift 4 버전 답변

import Foundation
import UIKit
extension UIButton {
    func setTitleWithOutAnimation(title: String?) {
        UIView.setAnimationsEnabled(false)

        setTitle(title, for: .normal)

        layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }
} 

타이틀 라벨의 레이어에서 애니메이션을 삭제할 수 있습니다.

    [[[theButton titleLabel] layer] removeAllAnimations];

블록 할 수 꼭 전화 주세요.layoutIfNeeded() a " Animation :다음 중 하나:

button1.setTitle("abc", forState: .Normal)
button2.setTitle("abc", forState: .Normal)
button3.setTitle("abc", forState: .Normal)
UIView.performWithoutAnimation {
    self.button1.layoutIfNeeded()
    self.button2.layoutIfNeeded()
    self.button3.layoutIfNeeded()
}

개 있는 는, 「」라고 하는 만으로 콜 하는 것을 해 주세요.layoutIfNeeded()「 」:

button1.setTitle("abc", forState: .Normal)
button2.setTitle("abc", forState: .Normal)
button3.setTitle("abc", forState: .Normal)
UIView.performWithoutAnimation {
    self.view.layoutIfNeeded()
}

이 회피책은 UIButton Type System에서도 사용할 수 있지만 어떤 이유로 버튼이 활성화되어 있는 경우에만 사용할 수 있습니다.

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

따라서 제목을 설정할 때 버튼을 비활성화해야 하는 경우 이러한 항목을 추가해야 합니다.

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

(iOS 7, Xcode 5)

상기의 좋은 답변을 조합하면, UIButton Type System 에 대해서 다음의 회피책을 얻을 수 있습니다.

if (_button.enabled)
{
    [UIView setAnimationsEnabled:NO];
    [_button setTitle:@"title" forState:UIControlStateNormal];
    [UIView setAnimationsEnabled:YES];
}
else // disabled
{
    [UIView setAnimationsEnabled:NO];
    _button.enabled = YES;
    [_button setTitle:@"title" forState:UIControlStateNormal];
    _button.enabled = NO;
    [UIView setAnimationsEnabled:YES];
}

UITABbarController 내의 뷰컨트롤러에서 버튼 제목을 변경할 때 애니메이션 문제가 발생하였습니다.스토리보드에 원래 설정되어 있던 타이틀이 잠시 후에 새로운 가치로 사라졌습니다.

모든 서브뷰를 반복하고 버튼 제목을 키로 사용하여 NSLocalizedString을 사용하여 다음과 같은 현지화된 값을 얻습니다.

for(UIView *v in view.subviews) {

    if ([v isKindOfClass:[UIButton class]]) {
        UIButton *btn = (UIButton*)v;
        NSString *newTitle = NSLocalizedString(btn.titleLabel.text, nil);
        [btn setTitle:newTitle];
    }

}

애니메이션을 트리거하는 것은 실제로 btn.titleLabel.text에 대한 호출임을 알게 되었습니다.스토리보드를 계속 사용하고 컴포넌트를 이와 같이 동적으로 현지화하려면 Identity Inspector에서 모든 버튼의 Restore ID를 제목과 동일하게 설정하고 제목 대신 키로 사용합니다.

for(UIView *v in view.subviews) {

    if ([v isKindOfClass:[UIButton class]]) {
        UIButton *btn = (UIButton*)v;
        NSString *newTitle = NSLocalizedString(btn.restorationIdentifier, nil);
        [btn setTitle:newTitle];
    }

}

이상적이지는 않지만, 효과가 있습니다.

Xhacker Liu 확장자가 Swift 3으로 변환되었습니다.

extension UIButton {
    func setTitleWithoutAnimation(title: String?) {
        UIView.setAnimationsEnabled(false)

        setTitle(title, for: .normal)

        layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }
}

Swift에서 애니메이션 버튼 제목 변경을 위한 편리한 확장 기능으로 기본 구현과 잘 어울립니다.

import UIKit

extension UIButton {
  /// By default iOS animated the title change, which is not desirable in reusable views
  func setTitle(_ title: String?, for controlState: UIControlState, animated: Bool = true) {
    if animated {
      setTitle(title, for: controlState)
    } else {
      UIView.setAnimationsEnabled(false)
      setTitle(title, for: controlState)
      layoutIfNeeded()
      UIView.setAnimationsEnabled(true)
    }
  }
}

여러 가지 답을 조합하여 작업을 수행했습니다.

[[[button titleLabel] layer] removeAllAnimations];

    [UIView performWithoutAnimation:^{

        [button setTitle:@"Title" forState:UIControlStateNormal];

    }];

2개의 애니메이션과 2개의 버튼을 생성하는 것이 버튼의 텍스트를 애니메이션 및 변경할 때 발생하는 문제를 피하기 위해 더 나은 해결책일 수 있습니다.

두 번째 uibutton을 만들고 2개의 애니메이션을 생성했는데, 이 솔루션은 히크업 없이 작동합니다.

    _button2.hidden = TRUE;
    _button1.hidden = FALSE;

    CGPoint startLocation = CGPointMake(_button1.center.x, button1.center.y - 70);
    CGPoint stopLocation  = CGPointMake(_button2.center.x, button2.center.y- 70);


    [UIView animateWithDuration:0.3 animations:^{ _button2.center = stopLocation;} completion:^(BOOL finished){_button2.center = stopLocation;}];
    [UIView animateWithDuration:0.3 animations:^{ _button1.center = startLocation;} completion:^(BOOL finished){_button1.center = startLocation;}];

언급URL : https://stackoverflow.com/questions/18946490/how-to-stop-unwanted-uibutton-animation-on-title-change

반응형