알림창 커스터마이징 (Customizing AlertController) - I
알림창을 좀더 사용자화 하여 내가 원하는 알림창을 만들어 보자.
아래와 같은 모습을 나타내도록 하겠다.
<완성 화면>
1. UIAlertController 구현
2. AlertView에 UIViewController 추가
3. UIViewController에 mapView 생성
4. mapView에 annotation 추가
----------
1. UIAlertController 구현
#apple에서 ios8.0 부터 UIAlertView/UIActionSheet가 아닌 UIAlertController를 사용하게 하였다.
하여 UIAlertController 설정에 preferredStyle 매개변수의 인자값으로 alertView와 actionSheet를 선책할 수 있게 되었다. 좀더 간편해진 느낌이 들긴 한다.
UIAlertController 생성하고 addAction으로 ok / No 로 선택할 Action을 추가하였다.
addAction에서 handler에는 아무런 action이 없도록 nil 처리 하였다.
<실행 화면>
2. AlertView에 UIViewController 추가
UIViewController로 contentView 하나 생성하고 알아볼 수 있게 바탕화면을 붉은색으로 설정하였다.
그리고 alertView에 contentView를 등록하였다. 등록을 하기 위해 setValue(_:forKey:) methode를 이용하였고 이때 forKey: 부분에 속성으로 반드시 "contentViewController"로 명기하여야 한다. 왜 apple에서 그랬는지는 모르겠지만 alertView에 커스터마이징 할 수 있는 public API를 제공하지 않는 듯 하다. 하여 이렇게 private API를 사용하여 커스터마이징 할 수 밖에 없는 듯 보인다.
<실행 화면>
3. UIViewController에 mapView 생성
contentView의 화면을 map으로 등록하였다. 이때 map을 addSubview로 추가한 것이 아니라 자체 view를 map으로 설정하였기 때문에 width / height 설정은 의미가 없어진다.
그리고 contentView의 size가 alertView size에 제한이 있어서 작아보이므로 preferredContentSize 로 size 변경이 가능하다.
<실행 화면>
4. mapView에 annotation 추가
. 나타내고자 하는 map의 중심 위치와 size를 설정하고 map에 등록을 한다.
. pointAnnotation을 생성하고 위치를 설정한 후 map에 등록을 한다.
<실행 화면>
alertView와 actionSheet 모두 동일한 방법으로 가능하다. 다만 여기서 가장 중요한 부분은 setValue(_:forKey:) methode를 이용하였고 이때 forKey: 부분에 속성으로 반드시 "contentViewController"를 작성하여야 한다는 내용이다.
전체 code는 다음과 같다.
여기선 버튼을 눌렀을 때 alert창이 뜨도록 설정 하였다.
댓글
댓글 쓰기