iOS2012. 10. 9. 11:32


iPhone5와 iOS6가 나오면서 개발자들은 iPhone5의 더 길어진 스크린을 지원해야 한다. 이에 대해 잘 설명해 놓은 아래 사이트의 글을 정리하여 보았다.

http://redth.info/get-your-monotouch-apps-ready-for-iphone-5-ios-6-today/

새로운 해상도는 640x1136이다. 

1. splah/default screen의 이미지 파일의 네이밍은 Default-568h@2x.png이다. 사이즈는 640x1136 픽셀이어야 한다. 파일을 프로젝트에 추가하고 Build mode를 Content로 맞추어야 한다. 이 파일을 추가하지 않으면 위아래가 44픽셀씩 잘려서 표시되고 추가하는 순간 화면의 기준점이 구석으로 간다.



2. 다른 이미지리소스들은 불행하게도 -568h@2x.png라는 형식을 사용할 수 없다. 뷰에서 커스텀백그라운드 이미지를 사용한다면 해당 해상도에 맞는 이미지를 별도로 작성해야 하고 각 이미지를 사용하는 부분에서 적절히 구분하여 사용해야 한다.

예를 들어 4인치가 아닌 앱에서 다음 두개의 이미지가 있다고 하자.

 ㄱ. Images/TableViewBackground.png - 320x358

 ㄴ. Images/TableViewBackground@2x.png - 640-716

새로운 해상도에서는 3번째 이미지가 필요한데 여기서는 -568h@2x.png 형식을 사용하겠다(물론 애플에서는 싫어하겠지만)

 ㄷ. Images/TableViewBackground-568h@2x.png


3. 이제 iPhone5를 감지하여 새이미지를 사용하도록 코드를 수정해야 한다. 아래 iPhone5인지 감지해주는 샘플코드가 있다. 

  1. public static bool IsTall
  2. {
  3. get
  4. {
  5. return UIDevice.CurrentDevice.UserInterfaceIdiom
  6. == UIUserInterfaceIdiom.Phone
  7. && UIScreen.MainScreen.Bounds.Height
  8. * UIScreen.MainScreen.Scale >= 1136;
  9. }
  10. }

다음 코드는 IsTall을 이용하여 이미지를 단말을 구분하여 Image객체를 리턴해주는 코드 예이다.

  1. static UIImage tableViewBackgroundImage = null;
  2. public static UIImage TableViewBackgroundImage
  3. {
  4. get
  5. {
  6. if (tableViewBackgroundImage == null)
  7. tableViewBackgroundImage = IsTall
  8. ? UIImage.FromFile("Images/TableViewBackground-568h@2x.png")
  9. : UIImage.FromFile("Images/TableViewBackground.png");
  10. return tableViewBackgroundImage;
  11. }
  12. }

이 예제에서 single static instance를 통해서 여러 뷰컨트롤러에서 사용해도 인스턴스는 하나만 유지하도록 하였다.

다른 고려할 사항은 세로길이를 계산하는 로직이 있거나 뷰를 임의크기로 생성할때, 이런식의 코드를 작성해야 한다는 것이다. UIScreen.MainScreen.ApplicationFrame이나 UIScreen.MainScreen.Bounds를 길이나 Y좌표를 계산하는데 고려해야 한다.

다음코드는 좀더 쉽게 이미지를 얻어내는 코드예이다.

  1. private static string tallMagic = "-568h@2x";
  2. public static UIImage FromBundle16x9(string path)
  3. {
  4. //adopt the -568h@2x naming convention
  5. if(IsTall())
  6. {
  7. var imagePath = Path.GetDirectoryName(path.ToString());
  8. var imageFile = Path.GetFileNameWithoutExtension(path.ToString());
  9. var imageExt = Path.GetExtension(path.ToString());
  10. imageFile = imageFile + tallMagic + imageExt;
  11. return UIImage.FromFile(Path.Combine(imagePath,imageFile));
  12. }
  13. else
  14. {
  15. return UIImage.FromBundle(path.ToString());
  16. }
  17. }




Posted by 삼스