Tag Archives: Apple

애플와치 인터페이스 네비게이션

watchkit_logo

한개 이상의 컨텐츠 화면을 가진 WatchKit 앱이라면 각 화면간 이동하는 방법을 선택해야 합니다. WatchKit 앱은 서로 다른 두가지 네비게이션 스타일을 제공합니다.

  • 페이지 기반 : 이 스타일은 다른 페이지와 그다지 밀접하지 않은 데이터로 이루어진 단순한 앱에 적합합니다. 페이지 기반 인터페이스는 두개 또는 그 이상의 인터페이스 컨트롤러에 의존성을 가지며 한번에 한 화면씩을 보여주게 됩니다. 실행 시점에 사용자는 화면을 좌우로 스와이핑 하면서 인터페이스 컨트롤러 사이를 오갈 수 있습니다. 화면의 하단에 위치한 점(Dot) 표시를 통해 현재 사용자가 몇번째 페이지를 보고 있는지 확인할 수 있습니다.
  • 계층형 : 이 스타일은 더 복잡한 데이터로 이루어진 앱이나 데이터가 계층형으로 표시되는것이 좋은 경우에 어울립니다. 계층형 인터페이스는 항상 한 최상위(Root) 인터페이스 컨트롤러에서 시작됩니다. 이 인터페이스 컨트롤러에서 탭을 하여 새로운 인터페이스 컨트롤러를 화면에 삽입(Push)할 수 있습니다.

당신은 페이지 기반 및 계층형 네비게이션 스타일을 섞어서 앱을 구현할 수는 없지만 모달(Modal)창을 사용하여 보완할 수 있습니다. 모달창은 현재의 사용자의 이용 플로우를 잠시 중단하고 어떤 값을 입력 받거나 정보를 보여주는 형태로 사용됩니다. 당신은 페이지 기반 또는 계층형 인터페이스 컨트롤러를 모달형태로 보여줄 수 있습니다. 모달창 자신은 하나의 화면이나 또는 페이지기반 레이아웃처럼 다수의 화면으로 구성될 수 있습니다.interface_navigation_02

페이지 기반 인터페이스 구현하기

당신은 앱의 스토리보드의 페이지 기반 인터페이스에서 다음페이지로의 세그웨이(Segue)를 인터페이스 컨트롤러간 연결하도록 만드는 방식으로 구현할 수 있습니다. 인터페이스 컨트롤러들간에 다음 페이지로의 세그웨이를 만드는 방법은 다음과 같습니다.

  1. 당신의 스토리보드에서 각각의 페이지들을 구현하기 위한 인터페이스 컨트롤러를 추가합니다.
  2. 앱의 메인 인터페이스 컨트롤러에서 컨트롤 버튼을 누른채로 다른 인터페이스 컨트롤러 씬으로 드래그를 하여 세그웨이 라인을 연결해 줍니다.
  3. 세그웨이 설정 패널의 관계 설정에서 “next page”를 선택합니다.
  4. 같은 방법으로 각각의 인터페이스 컨트롤러들간에 다음 페이지로 연결되는 세그웨이를 생성합니다. 여기서 연결되는 세그웨이의 순서가 페이지의 순서를 정하게 됩니다.

스토리보드 파일에서 당신이 만든 세그웨이는 당신의 앱이 구동될 때 페이지 기반 인터페이스가 로드되는 순서를 결정합니다. 당신은 reloadRootControllersWithNames:contexts: 메소드를 구동 사이클에서 미리 실행함으로써 당신이 보여주고 싶은 페이지의 세트를 변경할 수 있습니다. 예를 들어 메인 인터페이스 컨트롤러의 init 메소드에서  이 메소드를 호출하여 WatchKit이 다른 페이지 세트를 로드하게 강제할 수 있습니다.

모든 페이지 기반 인터페이스 컨트롤러들은 인터페이스가 보여지기 이전에 생성되고 초기화 되지만 단 하나의 인터페이스 컨트롤러는 보여지는 시점에 초기화됩니다. 일반적으로 WatchKit은 페이지 순서중에 가장 첫번째 인터페이스 컨트롤러를 보여주게 되지만 첫번째 보여질 인터페이스 컨트롤러를 변경하기 위해서 init 또는 awakeWithContext: 메소드 안에서 becomeCurrentPage를 호출하면 됩니다.

사용자가 페이지간에 이동을 함에 따라 WatchKit은 인터페이스 컨트롤러를 활성화 하고 비활성화 하게 됩니다. 전환이 이루어지는 동안 현재 보여지고 있던 인터페이스 컨트롤러의 didDeactivate 메소드가 호출되고 뒤이어 보여지게 될 인터페이스 컨트롤러의 willActivate 메소드가 호출됩니다. willActivate 메소드를 사용하여 당신의 인터페이스 컨트롤러의 최근 몇분간의 변화를 컨텐츠에 업데이트 하시기 바랍니다.

계층형 인터페이스 구현하기

계층형 인터페이스에서 당신은 세그웨이(Segue)를 이용하거나 현재 인터페이스 컨트롤러에서 pushControllerWithName:context: 메소드를 호출하여  WatchKit이 새로운 화면으로 전환하도록 할 수 있습니다. 당신의 스토리보드에서 버튼, 그룹 또는 테이블 로우들을 활용하여 또다른 인터페이스 컨트롤러로의 세그웨이를 만들 수 있습니다. 코드를 통해 전환을 구현하는것을 선호한다면 pushControllerWithName:context: 메소드를 호출하십시오.

새로운 인터페이스 컨트롤을 화면에 추가할 때 pushControllerWithName:context: 메소드를 호출하게 되는데 이때에 context 파라미터를 통해 원하는 데이터 객체를 함께 넘기는것을 추천합니다. 이 컨텍스트 객체는 새로운 인터페이스 컨트롤러가 화면에 보여지기 전에 필요한 상태 정보들일 수 있습니다. 이 객체를 이용하여 새로운 인터페이스가 화면에 어떤 정보를 보여줄지를 알려줄 수 있습니다.

interface_navigation_01

새로 추가된 인터페이스 컨트롤러의 왼쪽 상단에는 사용자가 뒤로 돌아갈 수 있다는것을 알려주는 화살표가 표시됩니다. 사용자가 이 왼쪽 상단을 탭하거나 왼쪽에서 오른쪽으로 스와이프를 하게 되면 WatchKit은 최상단에 보여지고 있는 인터페이스 컨트롤러를 자동으로 제거합니다(Dismiss). 마찬가지로 코드상에 popController 메소드를 호출함으로 써 인터페이스 컨트롤러를 닫을 수 있습니다.

인터페이스 컨트롤러를 모달형태로 보여주기

모달 인터페이스는 현재 앱을 이용중인 플로우를 임시적으로 중단하고 사용자에게 무엇가를 묻거나 정보를 보여주는 방법에 사용됩니다. 당신은 당신앱의 네비게이션 스타일에 상관없이 모든 인터페이스 컨트롤러에서 모달 인터페이스를 보여줄 수 있습니다. 다음중에 한가지 방법을 사용하여 인터페이스 컨트롤러를 모달창 형태로 보여줄 수 있습니다.

  1. 당신의 스토리보드 파일에서 모달 세그웨이(Modal Segue)를 생성합니다.
  2. 한개의 인터페이스 컨트롤러를 모달 형태로 띄우기 위해 presentControllerWithName:context: 메소드를 호출합니다.
  3. 페이지 기반의 레이아웃을 가진 두개 이상의 인터페이스 컨트롤러들을 모달 형태로 띄우기 위해 presentControllerWithNames:contexts: 메소드를 호출합니다.

모달 세그웨이를 만들 때 당신이 보여주고자 하는 인터페이스 컨트롤러로의 세그웨이를 연결하시면 됩니다. 세그궤이를 통해 다수의 인터페이스 컨트롤러들을 보여줄때는 페이지 기반 인터페이스 컨트롤러들을 연결하는것과 동일한 방법으로 “next page” 세그웨이로 연결된 인터페이스 컨트롤러들에게 연결해 주시면 됩니다. 당신의 모달 세그웨이는 이 그룹의 첫번째 인터페이스 컨트롤러에 연결해야 합니다. 만약에 이 그룹의 중간에 위치한 인터페이스 컨트롤러와 연결하게 된다면 그 앞의 인터페이스 컨트롤러는 보여지지 않습니다.

모달 인터페이스의 왼쪽 상단에는 인터페이스 컨트롤러의 타이틀 문자열이 표시됩니다. 사용자가 이 문자열을 탭하게 되면 WatchKit 은 모달 인터페이스를 닫게됩니다. 타이틀 문자열은 이 모달 인터페이스가 닫힘을 의미하도록 설정해 주십시오. 예를 들어 특정 정보가 보여질 때 이 문자열을 Done 또는 Close 로 설정할 수 있습니다. 만약 당신이 이 문자열을 설정하지 않을 경우 WatchKit은 기본적으로 Cancel 로 표시하게 됩니다.

참고 : Interface Navigation

애플와치 앱 UI 개발

당신의 앱 구현의 시작점은 스토리보드 씬을 정의하는 것입니다. 각 씬은 앱의 유저 인터페이스 부분을 담당합니다. 당신은 다른 애플 와치 사이즈에 맞추어 씬을 커스터마이징 하고 다른 관점의 인터페이스를 설정할 수 있습니다.

watchkit_ui_essential_01

스토리보드 씬들을 조립

WatchKit 앱은 iOS 앱들과 같은 레이아웃 모델을 사용할 수 없습니다. WatchKit 앱 인터페이스의 씬이 조립될 때는 빈공간에 원하는데로 임의의 배치를 하는방식으로 뷰 계층을 생성할 수 없습니다. 대신에 XCode가 라인단위로 세로로 쌓는 형태로 아이템을 적절히 정렬해주며 사용자는 엘리먼트를 당신의 씬에 추가할 수 있습니다. 앱이 실행되는 시점에 애플와치는 이러한 엘리먼트들을 사용가능한 공간에 적절히 배치를 하게됩니다.

비록 XCode가 당신의 인터페이스의 전반적인 레이아웃을 조작하긴 하지만 WatchKit은 씬의 아이템들이 적당한 위치에 놓이도록 방법을 제공합니다. 대부분의 아이템의 크기나 위치는 속성 인스펙터를 이용해 설정할 수 있습니다. 아이템의 위치를 변경하는것은 엘리먼트 스택의 현재 위치에서의 가로, 세로 정렬을 결정하게 합니다. 크기 설정은 아이템의 고정된 가로 길이는 정의하거나 사용가능한 공간에 맞추어 리사이즈 되도록 설정할 수 있습니다.

그룹 객체는 당신의 인터페이스의 다른 엘리먼트들을 정렬하기 위한 또다른 중요한 기능을 제공합니다. 그룹 엘리먼트들은 그룹내에서 가로 또는 세로로 엘리먼트들을 정렬할 수 있는 설정을 제공하는 다른 엘리먼트들을 위한 컨테이너 역할을 합니다. 다른 그룹들간에 중첩된 그룹을 구성할 수 있으며 그룹간에 간격이나 삽입된 아이템들의 크기나 위치를 설정할 수 있습니다. 그룹은 기본적으로 보여지는 부분이 없지만 원한다면 배경 색상이나 이미지를 넣을 수 있습니다.

watchkit_ui_essential_02

위의 그림은 당신의 스토리보드 파일에서 다른 엘리먼트들을 어떻게 배치하는지를 보여주는 그림입니다. 첫 3개의 엘리먼트들은 인터페이스 컨트롤러 영역안에서 다른 정렬값을 가진 라벨입니다. 라벨들의 바로 밑에는가로로 배치된 두개의 그림을 가지고 있는 그룹 객체입니다. 그룹 밑으로는 구분선과 버튼이 세로로 쌓여있게 됩니다.

XCode에서 인터페이스를 생성하게 되면 각 객체들은 가능한한 사용가능한 공간에 맞추어 리사이즈됩니다. 앱 인터페이스는 애플와치의 두가지 사이즈에 동일하게 실행될 수 있어야 합니다. 시스템에 화면 크기에 맞추어 객체들의 리사이즈를 맡기는것은 각각의 디바이스에 대응하기 위한 별도의 코드를 작성하는 수고를 덜어 줄 수 있습니다.

다른 디스플레이 크기를 수용

XCode는 애플와치의 다른 사이즈들의 인터페이스를 커스터마이징 할 수 있는 기능을 제공합니다. 기본적으로 모든 사이즈의 애플와치에 공통적으로 적용될 수 있는 형태로 사이즈를 설정하도록 되어있지만 다른 디바이스에 특별히 다른 사이즈가 필요로 한다면 거기에 맞추어 커스터마이징 할 수 있습니다. 예를 들어 아이템들의 레이아웃이나 여백의 미세조정이나 크기에 따라 다른 이미지를 선택하도록 할 수 있습니다.

아이템이 디바이스별로 다른 사이즈를 지원하도록 커스터마이징 하기 위해서는 속성 인스펙터에서 + 버튼을 눌러 디바이스에 기본적으로 주어진 값을 변경할 수 있습니다. + 버튼을 눌러 새로운 디바이스에 특화된 속성을 설정할 수 있습니다. 여기에 설정한 값은 선택한 디바이스에만 적용되는 값입니다.

watchkit_ui_essential_03

위의 그림은 애플와치 42mm 크기의 스크린에 맞추어 어떻게 텍스트 크기를 조정하는지를 나타낸 그림입니다.

사용자들로 하여금 다른 크기의 애플와치들 사이에 앱 인터페이스의 차이점이 확연히 느껴지지 않도록 해야 합니다. 그렇기 때문에 디바이스 크기별로 커스터마이징 하는것을 최소화해야 합니다. 가능한한 간격과 여백은 인터페이스가 레이아웃을 기반하여 작동하도록 제한하십시오. 다른 레이아웃들간에 모든 인터페이스 객체들을 제거할 수 있지만 이 방법은 추천하지 않습니다. 모든 크기의 애플와치에서 동일한 인터페이스 오브젝트가 보여지도록 해주시기 바랍니다.

디바이스 크기별로 다른 커스터마이징이 정상적으로 적용되었는지를 확인하기 위해서는 스토리보드 에디터 하단에 있는 컨트롤을 이용하여 디바이스 크기를 변경할 수 있습니다. 스토리보드 에디터는 기본적으로 “Any Screen Size” 모드를 제공하며 모든 크기의 애플와치의 스크린 크기를 선택할 수 있습니다. 특정한 스크린 크기 모드로 설정을 변경하면 거기서 변경된 설정은 현재 선택된 디바이스 크기에서만 적용됩니다.

실행 시점에 인터페이스 변경하기

실행 시점에 인터페이스 컨트롤러는 스토리보드 씬의 객체들에 대해 다음과 같은 변경을 할 수 있습니다.

  • 데이터 값을 설정하거나 변경
  • 수정가능한 객체의 외관을 변경
  • 객체의 크기를 변경
  • 객체의 투명도를 변경
  • 객체를 감추거나 보여지도록 변경

당신은 인터페이스에 새로운 객체를 추가하거나 이미 위치한 객체들의 순서를 변경할 수 없습니다. 마찬가지로 객체를 제거하는것도 불가능하지만 일시적으로 레이아웃에서 감추는 방식으로 제거하는 효과를 얻을 수 있습니다. 아이템이 감춰지면 다른 객체가 이 아이템이 차지했던 공간을 채우게 됩니다. 빈 공간을 채우지 않도록 하기위해서는 제거하려는 아이템의 알파(Alpha)값을 0으로 변경하면 됩니다. 씬에서 객체를 감추는 방법에 대해 더 알아보려면 Hiding Interface Objects 를 보시기 바랍니다.

watchkit_ui_essential_04

앱의 주요 색상 설정

모든 WatchKit 앱은 다음의 UI 엘리먼트들에 적용되는 주요 색상을 가집니다.

  • 상태바의 타이틀 문자열
  • 짧게 보여지는 노티피케이션의 앱 이름

앱의 주요 색상은 스토리보드의 Global Tint 속성에 저장됩니다. 이 속성에 접근하기 위해서는 당신의 스토리보드는 선택하고 파일 인스펙터(File Inspector)에 들어갑니다. 여기서 이미 지정되어있는 색상을 선택하여 팝업 메뉴로부터 원하는 색상을 선택할 수 있습니다.

인터페이스의 국제화

WatchKit 앱의 스토리보드는 기본적으로 국제화를 지원하도록 되어있습니다. 이 기능은 당신의 프로젝트에 Localizable.strings 파일을 추가함으로써 자동으로 지원하게 됩니다. 간단하게 이 파일안에서 각 언어별 타겟별로 번역된 문자열을 입력하고 당신의 앱에 추가해주시면 됩니다. 앱이 실행되는 시점에 스토리보드 씬이 생성되면 XCode는 적절한 언어를 선택하여 보여주게 됩니다.

당신의 라벨이나 컨트롤들이 가지고 있는 텍스트가 충분한 공간을 가질 수 있도록 확장하여 배치해 주십시오. 여러 버튼을 하나의 라인에 배치하기 보다는 버튼의 타이틀이 충분히 보여질 수 있도록 가로로 배치하시기 바랍니다.

텍스트나 이미지를 프로그램적으로 설정하기 위해서는 iOS 또는 OS X와 같은 방식으로 다국어 지원을 해주시면 됩니다.

  • NSLocalizedString 매크로를 사용하여 리소스 파일로부터 문자열을 로드합니다.
  • 양식이 적용된 숫자값을 위해 NSNumberFormatter 객체를 사용합니다.
  • 날짜와 시간에 양식을 적용하기 위해 NSDateFormatter 객체를 사용합니다.

WatchKit 익스텐션을 사용할 때 NSLocale 객체는 사용자의 애플 와치에 설정된 언어 설정을 반환합니다. 이 클래스를 사용하여 사용자가 선호하는 언어와 다른 언어 정보를 가져올 수 있습니다. 당신의 앱을 국제화 하는것에 관심이 있다면 Internationalization and Localization Guide 를 확인하시기 바랍니다.

참고 : WatchKit Apps – UI Essentials