적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Swift UIKit] All about UIButton()

hongssup_ 2021. 3. 11. 16:05
반응형

let button = UIButton() 으로 initialize 해주기

이렇게 선언만 해줬을 때 기본 내장 속성으로는 네모난 투명 배경에 텍스트가 기본이라고 한다. 

속성을 바꿔보자면

button.backgroundColor = .black  // 버튼 색 바꾸기

button.layer.cornerRadius = 16  // 버튼 원으로 바꾸기 위한 속성. 버튼 크기/2 하면 될듯 

button.layer.borderWidth = 1  // 테두리 굵기 설정

button.layer.borderColor = UIColor.white.cgColor  // 테두리 색 설정(cgColor)

button.setTitle("버튼", for: .normal)  // 버튼 텍스트 설정

button.setImage("이미지", for: .normal)  // 버튼 이미지 설정

button.addTarget(self, action: #selector(buttonTouch), for: .touchUpInside)  // 버튼이벤트 함수 넣어주기

@objc func buttonTouch() { }  // 안에 버튼 터치 시 실행될 메서드 추가해주기

button.backgroundColor = .black  // 버튼 색 바꾸기

button.layer.cornerRadius = 16  // 버튼 원으로 바꾸기 위한 속성. 버튼 크기/2 하면 될듯 

button.layer.borderWidth = 1  // 테두리 굵기 설정

button.layer.borderColor = UIColor.white.cgColor  // 테두리 색 설정(cgColor)

button.setTitle("버튼", for: .normal)  // 버튼 텍스트 설정

button.setTitleColor(UIColor.darkGray, for: .normal)  //버튼 텍스트 색상 설정

button.titleLabel?.font = UIFont(name: "폰트", size: 16) ?? .systemFont(ofSize: 16, weight: .regular)  //폰트 및 사이즈 설정

button.setImage("이미지", for: .normal)  // 버튼 이미지 설정

button.addTarget(self, action: #selector(buttonTouch), for: .touchUpInside)  // 버튼이벤트 함수 넣어주기

@objc func buttonTouch() { }  // 안에 버튼 터치 시 실행될 메서드 추가해주기

custom UIColor 설정

UIColor(red: 213/255, green: 213/255, blue: 213/255, alpha: 1)

 

Underline 설정

: UIButton 의 extension으로 함수 설정

func setUnderline() {
    guard let title = title(for: .normal) else { return }
    let attributedString = NSMutableAttributedString(string: title)
    attributedString.addAttribute(.underlineStyle,
                                  value: NSUnderlineStyle.single.rawValue,
                                  range: NSRange(location: 0, length: title.count))
    setAttributedTitle(attributedString, for: .normal)
}

참고 : 김종권 iOS

 


2022-10-06

* UIButton title text update 이슈 해결

api response 값을 받아와 UICollectionView Cell 내의 UIButton title text 를 변경해야하는데, 아무리 해줘도 버튼 텍스트가 변하지를 않는 것이었다!!! 

- DispatchQueue.main.async { } 안에 넣어서 비동기 설정도 해보고

- .layoutIfNeeded()

- collectionView dataSource delegate 의 cellForItemAt 에서 cell.button.setTitle("")로 직접 설정도 해보고

온갖 뻘짓을 다했지만 아무것도 먹히지 않았다.. 

허무하게도 그 이유는..!

처음 버튼을 초기화해줄 때, button.setUnderline() 을 함께 해줬었는데 그게 문제였다. 

위의 setUnderline() 메서드를 보면 NSMutableAttributedString 을 사용해서 underline 속성을 추가해주는데, 이렇게 버튼 title을 attributed 속성으로 변경을 미리 해버리면 title 변경할 때도 다시 attributedString 으로 텍스트를 수정해주어야 한다. 

그건 귀찮으니까 initialize 해줄 때는 그냥 setTitle로 텍스트만 설정해준 후, api 결과값을 받아와 다시 setTitle 로 버튼 텍스트를 업데이트 해주고 마지막으로 .setUnderline() 을 해줬더니 변경이 잘 되었다.. ㅎ 

밑줄 있는 버튼 텍스트 변경은 까다롭구만 😅

정리하자면, button의 title 속성이 plain 일때와 Attributed 일 때, 텍스트 변경하는 방법이 달라진다. 

// plain일 때
button.setTitle("title", for: .normal)

// attributed일 때
let attributedStr = NSAttributedString(string: "title")
button.setAttributedTitle(attributedStr, for: .normal)

plain 으로 변경해주는게 더 간단하니깐 attributed 속성은 맨 마지막에 설정해주는게 좋겠지만 

필요하다면 위와 같이 .setAttributedTitle 로 변경을 해 줄 수도 있다. 

 

 


2023-11-17

isEnabled vs. isUserInteractionEnabled

둘 다 UIButton 의 터치 기능을 막아주는건데, 차이가 좀 있다.

이미지 오른쪽에 텍스트가 들어가는 UI 를 구현해야하는데, 둘이 따로 만들어주기 귀찮아서 그냥 버튼 안에 이미지와 텍스트를 세팅해주고자 했다. 

이미지랑 텍스트는 간단하게 넣었는데 버튼 터치를 막으려고 isEnabled = false 로 설정을 해주니까 이미지 색깔이 희미하게 변하는 것이었다!! 

isEnabled 문서를 찾아보면

An enabled control is capable of responding to user interactions, whereas a disabled control ignores touch events and may draw itself differently.

터치 이벤트를 무시할 뿐 아니라, 다르게 그려질 수도 있다고 한다. 

그래서 isEnabled 대신에 isUserInteractionEnabled 를 사용했더니 이미지 변화없이 아주 잘 설정이 되었다. 😊

728x90
반응형