본문 바로가기

IT/iOS

iOS10 Widget Height값 조정하기

iOS 8,9에서는 autolayout이나  self.preferredContentSize라는 명령어로 일정한 통신 후 나,  위잿 실행 중에 임의로 사이즈를 조절 할 수가 있었다. 

하지만 iOS10에서는 Height가 고정이되버려 중간에 사이즈를 바꾸고 싶거나 통신 후에 결과에 맞게 위젯화면을 재구성하고 싶어도 그렇게 할수가 없게 되었다


하지만 방법이 없는 것은 아니다 iOS10 위젯들을 보면 이런 글씨를 볼수 있다.



예시로 쓴 위젯은 iOS기본 위젯 중 하나인 'SIRI 앱 제안' 위의 빨간색 박스 부분 "더 보기"

이부분을 누르면 다음처럼 위젯이 변한다




위젯이 실행 중에 높이 값이 달라진다 다시 '간략히보기'를 누르면 처음 보았던 이미지로 돌아간다.

iOS10부터 새롭게 나온 기능인데 바로 Height값을 임의로 바꿀수는 없지만 

사용자가 '간략히 보기', '더 보기' 를 눌렀을때 사이즈를 바꿀수 있는 기능이 생겼다.


한마디로 사이즈변경의 권한을 개발자가 임의로 정하는것이 아닌 사용자에게 넘긴것 이라고 생각 하면 편하다 

개발자인 우리는 사용자가 간략히보기 또는 더보기했을때 어떤 정보를 더보여주고 숨길것인가를 정하면 된다 

물론 처음부터 높이를 지정 하여 항상 고정으로 할수도 있다



개발환경은 Swift3.0.1, xcode 8.2.1, iOS10 이다


우선 아래에서 두번째줄 코드를 ViewDidLoad에 추가 하자 

혹시 iOS10 미만의 버전도 앱이 지원을 한다면 전부 추가한다


if #available(iOSApplicationExtension 10.0, *) {
    self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded
}

이는 해당 위젯이 iOS10환경일경우 보기모드를 추가한다는 것이다


그다음  NCWidgetProviding을 통해 구현되어있는 프로토콜 펑션중 다음의 함수를 구현한다

이 또한  iOS10환경에서만 작동 해야 하는 기능이므로 그 미만의 버전도 지원한다으면 첫번째 줄까지 추가한다

if #available(iOSApplicationExtension 10.0, *)
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) { 

}

이 펑션은 사용자가 '간략히 보기', '더 보기'를 눌렀을때 호출되는 함수이다

이 함수에서 NCWidgetDisplayMode가 오는데 이를 통해 사용자가 누른 것 이 '간략히 보기'인지 '더 보기' 알수있다


저 함수 안을 채워보자



Mode중 expanded는 더 보기, compact는 간략히 보기다

위의 코드를 바로 위에있는 함수에다가 추가하여 동작하게 하면 된다.

그외 iOS버전은