버튼이 추가되면 뷰가 변경되어 layoutSubviews가 호출될 것으로 기대했으나, 실제로는 버튼의 frame이 최종적으로 확정되지 않은 상태에서 cornerRadius가 계산되어 원형이 적용되지 않는 경우가 발생하였다.
override func layoutSubviews() {
super.layoutSubviews()
seriesButtons.forEach { button in
button.layer.cornerRadius = button.bounds.width / 2
button.clipsToBounds = true
}
}
layoutSubviews 내부에서 seriesButtonStackView.layoutIfNeeded를 호출해 스택뷰와 그 하위 버튼들의 레이아웃이 최종적으로 업데이트된 후 cornerRadius를 계산하도록 한다.
override func layoutSubviews() {
super.layoutSubviews()
seriesButtonStackView.layoutIfNeeded()
seriesButtons.forEach { button in
button.layer.cornerRadius = button.bounds.width / 2
button.clipsToBounds = true
}
}
요약:
viewDidLoad 내부에서 데이터를 로드하는 과정 중 Alert를 동기적으로 호출하면, 뷰가 완전히 로드되기 전에 Alert가 표시할려고 하여 제대로 보이지 않는 문제가 발생하였다.
override func viewDidLoad() {
super.viewDidLoad()
loadBooks()
configureDelegate()
}
private func loadBooks() {
dataService.loadBooks { [weak self] result in
guard let self = self else { return }
switch result {
case .success(let books):
self.books = books
self.configureUI()
case .failure(let error):
var errorMessage = ""
if let dataError = error as? DataService.DataError {
switch dataError {
case .fileNotFound:
errorMessage = "Json 파일을 찾을 수 없다."
case .parsingFailed:
errorMessage = "데이터 변환에 실패하였다."
}
}
self.showAlert(message: errorMessage) // 동기적으로 호출되어 Alert 미표시 문제 발생
}
}
}
Alert를 띄우는 부분을 DispatchQueue.main.async 내에서 호출해, viewDidLoad가 완전히 종료된 이후에 Alert가 표시되도록 수정한다.
정상적으로 동작하는 코드 예시:
DispatchQueue.main.async {
self.showAlert(message: errorMessage)
}