iOS 6 앱-iPhone 5 화면 크기를 처리하는 방법은 무엇입니까? [복제]
iPhone 5의 더 큰 화면 크기를 어떻게 처리해야하는지 궁금했습니다.
높이가 더 많기 때문에 좌표를 사용하는 GCRectMake와 같은 (그리고 망막 / 비 망막 문제로 픽셀을 두 배로 늘린) 것들은 Retina를 얻었을 때처럼 버전간에 완벽하게 작동하지 않습니다 .
그리고 iPad처럼 스토리 보드 두 개를 디자인해야합니까?
나는 개인적으로 애플이 많은 답변에서 말하는 것처럼 무언가를 그릴 때마다 화면 크기를 확인하도록 요구하지 않는다고 생각합니다. 아이 패드에서도 그런가요?
모든 앱은 오늘 프레젠테이션에서 말할 수있는 수직 확장 화면에서 계속 작동합니다. 그것들은 레터 박스가되거나 기본적으로 88 포인트의 높이는 단순히 검은 색이됩니다.
iOS 6 이상 만 지원하려는 경우 자동 레이아웃 사용을 고려하십시오. 고정 레이아웃 처리를 모두 제거하고 대신 제약 조건을 사용하여 배치합니다. 어떤 것도 하드 코딩되지 않으며 인생은 훨씬 간단해질 것입니다.
그러나 이전 iOS를 지원 해야하는 경우 실제로 응용 프로그램에 따라 다릅니다. 표준 탐색 표시 줄 및 / 또는 탭 표시 줄을 사용하는 대부분의 응용 프로그램은 중간에있는 내용을 확장하여 해당 추가 지점을 사용할 수 있습니다. 중앙 내용의 자동 크기 조정 마스크를 양방향으로 확장하도록 설정하십시오.
view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
테이블 뷰의 경우 즉시 사용할 수 있지만 앱에서 내용을 표시하기 위해 완벽한 픽셀 레이아웃을 사용한 경우 다양한 높이를 수용 할 수 있도록 내용을 다시 상상하는 것이 가장 좋습니다.
그럴 가능성이 없다면, 유일하게 남아있는 옵션은 두 가지 UI (pre iPhone 5 및 iPhone 5)를 갖는 것입니다.
그 소리가 나쁘면 추가 포인트 / 픽셀이 검은 색으로 표시되는 기본 레터 박스 모델을 사용할 수 있습니다.
편집하다
앱이 iPhone 5에서 작동하게하려면 망막 버전의 런처 이미지를 추가해야합니다. 이름을 지정해야합니다 Default-568h@2x.png
. 그리고 그것은 망막 품질이어야합니다-이전 버전과의 호환성은 없습니다 :)
Xcode 내에서이 이미지를 선택할 수도 있습니다. 대상으로 이동 한 후 요약 섹션에서 실행 이미지를 찾으십시오. 이미지 크기는 640x1136 픽셀이어야합니다. 도움이 될 수있는 곳의 스크린 샷은 다음과 같습니다.
640x1136 픽셀 PNG 이미지 ( Default-568h@2x.png
)를 프로젝트의 4 인치 기본 스플래시 이미지 로 추가해야하며 추가 공간이 필요합니다 (간단한 테이블 기반 응용 프로그램에 대한 노력없이 게임에 더 많은 노력이 필요함).
모든 화면 해상도를 처리하기 위해 작은 UIDevice 범주를 만들었습니다. 당신은 할 수 있습니다 여기에 그것을 얻을 다음과 같이하지만, 코드는 다음과 같습니다
파일 UIDevice + Resolutions.h :
enum {
UIDeviceResolution_Unknown = 0,
UIDeviceResolution_iPhoneStandard = 1, // iPhone 1,3,3GS Standard Display (320x480px)
UIDeviceResolution_iPhoneRetina4 = 2, // iPhone 4,4S Retina Display 3.5" (640x960px)
UIDeviceResolution_iPhoneRetina5 = 3, // iPhone 5 Retina Display 4" (640x1136px)
UIDeviceResolution_iPadStandard = 4, // iPad 1,2,mini Standard Display (1024x768px)
UIDeviceResolution_iPadRetina = 5 // iPad 3 Retina Display (2048x1536px)
}; typedef NSUInteger UIDeviceResolution;
@interface UIDevice (Resolutions)
- (UIDeviceResolution)resolution;
NSString *NSStringFromResolution(UIDeviceResolution resolution);
@end
파일 UIDevice + Resolutions.m :
#import "UIDevice+Resolutions.h"
@implementation UIDevice (Resolutions)
- (UIDeviceResolution)resolution
{
UIDeviceResolution resolution = UIDeviceResolution_Unknown;
UIScreen *mainScreen = [UIScreen mainScreen];
CGFloat scale = ([mainScreen respondsToSelector:@selector(scale)] ? mainScreen.scale : 1.0f);
CGFloat pixelHeight = (CGRectGetHeight(mainScreen.bounds) * scale);
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
if (scale == 2.0f) {
if (pixelHeight == 960.0f)
resolution = UIDeviceResolution_iPhoneRetina4;
else if (pixelHeight == 1136.0f)
resolution = UIDeviceResolution_iPhoneRetina5;
} else if (scale == 1.0f && pixelHeight == 480.0f)
resolution = UIDeviceResolution_iPhoneStandard;
} else {
if (scale == 2.0f && pixelHeight == 2048.0f) {
resolution = UIDeviceResolution_iPadRetina;
} else if (scale == 1.0f && pixelHeight == 1024.0f) {
resolution = UIDeviceResolution_iPadStandard;
}
}
return resolution;
}
@end
이 코드를 사용해야하는 방법입니다.
1) 위의 UIDevice + Resolutions.h 및 UIDevice + Resolutions.m 파일을 프로젝트에 추가하십시오.
2) #import "UIDevice + Resolutions.h"라인을 ViewController.m에 추가하십시오
3)이 코드를 추가하여 처리중인 장치 버전을 확인하십시오.
int valueDevice = [[UIDevice currentDevice] resolution];
NSLog(@"valueDevice: %d ...", valueDevice);
if (valueDevice == 0)
{
//unknow device - you got me!
}
else if (valueDevice == 1)
{
//standard iphone 3GS and lower
}
else if (valueDevice == 2)
{
//iphone 4 & 4S
}
else if (valueDevice == 3)
{
//iphone 5
}
else if (valueDevice == 4)
{
//ipad 2
}
else if (valueDevice == 5)
{
//ipad 3 - retina display
}
방금 내 앱 중 하나의 iOS 6.0 버전을 업데이트하여 상점에 보냈습니다. 이 버전은 iOS 5.0과 역 호환되므로이 shouldAutorotateToInterfaceOrientation:
방법을 유지하고 아래에 나열된 것처럼 새로운 방법을 추가했습니다.
나는 다음을 수행해야했다.
iOS 6에서는 자동 회전이 변경되고 있습니다. iOS 6에서는 shouldAutorotateToInterfaceOrientation:
UIViewController 메서드가 사용되지 않습니다. 대신 supportedInterfaceOrientationsForWindow:
and shouldAutorotate
메소드를 사용해야합니다 . 따라서이 새로운 방법을 추가했습니다 (그리고 오래된 iOS 5 호환성을 유지했습니다).
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
- 뷰 컨트롤러의
viewWillLayoutSubviews
방법을 사용하고 뷰의 경계 사각형을 사용하여 레이아웃을 조정합니다. - 모달 뷰 컨트롤러 :
willRotateToInterfaceOrientation:duration:
,
willAnimateRotationToInterfaceOrientation:duration:
및
didRotateFromInterfaceOrientation:
방법은 더 이상 뷰 컨트롤러에 호출 을 통해 전체 화면 프리젠 테이션을 만드는
자체가 예를 위해 본,presentViewController:animated:completion:
. - 그런 다음 필요한 레이아웃의 자동 레이아웃을 수정했습니다.
- 시작하기 위해 시뮬레이터에서 복사 한 이미지와 iTunes Store의보기를 PhotoShop으로 복사하여 png 파일로 내보냈습니다.
- 기본 이미지의 이름은 다음
Default-568h@2x.png
과 같습니다. 크기는 640 × 1136입니다. 또한 동일한 세로 모드 (상태 표시 줄 제거)에 640 × 1096을 공급할 수 있습니다. 앱에서 iPhone의 가로 방향 만 허용하는 경우 가로 모드에서도 비슷한 크기가 제공 될 수 있습니다. - iOS 4와의 호환성을 떨어 뜨 렸습니다. 주된 이유는
armv6
코드 지원 이 중단 되었기 때문 입니다. 따라서 현재 지원하는 모든 장치 (armv7
)를 iOS 5로 업그레이드 할 수 있습니다. - 또한 iPhone 5를 지원하기 위해 armv7s 코드를 생성하므로 업데이트 될 때까지 타사 프레임 워크 (Admob 등)를 사용할 수 없습니다.
회전의 변화로 인해 iOS 5 및 iOS 6에서 자동 회전을 테스트하는 것을 잊지 마십시오.
아니.
if ([[UIScreen mainScreen] bounds].size.height > 960)
iPhone 5에서 잘못되었습니다
if ([[UIScreen mainScreen] bounds].size.height == 568)
@interface UIDevice (Screen)
typedef enum
{
iPhone = 1 << 1,
iPhoneRetina = 1 << 2,
iPhone5 = 1 << 3,
iPad = 1 << 4,
iPadRetina = 1 << 5
} DeviceType;
+ (DeviceType)deviceType;
@end
.미디엄
#import "UIDevice+Screen.h"
@implementation UIDevice (Screen)
+ (DeviceType)deviceType
{
DeviceType thisDevice = 0;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
{
thisDevice |= iPhone;
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
{
thisDevice |= iPhoneRetina;
if ([[UIScreen mainScreen] bounds].size.height == 568)
thisDevice |= iPhone5;
}
}
else
{
thisDevice |= iPad;
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
thisDevice |= iPadRetina;
}
return thisDevice;
}
@end
이렇게하면 화면 크기에 관계없이 iPhone 또는 iPad인지 여부를 감지하려면 다음을 사용하십시오.
if ([UIDevice deviceType] & iPhone)
또는
if ([UIDevice deviceType] & iPad)
iPhone 5 만 감지하려면
if ([UIDevice deviceType] & iPhone5)
Malcoms가 iPhone인지 확인하기 위해 확인 해야하는 곳과는 달리,
if ([UIDevice currentResolution] == UIDevice_iPhoneHiRes ||
[UIDevice currentResolution] == UIDevice_iPhoneStandardRes ||
[UIDevice currentResolution] == UIDevice_iPhoneTallerHiRes)`
어느 쪽도 서로에 비해 큰 이점이 없으며 개인 취향 일뿐입니다.
OP의 질문에 대한 @Pascal의 의견은 맞습니다. 단순히 이미지를 추가하면 검은 색 테두리가 제거되고 앱은 전체 높이를 사용합니다.
장치가 더 큰 디스플레이를 사용하고 있는지 확인하여 CGRect를 조정해야합니다. 즉, 화면 하단에 정렬 된 것이 필요합니다.
나는 내장 된 방법이 있다고 확신하지만 아무것도 보지 못했고 NDA에 여전히 많은 것들이 있으므로 앱에서 사용하는 방법은 단순히 전역 함수입니다. .pch 파일에 다음을 추가 한 다음 if( is4InchRetina() ) { ... }
CGRects 등을 조정하기 위한 간단한 호출을 추가하십시오.
static BOOL is4InchRetina()
{
if (![UIApplication sharedApplication].statusBarHidden && (int)[[UIScreen mainScreen] applicationFrame].size.height == 548 || [UIApplication sharedApplication].statusBarHidden && (int)[[UIScreen mainScreen] applicationFrame].size.height == 568)
return YES;
return NO;
}
[UIScreen mainScreen].bounds.size.height
객체에 대한 단계를 사용 하고 계산할 수 있다고 생각 합니다. 단계를 계산할 때 두 해상도에 대한 좌표를 설정할 수 있습니다.
또는 위와 같은 높이를 얻을 수 있습니다 if(iphone5) then... else if(iphone4) then... else if(ipad)
. 이 같은.
스토리 보드를 사용한다면 새로운 iPhone을 위해 새로운 것을 만들어야한다고 생각합니다.
높이가 더 많기 때문에 좌표를 사용하는 GCRectMake와 같은 것은 Retina를 얻었을 때처럼 버전간에 완벽하게 작동하지 않습니다.
글쎄, 그들은 할 수 는있는 CoreGraphics 1 개 단위는 시스템이 물리적 인 픽셀에 해당됩니다 좌표 그냥,하지만 당신은하지 / 아무것도 할 필요가 없었어요, 논리는 같은 체재 않습니다 - 레티 나 디스플레이와 함께 작업을 동일. (실제로 레티 나 아이폰에서 비레 티나 앱 중 하나를 실행하려고 했습니까 ? )
실제 질문 : 그래서 당신이 명시 적 CGRectMakes와 공동을 사용해서는 안되는 이유 [[UIScreen mainScreen] applicationFrame]
입니다.
참고 URL : https://stackoverflow.com/questions/12396545/ios-6-apps-how-to-deal-with-iphone-5-screen-size
'IT' 카테고리의 다른 글
소셜 활동 스트림을 구현하는 가장 좋은 방법은 무엇입니까? (0) | 2020.03.29 |
---|---|
XML 스키마 (XSD) 유효성 검사 도구? (0) | 2020.03.29 |
IntelliJ IDEA에서 Eclipse의 Ctrl + O (Show Outline) 단축키는 무엇입니까? (0) | 2020.03.29 |
정적이 아닌 변수는 정적 컨텍스트에서 참조 할 수 없습니다 (0) | 2020.03.29 |
* args와 ** kwargs는 무엇을 의미합니까? (0) | 2020.03.29 |