Xamarin.ios의 통합 스토리 보드Unified Storyboards in Xamarin.iOS

iOS 8에는 사용자 인터페이스를 만드는 데 사용할 수 있는 새로운 메커니즘 (통합 storyboard)이 포함 되어 있습니다.iOS 8 includes a new, simpler-to-use mechanism for creating the user interface — the unified storyboard. 단일 storyboard를 사용 하 여 다양 한 하드웨어 화면 크기를 모두 포함 하는 "한 번의 디자인-한 번" 스타일로 신속 하 고 응답성이 뛰어난 보기를 만들 수 있습니다.With a single storyboard to cover all of the different hardware screen sizes, fast and responsive views can be created in a "design-once, use-many" style.

개발자는 iPhone 및 iPad 장치에 대 한 별도의 특정 스토리 보드를 만들 필요가 없으므로 일반적인 인터페이스를 사용 하 여 응용 프로그램을 디자인 하 고 다른 크기의 클래스에 대해 해당 인터페이스를 사용자 지정할 수 있습니다.As the developer no longer needs to create a separate and specific storyboard for iPhone and iPad devices, they have the flexibility to design applications with a common interface and then customize that interface for different size classes. 이러한 방식으로 응용 프로그램은 각 폼 팩터의 장점에 맞게 조정 될 수 있으며, 각 사용자 인터페이스를 조정 하 여 최상의 환경을 제공할 수 있습니다.In this way, an application can be adapted to the strengths of each form factor and each user interface can be tuned to provide the best experience.

크기 클래스Size Classes

IOS 8 이전에는 개발자가 UIInterfaceOrientationUIInterfaceIdiom를 사용 하 여 가로 및 세로 모드와 iPhone 및 iPad 장치 간의 차이점을 구분 했습니다.Prior to iOS 8, the developer used UIInterfaceOrientation and UIInterfaceIdiom to differentiate between portrait and landscape modes, and between iPhone and iPad devices. IOS8에서는 크기 클래스를 사용 하 여 방향과 장치가 결정 됩니다.In iOS8, orientation and device is determined is by using Size Classes.

장치는 수직 축과 수평 축 모두에서 크기 클래스로 정의 되며 iOS 8에는 두 가지 유형의 크기 클래스가 있습니다.Devices are defined by Size Classes, in both vertical and horizontal axes, and there are two types of size classes in iOS 8:

  • Regular – 큰 화면 크기 (예: iPad) 또는 큰 크기의 느낌을 제공 하는 가젯 (예: UIScrollViewRegular – This is for either a large screen size (such as an iPad) or a gadget that gives the impression of a large size (such as a UIScrollView
  • Compact – 작은 장치 (예: iPhone)에 대 한 것입니다.Compact – This is for smaller devices (such as an iPhone). 이 크기는 장치의 방향을 고려 합니다.This size takes into account the orientation of the device.

두 가지 개념을 함께 사용 하는 경우 결과는 다음 다이어그램에 표시 된 것 처럼 서로 다른 방향으로 사용할 수 있는 다양 한 크기를 정의 하는 2 x 2 그리드입니다.If the two concepts are used together, the result is a 2 x 2 grid that defines the different possible sizes that can be used in both the differing orientations, as seen in the following diagram:

개발자는 위의 그림에 표시 된 것 처럼 다른 레이아웃을 사용 하는 네 가지 가능성 중 하나를 사용 하는 뷰 컨트롤러를 만들 수 있습니다.The developer can create a View Controller that uses any of the four possibilities that would result in different layouts (as seen in the graphics above).

iPad 크기 클래스iPad Size Classes

크기 때문에 iPad는 양쪽 방향에 대 한 일반 클래스 크기를 가집니다.The iPad, due to the size, has a regular class size for both orientations.

iPhone 크기 클래스iPhone Size Classes

IPhone에는 장치의 방향에 따라 다양 한 크기 클래스가 있습니다.The iPhone has different size classes based on the orientation of the device:

  • 장치가 세로 모드 이면 화면에 가로 및 세로로 세로로 압축 된 클래스가 있습니다.When the device is in portrait mode, the screen has a compact class horizontally and regular vertically
  • 장치가 가로 모드 이면 화면 클래스가 세로 모드에서 반전 됩니다.When the device is in landscape mode, the screen classes are reversed from portrait mode.

iPhone 6 Plus Size 클래스iPhone 6 Plus Size Classes

크기는 세로 방향 이지만 가로 방향으로 다른 경우 이전 Iphone와 동일 합니다.The sizes are the same as the earlier iPhones when in portrait orientation, but different in landscape:

IPhone 6 Plus에는 충분히 큰 화면이 있으므로 가로 모드에서 일반 너비 크기 클래스를 사용할 수 있습니다.Because the iPhone 6 Plus has a large enough screen, it is able to have a Regular Width Size Class in the Landscape mode.

새 화면 크기 조정 지원Support for a New Screen Scale

IPhone 6 Plus는 3.0 (원래 iPhone 화면 해상도의 3 배)와 함께 새로운 레 티 나 HD 디스플레이를 사용 합니다.The iPhone 6 Plus uses a new Retina HD display with a screen scale factor of 3.0 (three times the original iPhone screen resolution). 이러한 장치에서 가능한 최상의 환경을 제공 하기 위해이 화면 크기를 위해 설계 된 새 아트 워크를 포함 합니다.To provide the best possible experience on these devices, include new artwork designed for this screen scale. Xcode 6 이상에서 자산 카탈로그는 1x, 2x 및 3 배 크기의 이미지를 포함할 수 있습니다. 새 이미지 자산을 추가 하기만 하면 iPhone 6 Plus에서 실행 될 때 iOS에서 올바른 자산을 선택 합니다.In Xcode 6 and above, asset catalogs can include images at 1x, 2x, and 3x sizes; simply add the new image assets and iOS will choose the correct assets when running on an iPhone 6 Plus.

IOS의 이미지 로드 동작은 이미지 파일의 @3x 접미사도 인식 합니다.The image loading behavior in iOS also recognizes an @3x suffix on image files. 예를 들어 개발자에 게 응용 프로그램 번들에 다음과 같은 파일 이름이 있는 이미지 자산 (다른 해상도)이 포함 된 경우 (MonkeyIcon.png, MonkeyIcon@2x.pngMonkeyIcon@3x.png.For example, if the developer includes an image asset (at different resolutions) in the application's bundle with the following file names: MonkeyIcon.png, MonkeyIcon@2x.png, and MonkeyIcon@3x.png. IPhone 6에는 다음 코드를 사용 하 여 개발자가 이미지를 로드 하는 경우 자동으로 MonkeyIcon@3x.png 이미지가 사용 됩니다.On the iPhone 6 Plus the MonkeyIcon@3x.png image will be used automatically if the developer loads an image using the following code:

UIImage icon = UIImage.FromFile("MonkeyImage.png");

또는 MonkeyIcon.pngiOS Designer를 사용 하 여 UI 요소에 이미지를 할당 하는 경우 iPhone 6 Plus에서 MonkeyIcon@3x.png 자동으로 사용 됩니다.Or if they assign the image to a UI element using the iOS Designer as MonkeyIcon.png, the MonkeyIcon@3x.png will be used, again automatically, on the iPhone 6 Plus.

동적 실행 화면Dynamic Launch Screens

시작 화면 파일은 iOS 응용 프로그램을 시작 하는 동안 시작 화면으로 표시 되며, 사용자에 게 앱을 실제로 시작 하는 피드백을 제공 합니다.The launch screen file is displayed as a splash screen while an iOS application is launching to provide feedback to the user that the app is actually starting-up. IOS 8 이전에 개발자는 응용 프로그램이 실행 되는 각 장치 유형, 방향 및 화면 해상도에 대 한 여러 Default.png 이미지 자산을 포함 해야 합니다.Prior to iOS 8, the developer would have to include multiple Default.png image assets for each device type, orientation and screen resolution that the application would be running on.

IOS 8의 새로운 기능은 개발자가 자동 레이아웃 및 크기 클래스를 사용 하 여 모든 장치, 해상도 및 방향에 대해 작동 하는 동적 시작 화면 을 만드는 Xcode에서 단일 원자 .xib 파일을 만들 수 있습니다.New to iOS 8, the developer can create a single, atomic .xib file in Xcode that uses Auto Layout and Size Classes to create a Dynamic Launch Screen that will work for every device, resolution and orientation. 이렇게 하면 개발자가 필요한 모든 이미지 자산을 만들고 유지 관리 하는 데 필요한 작업량을 줄일 수 있을 뿐만 아니라 응용 프로그램의 설치 된 번들 크기를 줄일 수 있습니다.This not only reduces the amount of work required of the developer to create and maintain all the required image assets, but it reduces the size of the application's installed bundle.

특성Traits

특성은 레이아웃이 변경 될 때 레이아웃이 변경 되는 방식을 결정 하는 데 사용할 수 있는 속성입니다.Traits are properties that can be used to determine how a layout changes as its environment changes. 이러한 속성은 속성 집합 (UIUserInterfaceSizeClass을 기반으로 하는 HorizontalSizeClassVerticalSizeClass) 뿐만 아니라 인터페이스 방법 (UIUserInterfaceIdiom) 및 표시 눈금으로 구성 됩니다.They consist of a set of properties (the HorizontalSizeClass and VerticalSizeClass based on UIUserInterfaceSizeClass), as well as the interface idiom ( UIUserInterfaceIdiom) and the display scale.

위의 모든 상태는 Apple에서 속성 뿐만 아니라 해당 값을 포함 하는 성분 컬렉션 (UITraitCollection)으로 참조 하는 컨테이너에 래핑됩니다.All of the above states are wrapped up in a container that Apple refers to as a Trait Collection ( UITraitCollection), which contains not only the properties but their values as well.

특성 환경Trait Environment

특성 환경은 iOS 8의 새로운 인터페이스로, 다음 개체에 대 한 특성 컬렉션을 반환할 수 있습니다.Trait Environments are a new interface in iOS 8 and are able to return a Trait Collection for the following objects:

  • 화면 (UIScreens).Screens ( UIScreens ).
  • Windows (UIWindows).Windows ( UIWindows ).
  • 뷰 컨트롤러 (UIViewController)View Controllers ( UIViewController ).
  • 보기 (UIView).Views ( UIView ).
  • 프레젠테이션 컨트롤러 (UIPresentationController).Presentation Controller ( UIPresentationController ).

개발자는 성분 환경에서 반환 된 특성 컬렉션을 사용 하 여 사용자 인터페이스의 레이아웃을 지정 하는 방법을 결정 합니다.The developer uses the Trait Collection returned by a Trait Environment to determine how a user interface should be laid out.

모든 특성 환경에서는 다음 다이어그램에 표시 된 대로 계층 구조를 만듭니다.All of the Trait Environments make a hierarchy as seen in the following diagram:

위의 각 성분 환경에서 각각 부모 환경에서 자식 환경으로 이동 하 게 되는 특성 컬렉션입니다.The Trait Collection that each of the above Trait Environments have will flow, by default, from the parent to the child environment.

성분 환경에는 현재 특성 컬렉션을 가져오는 것 외에도 뷰 또는 뷰 컨트롤러 서브 클래스에서 재정의할 수 있는 TraitCollectionDidChange 메서드가 있습니다.In addition to getting the current Trait Collection, the Trait Environment has a TraitCollectionDidChange method, which can be overridden in the View or View Controller subclasses. 개발자는이 메서드를 사용 하 여 특성이 변경 될 때 특성에 종속 된 UI 요소를 수정할 수 있습니다.The developer can use this method to modify any of the UI elements that depend on traits when those traits have changed.

일반적인 특성 컬렉션Typical Trait Collections

이 섹션에서는 iOS 8로 작업할 때 사용자가 경험 하는 일반적인 성분 컬렉션 유형을 다룹니다.This section will cover the typical types of trait collections that the user will experience when working with iOS 8.

다음은 개발자가 iPhone에서 볼 수 있는 일반적인 특성 컬렉션입니다.The following is a typical Trait Collection that the developer might see on an iPhone:

속성Property Value
HorizontalSizeClass 구문Compact
VerticalSizeClass 기본Regular
UserInterfaceIdom 전화Phone
DisplayScale 2.02.0

위의 집합은 모든 특성 속성에 대 한 값을 가지 며 정규화 된 특성 컬렉션을 나타냅니다.The above set would represent a Fully Qualified Trait Collection, as it has values for all of its trait properties.

또한 일부 값이 누락 된 특성 컬렉션 (Apple에서 지정 되지 않은것으로 참조 하는)이 있을 수 있습니다.It is also possible to have a Trait Collection that is missing some of its values (which Apple refers to as Unspecified):

속성Property Value
HorizontalSizeClass 구문Compact
VerticalSizeClass 지정 되지 않은Unspecified
UserInterfaceIdom 지정 되지 않은Unspecified
DisplayScale 지정 되지 않은Unspecified

그러나 일반적으로 개발자는 특성 컬렉션에 대 한 특성 환경을 요구할 때 위의 예제와 같이 정규화 된 컬렉션을 반환 합니다.Generally, however, when the developer asks the Trait Environment for its Trait Collection, it will return a fully qualified collection as seen in the example above.

특성 환경 (예: 보기 또는 뷰 컨트롤러)이 현재 뷰 계층 구조를 포함 하지 않는 경우 개발자는 하나 이상의 특성 속성에 대해 지정 되지 않은 값을 다시 가져올 수 있습니다.If a Trait Environment (like a View or View Controller) is not inside of the current view hierarchy, the developer might get back unspecified values for one or more of the trait properties.

또한 개발자는 UITraitCollection.FromHorizontalSizeClass와 같이 Apple에서 제공 하는 생성 방법 중 하나를 사용 하 여 새 컬렉션을 만들 경우 부분적으로 정규화 된 특성 컬렉션을 가져옵니다.The developer will also get a partially qualified Trait Collection if they use one of the creation methods provided by Apple, such as UITraitCollection.FromHorizontalSizeClass, to create a new collection.

여러 특성 컬렉션에 대해 수행할 수 있는 한 가지 작업은 서로 비교 하는 것입니다. 즉, 하나의 특성 컬렉션을 포함 하는 경우 하나의 특성 컬렉션을 요청 해야 합니다.One operation that can be performed on multiple Trait Collections is comparing them to each other, which involves asking one Trait Collection if it contains another one. 예를 들어, 두 번째 컬렉션에 지정 된 특성의 경우 값은 첫 번째 컬렉션의 값과 정확 하 게 일치 해야 합니다.What is meant by Containment is that, for any trait specified in the second collection, the value must match exactly with the value in the first collection.

두 특성을 테스트 하려면 테스트할 특성의 값을 전달 하는 UITraitCollectionContains 메서드를 사용 합니다.To test two traits use the Contains method of the UITraitCollection passing in the value of the trait to be tested.

개발자는 코드에서 비교를 수동으로 수행 하 여 뷰 또는 뷰 컨트롤러의 레이아웃 방법을 결정할 수 있습니다.The developer can perform the comparisons manually in code to determine how to layout Views or View Controllers. UIKit 그러나이 메서드는 내부적으로이 메서드를 사용 하 여 모양 프록시와 같은 일부 기능을 제공 합니다 (예:).However, UIKit uses this method internally to provide some of its functionality, as in the Appearance Proxy, for example.

모양 프록시Appearance Proxy

모양 프록시는 개발자가 뷰의 속성을 사용자 지정할 수 있도록 이전 버전의 iOS에서 도입 되었습니다.The Appearance Proxy was introduced in earlier versions of iOS to allow developers to customize the properties of their Views. 특성 컬렉션을 지원 하기 위해 iOS 8에서 확장 되었습니다.It has been extended in iOS 8 to support Trait Collections.

이제 모양 프록시에는 전달 된 지정 된 특성 컬렉션에 대 한 새 모양 프록시를 반환 하는 새 메서드인 AppearanceForTraitCollection이 포함 되어 있습니다.Appearance Proxies now include a new method, AppearanceForTraitCollection, that returns a new Appearance Proxy for the given Trait Collection that has been passed in. 개발자가 해당 모양 프록시에 대해 수행 하는 모든 사용자 지정은 지정 된 특성 컬렉션을 따르는 뷰에만 적용 됩니다.Any customizations that the developer performs on that Appearance Proxy will only take effect on Views that conform to the specified Trait Collection.

일반적으로 개발자는 부분적으로 지정 된 특성 컬렉션을 AppearanceForTraitCollection 메서드에 전달 합니다. 예를 들어 단순히 Compact의 가로 크기 클래스를 지정 하는 것과 같이 가로로 압축 된 응용 프로그램의 뷰를 사용자 지정할 수 있습니다.Generally the developer will pass in a partially specified Trait Collection to the AppearanceForTraitCollection method, such as one that just specified a Horizontal Size Class of Compact, so that they could customize any view in the application that is compact horizontally.

UIImageUIImage

Apple에서 특성 컬렉션을 추가 하는 다른 클래스가 UIImage되었습니다.Another class that Apple has added Trait Collection to is UIImage. 이전에는 개발자가 응용 프로그램에 포함 하려는 비트맵 그래픽 자산의 @1X 및 @2x 버전을 지정 해야 했습니다 (예: 아이콘).In the past the developer had to specify a @1X and @2x version of any bitmapped graphic asset that they were going to include in the application (such as an icon).

iOS 8은 개발자가 성분 컬렉션을 기반으로 하는 이미지 카탈로그에 여러 버전의 이미지를 포함할 수 있도록 확장 되었습니다.iOS 8 has been expanded to allow the developer to include multiple version of an image in an Image Catalog based on a Trait Collection. 예를 들어 개발자는 압축 특성 클래스를 사용 하기 위한 작은 이미지와 다른 컬렉션을 위한 전체 크기의 이미지를 포함할 수 있습니다.For example, the developer could include a smaller image for working with a Compact Trait Class and a full sized image for any other collection.

UIImageView 클래스 내에서 이미지 중 하나를 사용 하는 경우 이미지 뷰에서 해당 특성 컬렉션의 올바른 이미지 버전이 자동으로 표시 됩니다.When one of the images is used inside of a UIImageView class, the Image View will automatically display the correct version of the image for its Trait Collection. 성분 환경 (예: 장치를 세로에서 가로로 전환 하는 사용자)이 변경 되는 경우 이미지 뷰에서 새 특성 컬렉션과 일치 하도록 새 이미지 크기를 자동으로 선택 하 고 현재 이미지의 현재 버전에 대 한 크기와 일치 하도록 크기를 변경 합니다. 표시할지.If the Trait Environment changes (such as the user switching the device from portrait to landscape), the Image View will automatically select the new image size to match the new Trait Collection and change its size to match that of the current version of the image being displayed.

Uiimag및 SetUIImageAsset

Apple은 개발자에 게 이미지 선택에 대 한 더 많은 제어를 제공 하기 위해 UIImageAsset 이라는 iOS 8에 새 클래스를 추가 했습니다.Apple has added a new class to iOS 8 called UIImageAsset to give the developer even more control over image selection.

이미지 자산은 이미지의 다른 버전을 모두 래핑하고 개발자가 전달 된 성분 컬렉션과 일치 하는 특정 이미지를 요청할 수 있도록 합니다.An Image Asset wraps up all of the different versions of an image and allows the developer to ask for a specific image that matches a Trait Collection that has been passed in. 이미지는 이미지 자산에서 즉시 추가 하거나 제거할 수 있습니다.Images can be added or removed from an Image Asset, on-the-fly.

이미지 자산에 대 한 자세한 내용은 Apple의 Uiimag기능 집합 설명서를 참조 하세요.For more information on Image Assets, see Apple's UIImageAsset documentation.

성분 컬렉션 결합Combining Trait Collections

개발자가 특성 컬렉션에 대해 수행할 수 있는 또 다른 함수는 결합 된 컬렉션을 생성 하는 두 개의 함수를 추가 하는 것입니다 .이 경우 한 컬렉션에서 지정 되지 않은 값이 두 번째 컬렉션에서 지정 된 값으로 대체 됩니다.Another function that a developer can perform on Trait Collections is to add two together that will result in the combined collection, where the unspecified values from one collection are replaced by the specified values in a second one. UITraitCollection 클래스의 FromTraitsFromCollections 메서드를 사용 하 여이 작업을 수행 합니다.This is done using the FromTraitsFromCollections method of the UITraitCollection class.

위에서 설명한 것 처럼 특성 중 하나를 특성 컬렉션 중 하나에서 지정 하지 않은 경우 다른 특성에 지정 된 경우 값은 지정 된 버전으로 설정 됩니다.As stated above, if any of the traits is unspecified in one of the Trait Collections and is specified in another, the value will be set to the specified version. 그러나 지정 된 값의 버전이 여러 개 있는 경우 마지막 특성 컬렉션의 값이 사용 되는 값이 됩니다.However, if there are multiple versions of a given value specified, the value from the last Trait Collection will be the value that is used.

적응 뷰 컨트롤러Adaptive View Controllers

이 섹션에서는 개발자 응용 프로그램에서 자동으로 적응 하기 위해 iOS 보기 및 보기 컨트롤러에서 특성 및 크기 클래스의 개념을 채택 하는 방법에 대 한 세부 정보를 다룹니다.This section will cover the details of how the iOS View and View Controllers have adopted the concepts of Traits and Size Classes to automatically be more adaptive in the developer's applications.

분할 뷰 컨트롤러Split View Controller

IOS 8에서 가장 많이 변경 된 뷰 컨트롤러 클래스 중 하나는 UISplitViewController 클래스입니다.One of the View Controller classes that has changed the most in iOS 8 is the UISplitViewController class. 이전에는 개발자가 iPad 버전의 응용 프로그램에서 분할 뷰 컨트롤러를 사용 하는 경우가 많기 때문에 iPhone 버전의 앱에 대해 완전히 다른 버전의 보기 계층 구조를 제공 해야 합니다.In the past, the developer would often use a Split View Controller on the iPad version of the application and then they would have to provide a completely different version of their view hierarchy for the iPhone version of the app.

IOS 8에서 UISplitViewController 클래스는 두 플랫폼 (iPad 및 iPhone) 모두에서 사용할 수 있으며,이를 통해 개발자는 iPhone 및 iPad 모두에 대해 작동 하는 하나의 뷰 컨트롤러 계층 구조를 만들 수 있습니다.In iOS 8, the UISplitViewController class is available on both platforms (iPad and iPhone), which allows the developer to create one View Controller hierarchy that will function for both iPhone and iPad.

IPhone이 가로 인 경우 분할 뷰 컨트롤러는 iPad에 표시 되는 것과 마찬가지로 뷰를 나란히 표시 합니다.When an iPhone is in Landscape, the Split View Controller will present its Views side-by-side, just as it would when being displayed on an iPad.

특성 재정의Overriding Traits

특성 환경은 iPad의 가로 방향으로 분할 뷰 컨트롤러를 보여 주는 다음 그림과 같이 부모 컨테이너에서 자식 컨테이너까지 계단식으로 배열 됩니다.Trait Environments cascade from the parent container down to the child containers, as in the following graphic showing a Split View Controller on an iPad in the landscape orientation:

IPad의 가로 및 세로 방향에 일반 크기 클래스가 있으므로 분할 보기에는 마스터 뷰와 자세히 보기가 모두 표시 됩니다.Since the iPad has a Regular Size Class in both the horizontal and vertical orientations, the Split View will display both the master and detail views.

Size 클래스가 양쪽 방향으로 압축 되는 iPhone에서 분할 뷰 컨트롤러는 아래와 같이 자세히 보기만 표시 합니다.On an iPhone, where the Size Class is compact in both orientations, the Split View Controller only displays the detail view, as seen below:

개발자가 iPhone의 마스터 및 세부 정보 보기를 가로 방향으로 표시 하려는 응용 프로그램에서는 분할 뷰 컨트롤러에 대 한 부모 컨테이너를 삽입 하 고 특성 컬렉션을 재정의 해야 합니다.In an application where the developer wants to display both the master and detail view on an iPhone in the landscape orientation, the developer must insert a parent container for the Split View Controller and override the Trait Collection. 아래 그림에 표시 된 것과 같습니다.As seen in the graphic below:

UIView은 분할 뷰 컨트롤러의 부모로 설정 되 고, 새 특성 컬렉션을 전달 하 고 분할 뷰 컨트롤러를 대상으로 하는 뷰에서 SetOverrideTraitCollection 메서드가 호출 됩니다.A UIView is set as the parent of the Split View Controller and the SetOverrideTraitCollection method is called on the view passing in a new Trait Collection and targeting the Split View Controller. 새 성분 컬렉션은 HorizontalSizeClass를 재정의 하 여 Regular로 설정 하므로 분할 뷰 컨트롤러는 iPhone의 마스터 및 세부 정보 보기를 가로 방향으로 모두 표시 합니다.The new Trait Collection overrides the HorizontalSizeClass, setting it to Regular, so that the Split View Controller will display both the master and detail views on an iPhone in the landscape orientation.

VerticalSizeClass은 (는) unspecified로 설정 되어 있으므로 새 특성 컬렉션을 부모의 특성 컬렉션에 추가 하 여 자식 분할 뷰 컨트롤러에 대 한 Compact VerticalSizeClass 수 있습니다.Note that the VerticalSizeClass was set to unspecified, which allows the new Trait Collection to be added to the Trait Collection on the parent, resulting in a Compact VerticalSizeClass for the child Split View Controller.

특성 변경Trait Changes

이 섹션에서는 특성 환경이 변경 될 때 특성 컬렉션을 전환 하는 방법에 대해 자세히 살펴봅니다.This section will take a look, in detail, at how the Trait Collections transition when the Trait Environment changes. 예를 들어 장치가 세로에서 가로 방향으로 회전 하는 경우입니다.For example, when the device is rotated from portrait to landscape.

먼저 iOS 8은 전환을 수행 하기 위해 준비 하는 일부 설정을 수행 합니다.First, iOS 8 does some setup to prepare for the transition to take place. 다음으로 시스템은 전환 상태에 애니메이션을 적용 합니다.Next, the system animates the transition state. 마지막으로, iOS 8은 전환 하는 동안 필요한 모든 임시 상태를 정리 합니다.Finally, iOS 8 cleans-up any temporary states required during the transition.

iOS 8은 다음 표와 같이 개발자가 특성 변경에 참여 하는 데 사용할 수 있는 몇 가지 콜백을 제공 합니다.iOS 8 provides several callbacks that the developer can use to participate in the Trait Change as seen in the following table:

PhasePhase CallbackCallback 설명Description
설정Setup
  • WillTransitionToTraitCollection
  • TraitCollectionDidChange
  • 이 메서드는 특성 변경의 시작 부분에서 특성 컬렉션이 새 값으로 설정 되기 전에 호출 됩니다.This method gets called at the beginning of a Trait Change before a Trait Collection gets set to its new value.
  • 메서드는 특성 컬렉션의 값이 변경 되 고 애니메이션이 발생 하기 전에 호출 됩니다.The method gets called when the value of the Trait Collection has changed but before any animation takes place.
애니메이션Animation WillTransitionToTraitCollection 이 메서드에 전달 되는 전환 코디네이터에는 개발자가 기본 애니메이션과 함께 실행 되는 애니메이션을 추가할 수 있는 AnimateAlongside 속성이 있습니다.The Transition Coordinator that gets passed to this method has an AnimateAlongside property that allows the developer to add animations that will be executed along with the default animations.
정리Clean-up WillTransitionToTraitCollection 전환이 발생 한 후 개발자가 자체 정리 코드를 포함 하도록 하는 메서드를 제공 합니다.Provides a method for developers to include their own cleanup code after the transition takes place.

WillTransitionToTraitCollection 방법은 특성 컬렉션 변경 내용과 함께 뷰 컨트롤러에 애니메이션을 적용 하는 데 유용 합니다.The WillTransitionToTraitCollection method is great for animating View Controllers along with the Trait Collection changes. WillTransitionToTraitCollection 메서드는 UIViews와 같은 다른 특성 환경이 아닌 뷰 컨트롤러 (UIViewController) 에서만 사용할 수 있습니다.The WillTransitionToTraitCollection method is only available on View Controllers ( UIViewController) and not on other Trait Environments, like UIViews.

TraitCollectionDidChange은 특성이 변경 될 때 개발자가 UI를 업데이트 하려고 하는 UIView 클래스를 사용 하는 데 유용 합니다.The TraitCollectionDidChange is great for working with the UIView class, where the developer wants to update the UI as the traits are changing.

분할 뷰 컨트롤러 축소Collapsing the Split View Controllers

이제 분할 뷰 컨트롤러가 두 열에서 하나의 열 뷰로 축소 될 때 발생 하는 상황에 대해 자세히 살펴보겠습니다.Now let's take a closer look at what happens when a Split View Controller collapses from a two column to a one column view. 이러한 변경의 일환으로 다음 두 가지 프로세스를 수행 해야 합니다.As part of this change, there are two processes that need to occur:

  • 기본적으로 분할 뷰 컨트롤러는 축소 발생 후 기본 뷰 컨트롤러를 뷰로 사용 합니다.By default, the Split View Controller will use the primary view controller as the view after the collapse occurs. 개발자는 UISplitViewControllerDelegateGetPrimaryViewControllerForCollapsingSplitViewController 메서드를 재정의 하 고 축소 된 상태로 표시 하려는 뷰 컨트롤러를 제공 하 여이 동작을 재정의할 수 있습니다.The developer can override this behavior by overriding the GetPrimaryViewControllerForCollapsingSplitViewController method of the UISplitViewControllerDelegate and providing any View Controller that they want to display in the collapsed state.
  • 보조 뷰 컨트롤러를 기본 뷰 컨트롤러에 병합 해야 합니다.The Secondary View Controller has to get merged into the Primary View Controller. 일반적으로 개발자는이 단계에서 어떤 작업도 수행할 필요가 없습니다. 분할 뷰 컨트롤러에는 하드웨어 장치에 따라이 단계를 자동으로 처리 하는 작업이 포함 됩니다.Generally the developer will not need to take any action for this step; the Split View Controller includes automatic handling of this phase based on the hardware device. 그러나 개발자가이 변경과 상호 작용 하는 특별 한 경우가 있을 수 있습니다.However, there may be some special cases where the developer will want to interact with this change. UISplitViewControllerDelegateCollapseSecondViewController 메서드를 호출 하면 축소가 수행 될 때 자세히 보기 대신 마스터 뷰 컨트롤러를 표시할 수 있습니다.Calling the CollapseSecondViewController method of the UISplitViewControllerDelegate allows the master view controller to be displayed when the collapse occurs, instead of the details view.

분할 뷰 컨트롤러 확장Expanding the Split View Controller

이제 분할 뷰 컨트롤러가 축소 된 상태에서 확장 될 때 발생 하는 상황을 자세히 살펴보겠습니다.Now let's take a closer look at what happens when a Split View Controller is expanded from a collapsed state. 다시 한 번 수행 해야 하는 두 단계가 있습니다.Once again, there are two stages that need to occur:

  • 먼저 새 기본 뷰 컨트롤러를 정의 합니다.First, define the new Primary View Controller. 기본적으로 분할 뷰 컨트롤러는 축소 된 보기에서 기본 뷰 컨트롤러를 자동으로 사용 합니다.By default, the Split View Controller will automatically use the Primary View Controller from the collapsed view. 또한 개발자는 UISplitViewControllerDelegateGetPrimaryViewControllerForExpandingSplitViewController 메서드를 사용 하 여이 동작을 재정의할 수 있습니다.Again, the developer can override this behavior using the GetPrimaryViewControllerForExpandingSplitViewController method of the UISplitViewControllerDelegate .
  • 기본 뷰 컨트롤러를 선택한 후에는 보조 뷰 컨트롤러를 다시 만들어야 합니다.Once the Primary View Controller has been chosen, the Secondary View Controller must be recreated. 다시, 분할 보기 컨트롤러에는 하드웨어 장치에 따라이 단계를 자동으로 처리 하는 작업이 포함 됩니다.Again, the Split View Controller includes automatic handling of this phase based on the hardware device. 개발자는 UISplitViewControllerDelegateSeparateSecondaryViewController 메서드를 호출 하 여이 동작을 재정의할 수 있습니다.The developer can override this behavior by calling the SeparateSecondaryViewController method of the UISplitViewControllerDelegate .

분할 뷰 컨트롤러에서 기본 뷰 컨트롤러는 UISplitViewControllerDelegateCollapseSecondViewControllerSeparateSecondaryViewController 메서드를 구현 하 여 뷰의 확장 및 축소 둘 다에서 파트를 재생 합니다.In a Split View Controller, the Primary View Controller plays a part in both the expanding and collapsing of the views by implementing the CollapseSecondViewController and SeparateSecondaryViewController methods of the UISplitViewControllerDelegate. UINavigationController는 이러한 메서드를 구현 하 여 보조 뷰 컨트롤러를 자동으로 푸시 및 팝 합니다.UINavigationController implements these methods to automatically push and pop the Secondary View controller.

뷰 컨트롤러 표시Showing View Controllers

Apple에서 iOS 8을 변경 하는 또 다른 변경 내용은 개발자가 보기 컨트롤러를 표시 하는 것입니다.Another change that Apple has made to iOS 8 is in the way that the developer shows View Controllers. 이전에는 응용 프로그램에 리프 뷰 컨트롤러 (예: 테이블 뷰 컨트롤러)가 있고 개발자가 다른 것을 보여 준 경우 (예: 셀을 누르는 사용자에 대 한 응답으로) 응용 프로그램은 컨트롤러 계층 구조를 통해 탐색 뷰 컨트롤러 및이에 대 한 PushViewController 메서드를 호출 하 여 새 뷰를 표시 합니다.In the past, if the application had a Leaf View Controller (such as a Table View Controller), and the developer showed a different one (for example, in response to the user tapping on a cell), the application would reach back through the controller hierarchy to the Navigation View Controller and call the PushViewController method against it to display the new view.

그러면 탐색 컨트롤러와 탐색 컨트롤러를 실행 하는 환경 간에 매우 긴밀 하 게 결합 됩니다.This presented a very tight coupling between the Navigation Controller and the environment that it was running in. IOS 8에서 Apple은 다음과 같은 두 가지 새로운 메서드를 제공 하 여이를 분리 했습니다.In iOS 8, Apple has decoupled this by providing two new methods:

  • ShowViewController – 환경을 기반으로 새 뷰 컨트롤러를 표시 하도록 조정 합니다.ShowViewController – Adapts to display the new view controller based on its environment. 예를 들어 UINavigationController에서 단순히 새 뷰를 스택에 푸시합니다.For example, in a UINavigationController it simply pushes the new view onto the stack. 분할 뷰 컨트롤러에서 새 뷰 컨트롤러는 새 기본 뷰 컨트롤러로 왼쪽에 표시 됩니다.In a Split View Controller, the new View Controller will be presented on the left side as the new Primary View Controller. 컨테이너 뷰 컨트롤러가 없는 경우 새 보기가 모달 뷰 컨트롤러로 표시 됩니다.If no container view controller is present, the new view will be displayed as a Modal View Controller.
  • ShowDetailViewControllerShowViewController하는 것과 비슷한 방식으로 작동 하지만, 분할 뷰 컨트롤러에 구현 되어 세부 정보 보기를 전달 되는 새 뷰 컨트롤러로 바꿉니다.ShowDetailViewController – Works in a similar fashion to ShowViewController, but is implemented on a Split View Controller to replace the details view with the new View Controller being passed in. IPhone 응용 프로그램에서 볼 수 있는 것 처럼 분할 뷰 컨트롤러를 축소 하면 호출이 ShowViewController 메서드로 리디렉션되고 새 뷰가 기본 뷰 컨트롤러로 표시 됩니다.If the Split View Controller is collapsed (as might be seen in an iPhone Application), the call will be redirected to the ShowViewController method, and the new view will be shown as the Primary View Controller. 컨테이너 뷰 컨트롤러가 없는 경우에도 새 보기가 모달 뷰 컨트롤러로 표시 됩니다.Again, if no container view controller is present, the new view will be displayed as a Modal View Controller.

이러한 메서드는 리프 뷰 컨트롤러에서 시작 하 고 새 뷰의 표시를 처리할 올바른 컨테이너 뷰 컨트롤러를 찾을 때까지 뷰 계층 구조를 탐색 하는 방식으로 작동 합니다.These methods work by starting at the Leaf View Controller and walk up the view hierarchy until they find the right container view controller to handle the display of the new view.

개발자는 자체 사용자 지정 뷰 컨트롤러에서 ShowViewControllerShowDetailViewController를 구현 하 여 UINavigationControllerUISplitViewController에서 제공 하는 것과 동일한 자동화 된 기능을 얻을 수 있습니다.Developers can implement ShowViewController and ShowDetailViewController in their own custom View Controllers to get the same automated functionality that UINavigationController and UISplitViewController provides.

작동 방식How it works

이 섹션에서는 이러한 메서드를 iOS 8에서 실제로 구현 하는 방법을 살펴보겠습니다.In this section we will take a look at how these methods are actually implemented in iOS 8. 먼저 새 GetTargetForAction 메서드를 살펴보겠습니다.First let’s look at the new GetTargetForAction method:

이 메서드는 올바른 컨테이너 뷰 컨트롤러를 찾을 때까지 계층 구조 체인을 보여 줍니다.This method walks the hierarchy chain until the correct container view controller is found. 예를 들면,For example:

  1. ShowViewController 메서드가 호출 되 면이 메서드를 구현 하는 체인의 첫 번째 뷰 컨트롤러가 탐색 컨트롤러 이므로 새 뷰의 부모로 사용 됩니다.If a ShowViewController method is called, the first View Controller in the chain that implements this method is the Navigation Controller, so it is used as the parent of the new view.
  2. ShowDetailViewController 메서드가 대신 호출 된 경우 분할 뷰 컨트롤러는이를 구현 하기 위한 첫 번째 뷰 컨트롤러 이므로 부모로 사용 됩니다.If a ShowDetailViewController method was called instead, the Split View Controller is the first View Controller to implement it, so it is used as the parent.

GetTargetForAction 메서드는 지정 된 동작을 구현 하는 뷰 컨트롤러를 찾은 다음 해당 작업을 받으려는 경우 해당 뷰 컨트롤러를 요청 하는 방식으로 작동 합니다.The GetTargetForAction method works by locating a View Controller that implements a given Action and then asking that View Controller if it wants to receive that action. 이 메서드는 공용 이기 때문에 개발자는 기본 제공 ShowViewControllerShowDetailViewController 메서드와 마찬가지로 작동 하는 고유한 사용자 지정 메서드를 만들 수 있습니다.Since this method is public, developers can create their own custom methods that function just like the built in ShowViewController and ShowDetailViewController methods.

적응 프레젠테이션Adaptive Presentation

IOS 8에서 Apple은 팝 오버 프레젠테이션 (UIPopoverPresentationController) 적응도 수행 했습니다.In iOS 8, Apple has made Popover Presentations ( UIPopoverPresentationController) adaptive as well. 따라서 팝 오버 프레젠테이션 보기 컨트롤러는 일반 Size 클래스에 일반 팝 오버 보기를 자동으로 표시 하지만, iPhone 등의 가로 컴팩트 크기 클래스에서 전체 화면을 표시 합니다.So a Popover Presentation View Controller will automatically present a normal Popover View in a Regular Size Class, but will display it full screen in a horizontally compact Size Class (such as on an iPhone).

통합 스토리 보드 시스템 내에서 변경 내용을 수용 하기 위해 새 컨트롤러 개체를 만들어 제공 된 보기 컨트롤러 (UIPresentationController)를 관리 합니다.To accommodate the changes within the unified storyboard system, a new controller object has been created to manage the presented View Controllers — UIPresentationController. 이 컨트롤러는 해제 될 때까지 뷰 컨트롤러를 표시 한 시간부터 생성 됩니다.This controller is created from the time the View Controller is presented until it is dismissed. 이 클래스는 관리 클래스 이므로 뷰 컨트롤러 (예: 방향)에 영향을 주는 장치 변경 내용에 응답할 때 뷰 컨트롤러에서 슈퍼 클래스로 간주할 수 있으며,이 클래스는 프레젠테이션 컨트롤러 컨트롤의 뷰 컨트롤러에 다시 공급 됩니다.As it is a managing class, it can be considered a super class over the View Controller as it responds to device changes that affect the View Controller (such as orientation) which are then fed back into the View Controller the Presentation Controller controls.

개발자가 PresentViewController 메서드를 사용 하 여 뷰 컨트롤러를 제공 하는 경우 프레젠테이션 프로세스의 관리가 UIKit으로 전달 됩니다.When the developer presents a View Controller using the PresentViewController method, the management of the presentation process is handed to UIKit. UIKit는 생성 되는 스타일에 대 한 올바른 컨트롤러를 처리 합니다. 단, 뷰 컨트롤러의 스타일이 UIModalPresentationCustom로 설정 된 경우는 예외입니다.UIKit handles (among other things) the correct controller for the style being created, with the only exception being when a View Controller has the style set to UIModalPresentationCustom. 여기에서 응용 프로그램은 UIKit 컨트롤러를 사용 하는 대신 자체 PresentationController를 제공할 수 있습니다.Here, the application can provide it’s own PresentationController rather than using the UIKit controller.

사용자 지정 프레젠테이션 스타일Custom Presentation Styles

개발자는 사용자 지정 프레젠테이션 스타일을 사용 하 여 사용자 지정 프레젠테이션 컨트롤러를 사용할 수 있습니다.With a custom presentation style, developers have the option to use a custom Presentation Controller. 이 사용자 지정 컨트롤러를 사용 하 여 동맹 된 뷰의 모양 및 동작을 수정할 수 있습니다.This custom controller can be used to modify the appearance and behavior of the View it is allied to.

Size 클래스 작업Working with Size Classes

이 문서에 포함 된 적응 사진 Xamarin 프로젝트는 iOS 8 통합 인터페이스 응용 프로그램에서 크기 클래스 및 적응 뷰 컨트롤러를 사용 하는 작업 예제를 제공 합니다.The Adaptive Photos Xamarin Project that is included with this article gives a working example of using Size Classes and Adaptive View Controllers in an iOS 8 Unified Interface application.

응용 프로그램은 IOS 디자이너를 사용 하 고 통합 스토리 보드를 만드는 것과는 반대로 코드에서 UI를 완전히 만드는 반면, 동일한 방법이 적용 됩니다.While the application creates its UI completely from code, as opposed to using the IOS Designer and creating a Unified Storyboard, the same techniques apply. 이 문서의 뒷부분에서는 Xamarin 응용 프로그램에서 통합 Storyboard와 iOS Designer를 사용 하 여 Size 클래스를 사용 하는 방법을 보여 줍니다.Later in this article, we’ll show how to use Size Classes with a Unified Storyboard and the iOS Designer in a Xamarin Application.

이제 적응 사진 프로젝트가 iOS 8의 몇 가지 크기 클래스 기능을 구현 하 여 적응 응용 프로그램을 만드는 방법에 대해 자세히 살펴보겠습니다.Now let’s take a closer look at how the Adaptive Photos project is implementing several of the Size Class features in iOS 8 to create a Adaptive Application.

특성 환경 변경 사항에 적응Adapting to Trait Environment Changes

IPhone에서 적응 사진 응용 프로그램을 실행 하는 경우 사용자가 장치를 세로에서 가로 방향으로 회전 하는 경우 분할 뷰 컨트롤러에 마스터 및 세부 정보 보기가 모두 표시 됩니다.When running the Adaptive Photos application on an iPhone, when the user rotates the device from portrait to landscape, the Split View Controller will display both the master and details view:

이렇게 하려면 뷰 컨트롤러의 UpdateConstraintsForTraitCollection 메서드를 재정의 하 고 VerticalSizeClass값을 기준으로 제약 조건을 조정 합니다.This is accomplished by overriding the UpdateConstraintsForTraitCollection method of the View Controller and adjusting the constraints based on the value of the VerticalSizeClass. 예를 들면,For example:

public void UpdateConstraintsForTraitCollection (UITraitCollection collection)
{
    var views = NSDictionary.FromObjectsAndKeys (
        new object[] { TopLayoutGuide, ImageView, NameLabel, ConversationsLabel, PhotosLabel },
        new object[] { "topLayoutGuide", "imageView", "nameLabel", "conversationsLabel", "photosLabel" }
    );

    var newConstraints = new List<NSLayoutConstraint> ();
    if (collection.VerticalSizeClass == UIUserInterfaceSizeClass.Compact) {
        newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("|[imageView]-[nameLabel]-|",
            NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));

        newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("[imageView]-[conversationsLabel]-|",
            NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));

        newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("[imageView]-[photosLabel]-|",
            NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));

        newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("V:|[topLayoutGuide]-[nameLabel]-[conversationsLabel]-[photosLabel]",
            NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));

        newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("V:|[topLayoutGuide][imageView]|",
            NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));

        newConstraints.Add (NSLayoutConstraint.Create (ImageView, NSLayoutAttribute.Width, NSLayoutRelation.Equal,
            View, NSLayoutAttribute.Width, 0.5f, 0.0f));
    } else {
        newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("|[imageView]|",
            NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));

        newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("|-[nameLabel]-|",
            NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));

        newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("|-[conversationsLabel]-|",
            NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));

        newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("|-[photosLabel]-|",
            NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));

        newConstraints.AddRange (NSLayoutConstraint.FromVisualFormat ("V:[topLayoutGuide]-[nameLabel]-[conversationsLabel]-[photosLabel]-20-[imageView]|",
            NSLayoutFormatOptions.DirectionLeadingToTrailing, null, views));
    }

    if (constraints != null)
        View.RemoveConstraints (constraints.ToArray ());

    constraints = newConstraints;
    View.AddConstraints (constraints.ToArray ());
}

전환 애니메이션 추가Adding Transition Animations

적응 사진 응용 프로그램의 분할 보기 컨트롤러가 축소에서 확장으로 전환 되 면 뷰 컨트롤러의 WillTransitionToTraitCollection 메서드를 재정의 하 여 애니메이션이 기본 애니메이션에 추가 됩니다.When the Split View Controller in the Adaptive Photos application goes from collapsed to expanded, animations are added to the default animations by overriding the WillTransitionToTraitCollection method of the view controller. 예를 들면,For example:

public override void WillTransitionToTraitCollection (UITraitCollection traitCollection, IUIViewControllerTransitionCoordinator coordinator)
{
    base.WillTransitionToTraitCollection (traitCollection, coordinator);
    coordinator.AnimateAlongsideTransition ((UIViewControllerTransitionCoordinatorContext) => {
        UpdateConstraintsForTraitCollection (traitCollection);
        View.SetNeedsLayout ();
    }, (UIViewControllerTransitionCoordinatorContext) => {
    });
}

특성 환경 재정의Overriding the Trait Environment

위에 표시 된 것 처럼, 적응 사진 응용 프로그램은 iPhone 장치가 가로 보기에 있을 때 분할 뷰 컨트롤러에서 세부 정보와 마스터 보기를 모두 표시 하도록 합니다.As show above, the Adaptive Photos application forces the Split View Controller to display both the details and the master views when the iPhone device is in the landscape view.

이 작업은 뷰 컨트롤러에서 다음 코드를 사용 하 여 수행 되었습니다.This was accomplished by using the following code in the View Controller:

private UITraitCollection forcedTraitCollection = new UITraitCollection ();
...

public UITraitCollection ForcedTraitCollection {
    get {
        return forcedTraitCollection;
    }

    set {
        if (value != forcedTraitCollection) {
            forcedTraitCollection = value;
            UpdateForcedTraitCollection ();
        }
    }
}
...

public override void ViewWillTransitionToSize (SizeF toSize, IUIViewControllerTransitionCoordinator coordinator)
{
    ForcedTraitCollection = toSize.Width > 320.0f ?
         UITraitCollection.FromHorizontalSizeClass (UIUserInterfaceSizeClass.Regular) :
         new UITraitCollection ();

    base.ViewWillTransitionToSize (toSize, coordinator);
}

public void UpdateForcedTraitCollection ()
{
    SetOverrideTraitCollection (forcedTraitCollection, viewController);
}

분할 뷰 컨트롤러 확장 및 축소Expanding and Collapsing the Split View Controller

다음으로, Xamarin에서 분할 뷰 컨트롤러의 확장 및 축소 동작을 구현 하는 방법을 살펴보겠습니다.Next let’s examine how the expanding and collapsing behavior of the Split View Controller was implemented in Xamarin. AppDelegate에서 분할 뷰 컨트롤러를 만들 때 해당 대리자는 이러한 변경 내용을 처리 하기 위해 할당 됩니다.In the AppDelegate, when the Split View Controller is created, its delegate is assigned to handle these changes:

public class SplitViewControllerDelegate : UISplitViewControllerDelegate
{
    public override bool CollapseSecondViewController (UISplitViewController splitViewController,
        UIViewController secondaryViewController, UIViewController primaryViewController)
    {
        AAPLPhoto photo = ((CustomViewController)secondaryViewController).Aapl_containedPhoto (null);
        if (photo == null) {
            return true;
        }

        if (primaryViewController.GetType () == typeof(CustomNavigationController)) {
            var viewControllers = new List<UIViewController> ();
            foreach (var controller in ((UINavigationController)primaryViewController).ViewControllers) {
                var type = controller.GetType ();
                MethodInfo method = type.GetMethod ("Aapl_containsPhoto");

                if ((bool)method.Invoke (controller, new object[] { null })) {
                    viewControllers.Add (controller);
                }
            }

            ((UINavigationController)primaryViewController).ViewControllers = viewControllers.ToArray<UIViewController> ();
        }

        return false;
    }

    public override UIViewController SeparateSecondaryViewController (UISplitViewController splitViewController,
        UIViewController primaryViewController)
    {
        if (primaryViewController.GetType () == typeof(CustomNavigationController)) {
            foreach (var controller in ((CustomNavigationController)primaryViewController).ViewControllers) {
                var type = controller.GetType ();
                MethodInfo method = type.GetMethod ("Aapl_containedPhoto");

                if (method.Invoke (controller, new object[] { null }) != null) {
                    return null;
                }
            }
        }

        return new AAPLEmptyViewController ();
    }
}

SeparateSecondaryViewController 메서드는 사진이 표시 되는지 테스트 하 고 해당 상태에 따라 작업을 수행 합니다.The SeparateSecondaryViewController method tests to see if a photo is being displayed and takes action based on that state. 표시 되는 사진이 없으면 마스터 뷰 컨트롤러가 표시 되도록 보조 뷰 컨트롤러를 축소 합니다.If no photo is being shown it collapses the Secondary View Controller so that the Master View Controller is displayed.

CollapseSecondViewController 메서드는 분할 뷰 컨트롤러를 확장 하 여 모든 사진이 스택에 있는지 확인 하는 데 사용 됩니다 .이 경우에는 해당 뷰로 다시 축소 됩니다.The CollapseSecondViewController method is used when expanding the Split View Controller to see if any photos exist on the stack, if so it collapses back to that view.

뷰 컨트롤러 간 이동Moving Between View Controllers

다음으로, 적응 사진 응용 프로그램이 보기 컨트롤러 간에 이동 하는 방법을 살펴보겠습니다.Next, let’s take a look at how the Adaptive Photos application moves between view controllers. 사용자가 테이블에서 셀을 선택 하는 경우 AAPLConversationViewController 클래스에서 ShowDetailViewController 메서드가 호출 되어 세부 정보 보기를 표시 합니다.In the AAPLConversationViewController class when the user selects a cell from the table, the ShowDetailViewController method is called to display the details view:

public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
    var photo = PhotoForIndexPath (indexPath);
    var controller = new AAPLPhotoViewController ();
    controller.Photo = photo;

    int photoNumber = indexPath.Row + 1;
    int photoCount = (int)Conversation.Photos.Count;
    controller.Title = string.Format ("{0} of {1}", photoNumber, photoCount);
    ShowDetailViewController (controller, this);
}

공개 표시기 표시Displaying Disclosure Indicators

적응 사진 응용 프로그램에는 특성 환경의 변경 내용에 따라 공개 표시기가 숨겨지거나 표시 되는 여러 위치가 있습니다.In the Adaptive Photo application there are several places where Disclosure Indicators are hidden or shown based on changes to the Trait Environment. 이는 다음 코드를 사용 하 여 처리 됩니다.This is handled with the following code:

public bool Aapl_willShowingViewControllerPushWithSender ()
{
    var selector = new Selector ("Aapl_willShowingViewControllerPushWithSender");
    var target = this.GetTargetViewControllerForAction (selector, this);

    if (target != null) {
        var type = target.GetType ();
        MethodInfo method = type.GetMethod ("Aapl_willShowingDetailViewControllerPushWithSender");
        return (bool)method.Invoke (target, new object[] { });
    } else {
        return false;
    }
}

public bool Aapl_willShowingDetailViewControllerPushWithSender ()
{
    var selector = new Selector ("Aapl_willShowingDetailViewControllerPushWithSender");
    var target = this.GetTargetViewControllerForAction (selector, this);

    if (target != null) {
        var type = target.GetType ();
        MethodInfo method = type.GetMethod ("Aapl_willShowingDetailViewControllerPushWithSender");
        return (bool)method.Invoke (target, new object[] { });
    } else {
        return false;
    }
}

이러한 내용은 위에서 설명한 GetTargetViewControllerForAction 방법을 사용 하 여 구현 됩니다.These are implemented using the GetTargetViewControllerForAction method discussed in detail above.

테이블 뷰 컨트롤러는 데이터를 표시 하는 경우 위에 구현 된 메서드를 사용 하 여 푸시 발생 여부와 그에 따라 노출 표시기를 표시 하거나 숨길지 여부를 확인 합니다.When a Table View Controller is displaying data, it uses the methods implemented above to see whether or not a push is going to happen, and whether or not to display or hide the Disclosure Indicator accordingly:

public override void WillDisplay (UITableView tableView, UITableViewCell cell, NSIndexPath indexPath)
{
    bool pushes = ShouldShowConversationViewForIndexPath (indexPath) ?
         Aapl_willShowingViewControllerPushWithSender () :
         Aapl_willShowingDetailViewControllerPushWithSender ();

    cell.Accessory = pushes ? UITableViewCellAccessory.DisclosureIndicator : UITableViewCellAccessory.None;
    var conversation = ConversationForIndexPath (indexPath);
    cell.TextLabel.Text = conversation.Name;
}

ShowDetailTargetDidChangeNotification 형식New ShowDetailTargetDidChangeNotification Type

Apple은 분할 뷰 컨트롤러, ShowDetailTargetDidChangeNotification에서 Size 클래스 및 특성 환경에서 작업 하기 위한 새 알림 유형을 추가 했습니다.Apple has added a new notification type for working with Size Classes and Trait Environments from within a Split View Controller, ShowDetailTargetDidChangeNotification. 이 알림은 컨트롤러가 확장 되거나 축소 되는 경우와 같이 분할 뷰 컨트롤러에 대 한 대상 정보 뷰가 변경 될 때마다 전송 됩니다.This notification gets sent whenever the target Detail View for a Split View Controller changes, such as when the controller expands or collapses.

적응 사진 응용 프로그램은이 알림을 사용 하 여 세부 정보 보기 컨트롤러가 변경 될 때 공개 표시기의 상태를 업데이트 합니다.The Adaptive Photos application uses this notification to update the state of the Disclosure Indicator when the Detail View Controller changes:

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();
    TableView.RegisterClassForCellReuse (typeof(UITableViewCell), AAPLListTableViewControllerCellIdentifier);
    NSNotificationCenter.DefaultCenter.AddObserver (this, new Selector ("showDetailTargetDidChange:"),
        UIViewController.ShowDetailTargetDidChangeNotification, null);
    ClearsSelectionOnViewWillAppear = false;
}

적응 사진 응용 프로그램을 자세히 살펴보면, 크기 클래스, 성분 컬렉션 및 적응 뷰 컨트롤러를 사용 하 여 Xamarin.ios에서 통합 응용 프로그램을 쉽게 만들 수 있는 모든 방법을 볼 수 있습니다.Take a closer look at the Adaptive Photos application to see all of the ways that Size Classes, Trait Collections and Adaptive View Controllers can be used to easily create a Unified Application in Xamarin.iOS.

통합 StoryboardsUnified Storyboards

IOS 8의 새로운 기능이 통합 된 스토리 보드를 사용 하면 개발자는 여러 크기 클래스를 대상으로 하 여 iPhone 및 iPad 장치 모두에 표시 될 수 있는 하나의 통합 된 스토리 보드 파일을 만들 수 있습니다.New to iOS 8, Unified Storyboards allow the developer to create one, unified storyboard file that can be displayed on both iPhone and iPad devices by targeting multiple Size Classes. 개발자는 통합 Storyboard를 사용 하 여 less UI 특정 코드를 작성 하 고 만들고 유지 관리 하는 인터페이스 디자인은 하나만 포함 합니다.By using Unified Storyboards, the developer writes less UI specific code and has only one interface design to create and maintain.

통합 Storyboard의 주요 이점은 다음과 같습니다.The key benefits of Unified Storyboards are:

  • IPhone 및 iPad 용 동일한 스토리 보드 파일을 사용 합니다.Use the same storyboard file for iPhone and iPad.
  • IOS 6 및 iOS 7로 뒤로 배포 합니다.Deploy backwards to iOS 6 and iOS 7.
  • Xamarin iOS 디자이너 내에서 다양 한 장치, 방향 및 OS 버전에 대 한 레이아웃을 미리 봅니다.Preview the layout for different devices, orientations and OS versions all from within the Xamarin iOS Designer.

이 기능은 Mac용 Visual Studio에서 완벽 하 게 지원 됩니다.This feature is fully supported in Visual Studio for Mac

Size 클래스 사용Enabling Size Classes

기본적으로 모든 새 Xamarin.ios 프로젝트는 크기의 클래스입니다.By default, any new Xamarin.iOS project will us size classes. 이전 프로젝트의 스토리 보드 내에서 Size 클래스 및 적응 Segue을 사용 하려면 먼저 iOS 디자이너 내에서 Xcode 6 통합 스토리 보드 형식으로 변환 해야 합니다.To use Size Classes and Adaptive Segues inside a storyboard from an older project, it must first be converted to the Xcode 6 Unified Storyboard format from inside the iOS Designer.

이렇게 하려면 iOS 디자이너에서 변환할 스토리 보드를 열고 크기 클래스 사용 확인란을 선택 합니다.To do this open the Storyboard to be converted in the iOS Designer and check the Use Size Classes check box:

IOS Designer는 개발자가 크기 클래스를 사용 하도록 스토리 보드의 형식을 변환 하려고 하는지 확인 합니다.The iOS Designer will confirm that the developer wants to convert the format of the storyboard to use Size Classes:

중요

크기 클래스가 제대로 작동 하려면 자동 레이아웃도 선택 해야 합니다.Auto Layout must also be checked for Size Classes to work correctly.

일반 장치 유형Generic Device Types

크기 조정 클래스를 사용 하도록 스토리 보드를 변환 하면 Design Surface에 다시 표시 되 고 뷰가 다음으로 표시 됩니다.Once the storyboard has been converted to use Size Classes, it will be redisplayed in the Design Surface and the View As device will be Generic:

일반 장치 유형을 선택 하면 모든 뷰 컨트롤러의 크기가 600 x 600 제곱으로 조정 됩니다.When the Generic device type is selected, all View Controllers will be resized to a 600 x 600 Square. 이 사각형은 모든 너비와 높이의 크기를 나타냅니다.This square represents sizes of any width and any height. IOS 디자이너가이 모드에 있을 때 모든 편집 내용이 모든 크기 클래스에 적용 됩니다.When the iOS Designer is in this mode, any edits will apply to all of the Size Classes.

또한 개발자는 디자인 화면을 iPhone으로 볼 수 있는 옵션도 있습니다.The developer also has the option of viewing the design surface as an iPhone:

또는 iPad로 볼 수 있습니다.Or viewing it as an iPad:

크기 클래스 선택Select a Size Class

크기 클래스 선택기 단추는 Design Surface의 왼쪽 위 모퉁이에 있습니다 (드롭다운으로 보기 근처).The Size Class Selector button is at the upper left hand corner of the Design Surface (near the View As dropdown). 개발자는 현재 편집 중인 크기 클래스를 선택할 수 있습니다.It allows the developer to select which Size Classes are currently being edited:

이 선택기는 크기 클래스 선택 항목을 3 x 3 표로 표시 합니다.The selector presents the Size Class selection as a 3 x 3 grid. 표의 각 사각형은 Width 클래스와 Height 클래스의 조합을 나타냅니다.Each of the squares in the grid represents a combination of a Width Class and a Height Class. 가운데 정사각형은 모든 너비/높이 크기 클래스 (통합 Storyboard의 기본 보기)를 선택 합니다.The center square selects the Any Width/Any Height Size class (which is the default view for a Unified Storyboard). 이 사각형을 선택 하면 개발자는 다른 모든 구성에서 상속 되는 기본 레이아웃을 편집 합니다.When this square is selected, the developer is editing the default layout, which is inherited by all the other configurations.

표 왼쪽 위 모퉁이에 있는 사각형은 컴팩트 너비/컴팩트 높이 크기 클래스를 나타냅니다.The square in the upper left hand corner of the grid represents the Compact Width/Compact Height Size Class:

이 모드는 가로 방향의 iPhone에 해당 합니다.This mode corresponds to an iPhone in the landscape orientation. 표의 오른쪽 아래 모퉁이에 있는 사각형은 iPad를 나타내는 일반 Width/Regular Height Size 클래스를 나타냅니다.The square in the lower right hand corner of the grid represents the Regular Width/Regular Height Size Class, which represents an iPad:

세로 방향으로 iPhone의 레이아웃을 편집 하려면 왼쪽 아래 모서리에서 사각형을 선택 합니다.To edit the layout for an iPhone in the portrait orientation, select the square in the lower left hand corner. 이는 Compact Width/Regular Height Size 클래스를 나타냅니다.This represents the Compact Width/Regular Height Size Class:

사각형을 클릭 하 여 선택 하면 Design Surface는 새 선택 항목에 맞게 보기 컨트롤러의 크기를 변경 합니다.Click in the square to select it and the Design Surface will change the size of the View Controllers to match the new selection:

Size 클래스에 대 한 자세한 내용과 Iphone 및 Ipad의 레이아웃에 영향을 주는 방법에 대 한 자세한 내용은이 문서의 Size 클래스 섹션을 참조 하세요.See the Size Class section of this article for more information on Size Classes and how they affect layout for iPhones and iPads.

적응 Segue 형식Adaptive Segue Types

개발자가 이전에 스토리 보드를 사용한 적이 있는 경우 기존 segue 형식 푸시, 모달팝 오버에 익숙할 것입니다.If the developer has used storyboards before, then they will be familiar with the existing segue types of Push, Modal and Popover. 통합 Storyboard 파일에서 크기 클래스를 사용 하는 경우 위에 설명 된 새로운 뷰 컨트롤러 API에 해당 하는 다음과 같은 적응 Segue 유형을 사용할 수 있습니다. 세부 정보표시 및 표시When Size Classes are enabled on a Unified Storyboard file, the following Adaptive Segue Types (that correspond to the new View Controller API discussed above) are made available: Show and Show Detail.

중요

Size 클래스를 사용 하도록 설정 하면 모든 기존 segue 새 형식으로 변환 됩니다.When Size Classes are enabled, any existing segues will be converted to the new types.

마스터 뷰에서 간단한 게임 탐색 메뉴가 있는 분할 뷰 컨트롤러에서 통합 Storyboard를 사용 하는 iOS 8 응용 프로그램의 예를 살펴보겠습니다.Take the example of an iOS 8 Application that uses a Unified Storyboard with a Split View Controller that has a simple game navigation menu in the Master View. 사용자가 메뉴 단추를 클릭 하면 선택한 항목의 보기 컨트롤러가 iPad에서 실행 될 때 분할 보기 컨트롤러의 세부 정보 섹션에 표시 됩니다.If the user clicks on a menu button, the selected item’s View Controller should be shown in the Details section of the Split View Controller when running on an iPad. IPhone에서 항목의 보기 컨트롤러는 탐색 스택으로 푸시됩니다.On an iPhone the item’s View Controller should be pushed onto the Navigation stack.

이 효과를 얻으려면 iOS 디자이너 컨트롤에서 단추를 클릭 하 고 표시 될 보기 컨트롤러에 선을 끌어 놓습니다.To achieve this effect, in the iOS Designer control-click on the button and drag a line to the View Controller to be displayed. 마우스 단추를 놓으면 Segue 형식 팝업 메뉴에서 Show Detail를 선택 합니다.When the mouse button is released, select Show Detail from the Segue Type Popup menu:

단추와 뷰 컨트롤러 간에 새 segue이 만들어집니다.The new segue will be created between the button and the View Controller. 이제 iPhone 시뮬레이터에서 응용 프로그램을 실행 하면 주 메뉴가 표시 됩니다.Now run the application in the iPhone Simulator and the Main Menu will be displayed:

게임 선택 단추를 클릭 하면 항목의 뷰 컨트롤러가 탐색 스택으로 푸시됩니다.Click on the Select Game button and the item’s View Controller will be pushed onto the Navigation Stack:

IPhone 시뮬레이터를 중지 하 고 iPad 시뮬레이터에서 응용 프로그램을 실행 합니다.Stop the iPhone Simulator and run the Application in the iPad Simulator. 가로 방향으로 전환 하면 주 메뉴가 다시 표시 됩니다.Switch to the landscape orientation and the main menu is again displayed:

다시 게임 선택 단추를 클릭 하면 분할 보기 컨트롤러의 세부 정보 섹션에 해당 항목의 보기 컨트롤러가 표시 됩니다.Again, click on the Select Game button and the item’s View Controller is shown in the Details section of the Split View Controller:

Size 클래스에서 요소 제외Excluding an Element from a Size Class

특정 크기 클래스 내에서 지정 된 요소 (예: 뷰, 컨트롤 또는 제약 조건)가 필요 하지 않은 경우도 있습니다.There are times when a given element (such as a View, Control or a Constraint) is not required inside of a specific Size Class. Size 클래스에서 요소를 제외 하려면 Design Surface에서 제외할 원하는 항목을 선택 합니다.To exclude an element from a Size Class, select the desired item to exclude in the Design Surface. 속성 탐색기 의 아래쪽으로 스크롤하고 기어 드롭다운 메뉴를 클릭 합니다.Scroll to the bottom of the Property Explorer and click the Gear Dropdown menu. 항목을 제외할 너비높이 의 조합을 선택 합니다.Select the combination of Width and Height to exclude the item from:

속성 탐색기의 맨 아래에 있는 요소에 새 제외 사례가 추가 됩니다.A new Exclusion Case will be added to the element in the bottom of the Property Explorer. 다음으로, 지정 된 Size 클래스에 대해 설치 됨 확인란의 선택을 취소 합니다.Next, uncheck the Installed checkbox for the given Size Class:

Design Surface를 항목이 제외 된 너비와 높이로 전환 합니다 .이는 지정 된 크기 클래스에서 제거 되었지만 전체 UI 디자인은 제외 됩니다.Switch the Design Surface to the Width and Height that the item was excluded from, it has been removed from the given Size Class, but not the entire UI design:

모든 너비/높이 크기 클래스로 다시 전환 하 여 요소가 아직 준비 되어 있습니다.Switching back to the Any Width/Any Height size class and the element is still in place:

응용 프로그램이 iPad 시뮬레이터에서 실행 되 면 요소가 표시 됩니다.When the application is run in the iPad Simulator, the element appears:

IPhone 시뮬레이터에서 응용 프로그램을 실행 하는 경우 요소가 누락 됩니다.And when the application is run on the iPhone Simulator, the element is missing:

요소에서 제외 사례를 제거 하려면 Design Surface에서 요소를 선택 하 고 속성 탐색기 의 아래쪽으로 스크롤한 다음 제거할 사례 옆의 - 단추를 클릭 하면 됩니다.To remove an Exclusion Case from an element, simply select the element in the Design Surface, scroll to the bottom of the Property Explorer and click the - button beside the case to remove.

통합 Storyboard의 구현을 보려면이 문서에 연결 된 UnifiedStoryboard 샘플 Xamarin iOS 8 응용 프로그램을 살펴봅니다.To see an implementation of Unified Storyboards, look at the UnifiedStoryboard sample Xamarin iOS 8 application attached to this document.

동적 실행 화면Dynamic Launch Screens

시작 화면 파일은 iOS 응용 프로그램을 시작 하는 동안 시작 화면으로 표시 되며, 사용자에 게 앱을 실제로 시작 하는 피드백을 제공 합니다.The launch screen file is displayed as a splash screen while an iOS application is launching to provide feedback to the user that the app is actually starting-up. IOS 8 이전에 개발자는 응용 프로그램이 실행 되는 각 장치 유형, 방향 및 화면 해상도에 대 한 여러 Default.png 이미지 자산을 포함 해야 합니다.Prior to iOS 8, the developer would have to include multiple Default.png image assets for each device type, orientation and screen resolution that the application would be running on. 예를 들어 Default@2x.png, Default-Landscape@2x~ipad.png, Default-Portrait@2x~ipad.png등이 있습니다.For example, Default@2x.png, Default-Landscape@2x~ipad.png, Default-Portrait@2x~ipad.png, etc.

모든 기존 iPhone 및 iPad 장치에서 새로운 iPhone 6 및 iPhone 6 Plus 장치와 장치 (및 예정 된 Apple Watch)를 구분 하는 것은 다양 한 규모의 다양 한 크기, 방향 및 해상도를 나타냅니다. Default.png 시작 화면 이미지 자산의 자산 생성 및 유지 관리Factoring in the new iPhone 6 and iPhone 6 Plus devices (and the upcoming Apple Watch) with all the existing iPhone and iPad devices, this represents a large array of varying sizes, orientations and resolutions of Default.png startup screen image assets that must be created and maintained. 또한 이러한 파일은 매우 클 수 있으며, iTunes 앱 스토어에서 응용 프로그램을 다운로드 하는 데 필요한 시간을 증가 시켜 서 앱 번들을 "확장" 합니다 (셀룰러 네트워크를 통해 전달 되지 않도록 할 수 있음). 최종 사용자의 장치에 필요한 저장소 용량을 늘립니다.In addition, these files can be quite large and will "bloat" the deliverable application bundle, increasing the amount of time required to download the application from the iTunes App Store (possibly keeping it from being able to be delivered over a cellular network) and increasing the amount of storage required on the end user's device.

IOS 8의 새로운 기능은 개발자가 자동 레이아웃 및 크기 클래스를 사용 하 여 모든 장치, 해상도 및 방향에 대해 작동 하는 동적 시작 화면 을 만드는 Xcode에서 단일 원자 .xib 파일을 만들 수 있습니다.New to iOS 8, the developer can create a single, atomic .xib file in Xcode that uses Auto Layout and Size Classes to create a Dynamic Launch Screen that will work for every device, resolution and orientation. 이렇게 하면 개발자가 필요한 모든 이미지 자산을 만들고 유지 관리 하는 데 필요한 작업량을 줄일 수 있을 뿐만 아니라 응용 프로그램의 설치 된 번들 크기를 크게 줄일 수 있습니다.This not only reduces the amount of work required of the developer to create and maintain all the required image assets, but it greatly reduces the size of the application's installed bundle.

동적 시작 화면에는 다음과 같은 제한 사항이 있습니다.Dynamic Launch Screens have the following limitations and considerations:

  • UIKit 클래스만 사용 합니다.Use only UIKit classes.
  • UIView 또는 UIViewController 개체인 단일 루트 뷰를 사용 합니다.Use a single root view that is a UIView or UIViewController object.
  • 응용 프로그램 코드에 연결 하지 않습니다 ( 작업 또는 콘센트를 추가 하지 않음).Don’t make any connections to the application's code (don’t add Actions or Outlets).
  • UIWebView 개체를 추가 하지 마세요.Don’t add UIWebView objects.
  • 사용자 지정 클래스를 사용 하지 마세요.Don’t use any custom classes.
  • 런타임 특성을 사용 하지 마세요.Don’t use runtime attributes.

위의 지침을 염두에 두면 기존 Xamarin iOS 8 프로젝트에 동적 실행 화면을 추가 하는 것을 살펴보겠습니다.With the above guidelines in mind, let's look at adding a Dynamic Launch Screen to an existing Xamarin iOS 8 project.

다음을 수행합니다.Do the following:

  1. Mac용 Visual Studio 를 열고 솔루션 을 로드 하 여 동적 시작 화면을 추가 합니다.Open Visual Studio for Mac and load the Solution to add the Dynamic Launch Screen to.

  2. 솔루션 탐색기에서 MainStoryboard.storyboard 파일을 마우스 오른쪽 단추로 클릭 하 고 > Xcode Interface Builder 로 열기 를 선택 합니다.In the Solution Explorer, right-click the MainStoryboard.storyboard file and select Open With > Xcode Interface Builder:

  3. Xcode에서 파일 > > 파일...을 선택 합니다.In Xcode, select File > New > File...:

  4. IOS > 사용자 인터페이스 > 시작 화면 을 선택 하 고 다음 단추를 클릭 합니다.Select iOS > User Interface > Launch Screen and click the Next button:

  5. 파일 이름을 LaunchScreen.xib 하 고 만들기 단추를 클릭 합니다.Name the file LaunchScreen.xib and click the Create button:

  6. 그래픽 요소를 추가 하 고 레이아웃 제약 조건을 사용 하 여 지정 된 장치, 방향 및 화면 크기로 배치 하 여 시작 화면의 디자인을 편집 합니다.Edit the design of the launch screen by adding graphic elements and using Layout Constraints to position them for the given devices, orientations and screen sizes:

  7. LaunchScreen.xib에 대 한 변경 내용을 저장 합니다.Save the changes to LaunchScreen.xib.

  8. 응용 프로그램 대상을 선택 하 고 일반 탭을 선택 합니다.Select the Applications Target and the General tab:

  9. Info.plist 선택 단추를 클릭 하 고 Xamarin 앱에 대 한 Info.plist를 선택 하 고 선택 단추를 클릭 합니다.Click the Choose Info.plist button, select the Info.plist for the Xamarin app and click the Choose button:

  10. 앱 아이콘 및 시작 이미지 섹션에서 시작 화면 파일 드롭다운을 열고 위에서 만든 LaunchScreen.xib를 선택 합니다.In the App Icons and Launch Images section, open the Launch Screen File dropdown and choose the LaunchScreen.xib created above:

  11. 변경 내용을 파일에 저장 하 고 Mac용 Visual Studio로 돌아갑니다.Save the changes to the file and return to Visual Studio for Mac.

  12. Xcode와 Mac용 Visual Studio의 변경 내용 동기화가 완료 될 때까지 기다립니다.Wait for Visual Studio for Mac to finish syncing changes with Xcode.

  13. 솔루션 탐색기에서 리소스 폴더를 마우스 오른쪽 단추로 클릭 하 고 추가 > 파일 추가...를 선택 합니다.In the Solution Explorer, right-click on the Resource folder and select Add > Add Files...:

  14. 위에서 만든 LaunchScreen.xib 파일을 선택 하 고 열기 단추를 클릭 합니다.Select the LaunchScreen.xib file created above and click the Open button:

  15. 애플리케이션을 빌드합니다.Build the application.

동적 시작 화면 테스트Testing the Dynamic Launch Screen

Mac용 Visual Studio에서 iPhone 4 레 티 나 시뮬레이터를 선택 하 고 응용 프로그램을 실행 합니다.In Visual Studio for Mac, select the iPhone 4 Retina simulator and run the application. 동적 실행 화면이 올바른 형식 및 방향으로 표시 됩니다.The Dynamic Launch Screen will be displayed in the correct format and orientation:

Mac용 Visual Studio에서 응용 프로그램을 중지 하 고 iPad iOS 8 장치를 선택 합니다.Stop the application in Visual Studio for Mac and select an iPad iOS 8 device. 응용 프로그램을 실행 하면이 장치 및 방향에 맞게 시작 화면의 형식이 올바르게 지정 됩니다.Run the application and the launch screen will be correctly formatted for this device and orientation:

Mac용 Visual Studio로 돌아가서 응용 프로그램이 실행 되는 것을 중지 합니다.Return to Visual Studio for Mac and stop the application from running.

IOS 7 작업Working with iOS 7

이전 버전인 iOS 7과의 호환성을 유지 하려면 iOS 8 응용 프로그램에서 일반적인 Default.png 이미지 자산을 일반으로 포함 하면 됩니다.To maintain backward compatibility with iOS 7, just include the usual Default.png image assets as normal in the iOS 8 application. ios는 이전 동작으로 돌아가서 iOS 7 장치에서 실행 될 때 해당 파일을 시작 화면으로 사용 합니다.iOS will return to the previous behavior and use those files as the startup screen when running on an iOS 7 device.

Xamarin에서 동적 실행 화면의 구현을 보려면이 문서에 연결 된 동적 시작 화면 샘플 iOS 8 응용 프로그램을 확인 하세요.To see an implementation of a Dynamic Launch Screen in Xamarin, look at the Dynamic Launch Screens sample iOS 8 application attached to this document.

요약Summary

이 문서에서는 크기 클래스와 iPhone 및 iPad 장치의 레이아웃에 미치는 영향에 대해 간략히 살펴봅니다.This article took a quick look at Size Classes and how they affect layout in iPhone and iPad devices. 특성, 특성 환경 및 특성 컬렉션이 Size 클래스와 함께 작동 하 여 통합 인터페이스를 만드는 방법에 대해 설명 했습니다.It discussed how Traits, Trait Environments and Trait Collections work with Size Classes to create Unified Interfaces. 적응 뷰 컨트롤러와 통합 인터페이스 내의 크기 클래스에서 작동 하는 방식에 대해 간략하게 살펴보았습니다.It took brief look at Adaptive View Controllers and how they work with Size Classes inside of Unified Interfaces. Xamarin iOS 8 응용 프로그램 내의 코드에서 C# 크기 클래스 및 통합 인터페이스를 완전히 구현 하는 방법을 살펴보았습니다.It looked at implementing Size Classes and Unified Interfaces completely from C# code inside a Xamarin iOS 8 application.

마지막으로,이 문서에서는 ios 장치에서 작동 하 고 모든 iOS 8 장치에 시작 화면으로 표시 되는 단일 동적 시작 화면을 만드는 Xamarin iOS Designer를 사용 하 여 통합 된 스토리 보드를 만드는 기본 사항을 설명 했습니다.Finally, this article covered the basics of creating Unified Storyboards with the Xamarin iOS Designer that will work across iOS devices and creating a single, Dynamic Launch Screen that will be displayed as the startup screen on every iOS 8 device.