생성일: 2021년 11월 19일 오후 9:31
새로운 VC를 만들고 팝업창 뷰를 만들었다. 이때 회색 뷰(내부의 이미지와 Labe, button을 감싸기 위해 만든) 에 가운데 정렬을 제외한 어떠한 Constraint를 주지 않고도 에러를 없앨 수 있다. 오토레이아웃의 핵심인 위치 설정과 크기 설정 중에 위치 설정만 한 것인데 말이다.
방법은 바로 내부의 ui들에 constraint를 주는 것이다.
내부에 있는 이미지와 버튼들에게 회색 view와의 거리 constraint를 주어서 회색 view에 직접적으로 constraint를 주지 않아도 내부 ui들의 크기와 위치가 설정되면 그것을 자동으로 감싸는 만큼의 크기가 되는 것이다.
보라색 이미지의 상단에 0, 아래 버튼의 하단에 20의 constraint를 주면 위와 같이 에러가 없어지고 회색 뷰의 크기가 맞추어진다.
위와 같이 풍선 이미지와 체크 이미지를 팝업창과 바깥 부분에 걸치게 만들고 싶다면 어떻게 해야 할까?
Main 스토리보드에서 있는 버튼을 클릭하면 지금까지 만든 팝업창이 뜨도록 구현해보자.
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func showPopup(_ sender: UIButton) {
// 1. PopupViewController 스토리보드 가져오기
let storyBoard = UIStoryboard.init(name: "PopupViewController", bundle: nil)
// 2. VC 가져오기
let popupVC = storyBoard.instantiateViewController(withIdentifier: "popupVC")
// 1,2번은 일종의 공식과 같은 방법
// 투명도(opacity)가 배경화면에 있다면 해당 VC에 투명도를 적용시킴 (투명도가 필요하다면 꼭 해줘야 함)
popupVC.modalPresentationStyle = .overCurrentContext
// 해당 VC 띄우기
self.present(popupVC, animated: false) {
}
}
}
해당 버튼과 VC를 IBAction으로 연결한다.
1, 2번은 일종의 공식과 같은 방법으로 숙지해놓아야 한다.
import UIKit
class PopupViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func closePopup(_ sender: UIButton) {
self.dismiss(animated: false, completion: nil)
}
}
PopupVC에 팝업창에 있는 버튼을 연결시키고 클릭시 팝업창이 사라지도록 dismiss 를 넣어주었다.
지금까지의 팝업창의 초록색 체크 이미지는 버튼이 아니라 image view이기 때문에 터치를해도 팝업창을 사라지게 하는 기능을 추가 할 수 없다. ⇒ 버튼으로 해당 기능을 하도록 다시 만들어 보자
이때 중요한 점
버튼을 팝업 뷰 (풍선이미지가 달린 뷰) 안에 넣어서 생성하고 2단계의 방식으로 정렬시키면 문제가 발생한다.
간혹 버튼에 이미지를 넣고 크기 constraint를 주었는데도 크기가 줄어들지 않는 문제
해당 버튼의 title을 없앤다.
button의 type을 custom으로 바꾼다.
button의 Style과 StateConfig를 Default로 바꾼다.
1~3번을 골고루 적용시켜보면 원하는 크기로 설정할 수 있게 된다.