Унифицированная раскадровка в Xamarin.iOSUnified Storyboards in Xamarin.iOS

iOS 8 включает в себя новый, более простой в использовании механизм для создания пользовательского интерфейса — унифицированной раскадровки.iOS 8 includes a new, simpler-to-use mechanism for creating the user interface — the unified 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, разработчик использовал UIInterfaceOrientation и UIInterfaceIdiom для различения между режимами альбомной и книжной ориентации, а также между устройств 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:

  • Регулярные — это размер большого экрана (таких как 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:

  • Когда устройство находится в книжной ориентации, экран содержит compact класса по горизонтали и регулярных по вертикали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 PlusiPhone 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 использует новый график Retina HD с коэффициентом масштабирования экрана 3.0 (три раза исходного iPhone разрешения экрана).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 и более поздних версий, средства каталогов может включать изображения на 1 x, 2 x и 3 размеров x; просто добавьте новые графические активы и операций ввода-вывода выберете соответствующих ресурсов при работе на iPhone 6 Plus.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.png, и MonkeyIcon@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 Plus 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");

Или если они назначены изображения к элементу пользовательского интерфейса, с помощью iOS конструктора как MonkeyIcon.png, MonkeyIcon@3x.png будет использовать автоматически, на iPhone 6 Plus.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, разработчик может создать один atomic .xib файл в Xcode, автоматический макет и размер классов для создания динамического экран запуска , будет работать для всех устройств, разрешения и ориентации.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. Они состоят из набора свойств ( HorizontalSizeClass и VerticalSizeClass на основе UIUserInterfaceSizeClass), а также интерфейс идиому ( 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. Разработчик, этот метод можно использовать для изменения любого из элементов пользовательского интерфейса, зависящие от признаки, когда эти признаки были изменены.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 CompactCompact
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 называется Unspecified):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 CompactCompact
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.

Разработчик также будет предоставлена коллекция частичные признака, если они используют один из методов создания, предоставляемых компанией Apple, таких как UITraitCollection.FromHorizontalSizeClass, чтобы создать новую коллекцию.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.

Для проверки используются два признаки Contains метод UITraitCollection передавая значение признака, который необходимо протестировать.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. Например разработчик может содержать изображение меньшего размера для работы с Compact класс признака и полного размера образа для любой другой коллекции.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.

UIImageAssetUIImageAsset

Apple добавлен новый класс для iOS 8 UIImageAsset для предоставления разработчикам еще большего контроля над Выбор изображения.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 UIImageAsset документации.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. Это делается с помощью FromTraitsFromCollections метод UITraitCollection класса.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 в альбомной ориентации, контроллер разделенного представления представит его представления side-by-side, как и в случае, когда будут отображаться на 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.

На iPhone, где размер класса compact в оба варианта расположения, контроллер разделенного представления отображаются только представлении «Подробности», как показано ниже: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 очищает up любые временные состояния, необходимые во время перехода.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 Метод доступен только на контроллеры представления ( UIViewController), а не на других средах признака, например UIViews.The WillTransitionToTraitCollection method is only available on View Controllers ( UIViewController) and not on other Trait Environments, like UIViews.

TraitCollectionDidChange Отлично подходит для работы с 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. Разработчик может переопределить это поведение путем переопределения GetPrimaryViewControllerForCollapsingSplitViewController метод UISplitViewControllerDelegate и предоставляя любого контроллера представления, они должны отображаться в свернутом состоянии.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. Вызов CollapseSecondViewController метод UISplitViewControllerDelegate позволяет контроллеру главное представление для отображения при возникновении свернуть, а не в представлении сведений.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. Опять же, разработчик может переопределить это поведение, используя GetPrimaryViewControllerForExpandingSplitViewController метод UISplitViewControllerDelegate .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. Разработчик может переопределить это поведение путем вызова SeparateSecondaryViewController метод UISplitViewControllerDelegate .The developer can override this behavior by calling the SeparateSecondaryViewController method of the UISplitViewControllerDelegate .

В контроллер разделенного представления первичного контроллера представления играет роль в развертывание и свертывание представления путем реализации CollapseSecondViewController и SeparateSecondaryViewController методы UISplitViewControllerDelegate.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.
  • ShowDetailViewController — Работает таким же образом, чтобы ShowViewController, но реализуется на контроллер разделенного представления для замены нового контроллера представления, передаваемые в представление сведений.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.

Разработчики могут реализовать ShowViewController и ShowDetailViewController в собственных пользовательских контроллеров представлений для получения же автоматизировали функциональные возможности, UINavigationController и UISplitViewController предоставляет.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. Так как этот метод является открытым, разработчики могут создавать свои собственные пользовательские методы, функции так же, как встроенные в ShowViewController и ShowDetailViewController методы.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. Контроллер представления презентации контекстном автоматически предоставит обычному отображению контекстном в обычный класс размер, но будет отображать его во весь экран в классе размер по горизонтали compact (такие как на устройстве 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. Здесь, приложение может предоставить собственные PresentationController а не с помощью UIKit контроллера.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. Этот настраиваемый контроллер позволяют изменять внешний вид и поведение он является allied для представления.This custom controller can be used to modify the appearance and behavior of the View it is allied to.

Работа с классами размер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 и создания единой раскадровки, применяются те же методы.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 iOS.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

При запуске приложения Adaptive фотографии на устройстве 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

Теперь давайте рассмотрим перемещение между контроллерами представления приложения Adaptive фотографии.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

В приложении Adaptive Photo существует несколько мест, где индикаторы раскрытие скрытых или отобразятся на основе изменений в среду признака.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.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.

Унифицированные раскадровкиUnified 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. С помощью унифицированным раскадровкам, разработчик пишет меньше определенного код пользовательского интерфейса и имеет только один интерфейс разработки для создания и обслуживания.By using Unified Storyboards, the developer writes less UI specific code and has only one interface design to create and maintain.

Основные преимущества унифицированным раскадровкам приведены.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.
  • Предварительный просмотр макета для различных устройств, ориентации и версии ОС из в конструктор iOS Xamarin.Preview the layout for different devices, orientations and OS versions all from within the Xamarin iOS Designer.

Эта функция полностью поддерживается в Visual Studio для MacThis feature is fully supported in Visual Studio for Mac

Включение размеровEnabling Size Classes

По умолчанию любым новым проектом Xamarin.iOS будет нам классы размера.By default, any new Xamarin.iOS project will us size classes. Чтобы использовать классы размера и адаптивной переходы внутри раскадровки из старого проекта, необходимо преобразовать в формат раскадровки единой Xcode 6 из внутри конструктора iOS.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 Designer и проверка классы размера используйте флажок:To do this open the Storyboard to be converted in the iOS Designer and check the Use Size Classes check box:

Конструктор iOS убедитесь, что разработчику необходимо преобразовать формат раскадровки, которую следует использовать классы размера: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

После преобразования раскадровки для использования классов размер его будут отображены повторно в рабочей области конструирования и просмотреть как устройство будет универсальный: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

Кнопка селектор класса размера, расположенная в левом верхнем углу области конструктора (рядом с представление в виде раскрывающегося списка).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. Каждый из квадратов в сетке представляет комбинацию классов ширины и высоты.Each of the squares in the grid represents a combination of a Width Class and a Height Class. Центральный квадрат выбирает Any Width/Any высота размер класса (который является представлением по умолчанию для единой раскадровки).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.

Квадрат в левом верхнем углу сетки представляет класс Compact размера ширины/Compact Высота: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. Квадрат в правом нижнем углу сетки представляет регулярные ширина/Regular высота размер класс, который представляет iPad: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 класс размера ширины/Regular Высота:This represents the Compact Width/Regular Height Size Class:

Щелкните в квадрат, чтобы выбрать его, и в область конструктора приведет к изменению размера контроллеров представлений для сопоставления нового выделения:Click in the square to select it and the Design Surface will change the size of the View Controllers to match the new selection:

См. в разделе класса размера в этой статье подробнее на размеры и как они влияют на макет для iPhone и iPad.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 Push, модального и контекстном.If the developer has used storyboards before, then they will be familiar with the existing segue types of Push, Modal and Popover. Когда классы размера включены в файл единой раскадровки, становятся доступными следующие адаптивной Segue типы (которые соответствуют новый API контроллера представления, описанных выше): Показать и выводятся сведения о.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.

Важно!

Если включены классы размеров, все существующие переходы будут преобразовываться в новые типы.When Size Classes are enabled, any existing segues will be converted to the new types.

Рассмотрим в качестве примера из 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. При отпускании кнопки мыши, выберите Show Detail Segue типа во всплывающем меню:When the mouse button is released, select Show Detail from the Segue Type Popup menu:

Будет создан новый переход между кнопкой "и" контроллер представления.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:

Исключение элемента из класса размера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. Чтобы исключить элемент из класса размера, выберите нужный элемент, чтобы исключить в конструктора.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. Затем снимите флажок установленные флажок для данного класса размера:Next, uncheck the Installed checkbox for the given Size Class:

Перейдите в область конструктора в ширину и высоту, элемент был исключен из, он был удален из заданного класса размера, но не весь макет пользовательского интерфейса: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:

Вернуться к классу Any высота Width/Any размер и элемент все еще находится в месте: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:

Чтобы удалить ветвь исключения из элемента, просто выбрать элемент на конструктора, прокрутите до нижней части обозреватель свойств и нажмите кнопку - кнопку рядом с полем так, чтобы удалить.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.

Чтобы увидеть реализацию унифицированным раскадровкам, просмотрите 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 6 "и" iPhone 6 Plus устройств (и предстоящих Apple Watch) с все устройства iPad и iPhone существующие, это представляет большой массив разного размера, ориентации и устранения 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 App Store (в возможно обновление он не сможет доставить по сотовой сети) и увеличение объема пространства хранения на устройстве конечного пользователя.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, разработчик может создать один atomic .xib файл в Xcode, автоматический макет и размер классов для создания динамического экран запуска , будет работать для всех устройств, разрешения и ориентации.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. Откройте Visual Studio для Mac и загрузить решение Добавление динамических экрана запуска для.Open Visual Studio for Mac and load the Solution to add the Dynamic Launch Screen to.

  2. В обозревателе решений, щелкните правой кнопкой мыши MainStoryboard.storyboard файл и выберите открыть с помощью > конструктора Interface Builder Xcode:In the Solution Explorer, right-click the MainStoryboard.storyboard file and select Open With > Xcode Interface Builder:

  3. В Xcode, выберите файл > New > файла... :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 кнопку, выберите Info.plist приложение Xamarin и нажмите кнопку Выбор кнопки: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. Сохранить изменения в файл и вернитесь в Visual Studio для Mac.Save the changes to the file and return to Visual Studio for Mac.

  12. Подождите, пока Visual Studio для Mac завершить синхронизацию изменений с Xcode.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

В Visual Studio для Mac установите имитатора сетчатку 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:

Остановить приложение в Visual Studio для Mac и выберите устройства 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:

Вернитесь в Visual Studio для Mac и остановить запуск приложения.Return to Visual Studio for Mac and stop the application from running.

Работа с iOS 7Working with iOS 7

Чтобы обеспечить обратную совместимость с iOS 7, просто включите обычные Default.png ресурсы в обычном режиме в приложении iOS 8 изображений.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. Это обсуждалось, работе признаки, признака сред и признака коллекций с помощью классов размера для создания единого интерфейса.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. Хотя реализация размер классы и интерфейсы, единой, полностью из рассматривались C# кода внутри приложения Xamarin iOS 8.It looked at implementing Size Classes and Unified Interfaces completely from C# code inside a Xamarin iOS 8 application.

Наконец в этой статье рассматриваются основы создания унифицированным раскадровкам в конструкторе, который будет работать на устройствах iOS IOS Xamarin и создание одинарный, динамические экрана запуска, которая будет отображаться как заставки на любых устройствах с iOS 8.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.