디바이스 방향 확인Checking Device Orientation

샘플 다운로드 샘플 다운로드Download Sample Download the sample

이 문서에서는 각 플랫폼에서 기본 API를 사용하여 공유 코드에서 디바이스 방향을 확인하기 위해 DependencyService를 사용하는 방법을 안내합니다.This article will guide you to use DependencyService to check the device orientation from shared code using the native APIs on each platform. 이 연습은 Ali Özgür별 기존 DeviceOrientation 플러그 인을 따릅니다.This walkthrough is based on the existing DeviceOrientation plugin by Ali Özgür. 자세한 내용은 GitHub 리포지토리를 참조하세요.See the GitHub repo for more information.

  • 인터페이스 만들기 – 공유 코드에서 인터페이스를 만드는 방법을 이해합니다.Creating the Interface – understand how to the interface is created in shared code.
  • iOS 구현 – iOS용 네이티브 코드에서 인터페이스를 구현하는 방법을 알아봅니다.iOS Implementation – learn how to implement the interface in native code for iOS.
  • Android 구현 – Android용 네이티브 코드에서 인터페이스를 구현하는 방법을 알아봅니다.Android Implementation – learn how to implement the interface in native code for Android.
  • UWP 구현 – UWP(유니버설 Windows 플랫폼)용 네이티브 코드에서 인터페이스를 구현하는 방법을 알아봅니다.UWP Implementation – learn how to implement the interface in native code for the Universal Windows Platform (UWP).
  • 공유 코드에서 구현 – 공유 코드에서 기본 구현을 호출하기 위해 DependencyService를 사용하는 방법을 알아봅니다.Implementing in Shared Code – learn how to use DependencyService to call into the native implementation from shared code.

DependencyService를 사용한 애플리케이션에는 다음과 같은 구조가 있습니다.The application using DependencyService will have the following structure:

참고

디바이스 방향에 표시된 대로 디바이스가 공유 코드에서 세로 방향 또는 가로 방향인지 여부를 검색할 수 있습니다.It is possible to detect whether the device is in portrait or landscape orientation in shared code, as demonstrated in Device Orientation. 이 문서에서 설명한 메서드는 기본 기능을 사용하여 디바이스가 뒤집혔는지 여부를 포함한 방향에 대한 자세한 정보를 얻습니다.The method described in this article uses native features to get more information about orientation, including whether the device is upside down.

인터페이스 만들기Creating the Interface

먼저 구현하려는 기능이 표시되는 공유 코드에서 인터페이스를 만듭니다.First, create an interface in the shared code that expresses the functionality you plan to implement. 예를 들어 인터페이스에는 단일 메서드가 포함됩니다.For this example, the interface contains a single method:

namespace DependencyServiceSample.Abstractions
{
    public enum DeviceOrientations
    {
        Undefined,
        Landscape,
        Portrait
    }

    public interface IDeviceOrientation
    {
        DeviceOrientations GetOrientation();
    }
}

공유 코드에서 이 인터페이스에 대한 코딩을 하면 Xamarin.Forms 앱에서 각 플랫폼의 디바이스 방향 API에 액세스할 수 있습니다.Coding against this interface in the shared code will allow the Xamarin.Forms app to access the device orientation APIs on each platform.

참고

인터페이스를 구현하는 클래스에는 DependencyService를 사용하려면 매개 변수가 없는 생성자가 있어야 합니다.Classes implementing the interface must have a parameterless constructor to work with the DependencyService.

iOS 구현iOS Implementation

각 플랫폼별 애플리케이션 프로젝트에서 인터페이스를 구현해야 합니다.The Interface must be implemented in each platform-specific application project. 클래스에는 매개 변수가 없는 생성자가 있으므로 DependencyService가 새 인스턴스를 만들 수 있습니다.Note that the class has a parameterless constructor so that the DependencyService can create new instances:

using UIKit;
using Foundation;

namespace DependencyServiceSample.iOS
{
    public class DeviceOrientationImplementation : IDeviceOrientation
    {
        public DeviceOrientationImplementation(){ }

        public DeviceOrientations GetOrientation()
        {
            var currentOrientation = UIApplication.SharedApplication.StatusBarOrientation;
            bool isPortrait = currentOrientation == UIInterfaceOrientation.Portrait
                || currentOrientation == UIInterfaceOrientation.PortraitUpsideDown;

            return isPortrait ? DeviceOrientations.Portrait: DeviceOrientations.Landscape;
        }
    }
}

마지막으로 필요한 모든 using 문을 포함하여 클래스에 대해(및 정의된 모든 네임스페이스 외부에서) [assembly] 특성을 추가합니다.Finally, add this [assembly] attribute above the class (and outside any namespaces that have been defined), including any required using statements:

using UIKit;
using Foundation;
using DependencyServiceSample.iOS; //enables registration outside of namespace

[assembly: Xamarin.Forms.Dependency (typeof (DeviceOrientationImplementation))]
namespace DependencyServiceSample.iOS {
    ...

이 특성은 해당 클래스를 IDeviceOrientation 인터페이스의 구현으로 등록합니다. 즉, 공유 코드에서 DependencyService.Get<IDeviceOrientation>을 사용하여 해당 인스턴스를 만들 수 있습니다.This attribute registers the class as an implementation of the IDeviceOrientation Interface, which means that DependencyService.Get<IDeviceOrientation> can be used in the shared code to create an instance of it.

Android 구현Android Implementation

다음 코드는 Android에서 IDeviceOrientation을 구현합니다.The following code implements IDeviceOrientation on Android:

using DependencyServiceSample.Droid;
using Android.Hardware;

namespace DependencyServiceSample.Droid
{
    public class DeviceOrientationImplementation : IDeviceOrientation
    {
        public DeviceOrientationImplementation() { }

        public static void Init() { }

        public DeviceOrientations GetOrientation()
        {
            IWindowManager windowManager = Android.App.Application.Context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();

            var rotation = windowManager.DefaultDisplay.Rotation;
            bool isLandscape = rotation == SurfaceOrientation.Rotation90 || rotation == SurfaceOrientation.Rotation270;
            return isLandscape ? DeviceOrientations.Landscape : DeviceOrientations.Portrait;
        }
    }
}

필요한 모든 using 문을 포함하여 클래스에 대해(및 정의된 모든 네이스페이스 외부에서) 이 [assembly] 특성을 추가합니다.Add this [assembly] attribute above the class (and outside any namespaces that have been defined), including any required using statements:

using DependencyServiceSample.Droid; //enables registration outside of namespace
using Android.Hardware;

[assembly: Xamarin.Forms.Dependency (typeof (DeviceOrientationImplementation))]
namespace DependencyServiceSample.Droid {
    ...

이 특성은 해당 클래스를 IDeviceOrientaiton 인터페이스의 구현으로 등록합니다. 즉, 공유 코드에서 DependencyService.Get<IDeviceOrientation>을 사용하여 해당 인스턴스를 만들 수 있습니다.This attribute registers the class as an implementation of the IDeviceOrientaiton Interface, which means that DependencyService.Get<IDeviceOrientation> can be used in the shared code can create an instance of it.

유니버설 Windows 플랫폼 구현Universal Windows Platform Implementation

다음 코드는 유니버설 Windows 플랫폼에서 IDeviceOrientation 인터페이스를 구현합니다.The following code implements the IDeviceOrientation interface on the Universal Windows Platform:

namespace DependencyServiceSample.WindowsPhone
{
    public class DeviceOrientationImplementation : IDeviceOrientation
    {
        public DeviceOrientationImplementation() { }

        public DeviceOrientations GetOrientation()
        {
            var orientation = Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().Orientation;
            if (orientation == Windows.UI.ViewManagement.ApplicationViewOrientation.Landscape) {
                return DeviceOrientations.Landscape;
            }
            else {
                return DeviceOrientations.Portrait;
            }
        }
    }
}

필요한 모든 using 문을 포함하여 클래스에 대해(및 정의된 모든 네임스페이스 외부에서) [assembly] 특성을 추가합니다.Add the [assembly] attribute above the class (and outside any namespaces that have been defined), including any required using statements:

using DependencyServiceSample.WindowsPhone; //enables registration outside of namespace

[assembly: Dependency(typeof(DeviceOrientationImplementation))]
namespace DependencyServiceSample.WindowsPhone {
    ...

이 특성은 해당 클래스를 DeviceOrientationImplementation 인터페이스의 구현으로 등록합니다. 즉, 공유 코드에서 DependencyService.Get<IDeviceOrientation>을 사용하여 해당 인스턴스를 만들 수 있습니다.This attribute registers the class as an implementation of the DeviceOrientationImplementation Interface, which means that DependencyService.Get<IDeviceOrientation> can be used in the shared code can create an instance of it.

공유 코드에서의 구현Implementing in Shared Code

이제 IDeviceOrientation 인터페이스에 액세스하는 공유 코드를 작성하고 테스트할 수 있습니다.Now we can write and test shared code that accesses the IDeviceOrientation interface. 이 간단한 페이지에는 디바이스 방향에 따라 고유의 텍스트를 업데이트하는 단추가 포함됩니다.This simple page includes a button that updates its own text based on the device orientation. 이 페이지는 DependencyService를 사용하여 IDeviceOrientation 인터페이스의 인스턴스를 가져옵니다 – 런타임 시 이 인스턴스는 기본 SDK에 대한 모든 액세스 권한이 있는 플랫폼별 구현이 됩니다.It uses the DependencyService to get an instance of the IDeviceOrientation interface – at runtime this instance will be the platform-specific implementation that has full access to the native SDK:

public MainPage ()
{
    var orient = new Button {
        Text = "Get Orientation",
        VerticalOptions = LayoutOptions.CenterAndExpand,
        HorizontalOptions = LayoutOptions.CenterAndExpand,
    };
    orient.Clicked += (sender, e) => {
       var orientation = DependencyService.Get<IDeviceOrientation>().GetOrientation();
       switch(orientation){
           case DeviceOrientations.Undefined:
                orient.Text = "Undefined";
                break;
           case DeviceOrientations.Landscape:
                orient.Text = "Landscape";
                break;
           case DeviceOrientations.Portrait:
                orient.Text = "Portrait";
                break;
       }
    };
    Content = orient;
}

iOS, Android 또는 Windows 플랫폼에서 이 애플리케이션을 실행하고 단추를 누르면 단추의 텍스트가 디바이스 방향으로 업데이트됩니다.Running this application on iOS, Android, or the Windows platforms and pressing the button will result in the button's text updating with the device's orientation.