답변:
[[UIScreen mainScreen] bounds]
특정 API가없는 것처럼 높이를 확인 해야하는 것처럼 보입니다. iOS 8부터는 화면 크기를 수직 또는 수평으로 추상화하거나 UI를 조정하는 것이 권장되는 크기 클래스가 있습니다.iPhone 4S 이하용으로 제작 된 앱이 있다면 iPhone 5에서 레터 박스로 실행됩니다.
더 큰 화면에 앱을 적용하려면 먼저 시작 이미지를 Default-568h@2x.png로 변경해야합니다. 크기는 1136x640 (HxW)이어야합니다. 그러나 새로운 화면 크기의 기본 이미지를 갖는 것이 앱이 새로운 iPhone 5의 화면 전체를 차지하게하는 열쇠 입니다.
이름 지정 규칙은 기본 이미지에만 적용됩니다. 다른 이미지의 이름을 "Image-568h@2x.png"로 지정하면 "Image@2x.png"대신로드되지 않습니다. 다른 이미지를로드해야하는 경우 화면 크기가 다른 경우 프로그래밍 방식으로 수행해야합니다.)
매우 운이 좋으면 그럴 수도 있지만, 아마도 몇 가지 단계를 더 거쳐야 할 것입니다.
극단적 인 경우 (위의 어느 것도 충분하지 않은 경우), 두 Xibs를 설계하고 뷰 컨트롤러에 적절한 Xibs를로드하십시오.
화면 크기를 감지하려면
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
CGSize result = [[UIScreen mainScreen] bounds].size;
if(result.height == 480)
{
// iPhone Classic
}
if(result.height == 568)
{
// iPhone 5
}
}
실제로 필요한 것은 앱 리소스에 "Default-568h@2x.png"라는 시작 이미지를 추가하는 것입니다. 일반적으로 운이 좋으면 앱이 올바르게 작동합니다.
앱이 터치 이벤트를 처리하지 않는 경우 키 창의 크기가 올바른지 확인하십시오. 해결 방법은 올바른 프레임을 설정하는 것입니다.
[window setFrame:[[UIScreen mainScreen] bounds]]
iOS 6으로 마이그레이션 할 때 화면 크기와 관련이없는 다른 문제가 있습니다 . 자세한 내용은 iOS 6.0 릴리스 정보 를 읽으십시오 .
때로는 (사전 스토리 보드 응용 프로그램의 경우) 레이아웃이 충분히 다른 경우 장치에 따라 다른 xib를 지정하는 것이 좋습니다 ( 이 질문 참조 -iPhone 5를 처리하기 위해 코드를 수정해야합니다). 다른 크기의 그래픽이 필요한 경우 자동 크기 조정 마스크를 사용하는 twiddling이 작동하지 않으므로 init.
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
NSString *myNibName;
if ([MyDeviceInfoUtility isiPhone5]) myNibName = @"MyNibIP5";
else myNibName = @"MyNib";
if ((self = [super initWithNibName:myNibName bundle:nibBundleOrNil])) {
...
이전 iOS 버전을 대상으로하는 앱에 유용합니다.
여기서 훌륭한 자습서를 찾을 수 있습니다 (MonoTouch의 경우 비 MonoTouch 프로젝트에 대한 정보도 사용할 수 있음).
http://redth.info/get-your-monotouch-apps-ready-for-iphone-5 -ios-6- 오늘 /
이름이 " Default-568h@2x.png "인 스플래시 / 기본 화면 ( 640 x 1136 픽셀 ) 의 새 이미지를 만듭니다.
에서 iOS 시뮬레이터 "> 장치 메뉴를 선택 - 하드웨어로 이동 아이폰 (망막 4 인치) "
배경 이미지와 같은 다른 이미지 만들기
public static bool IsTall
{
get {
return UIDevice.currentDevice.userInterfaceIdiom
== UIUserInterfaceIdiomPhone
&& UIScreen.mainScreen.bounds.size.height
* UIScreen.mainScreen.scale >= 1136;
}
}
private static string tallMagic = "-568h@2x";
public static UIImage FromBundle16x9(string path)
{
//adopt the -568h@2x naming convention
if(IsTall())
{
var imagePath = Path.GetDirectoryName(path.ToString());
var imageFile = Path.GetFileNameWithoutExtension(path.ToString());
var imageExt = Path.GetExtension(path.ToString());
imageFile = imageFile + tallMagic + imageExt;
return UIImage.FromFile(Path.Combine(imagePath,imageFile));
}
else
{
return UIImage.FromBundle(path.ToString());
}
}
XIB를 통해 iPhone5 및 iPhone4를 쉽게 마이그레이션 할 수 있습니다 .........
UIViewController *viewController3;
if ([[UIScreen mainScreen] bounds].size.height == 568)
{
UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone5screen" bundle:nil] autorelease];
}
else
{
UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone4screen" bundle:nil] autorelease];
}
모든 경우에 작동하지는 않지만 내 특정 프로젝트에서는 NIB 파일을 복제하지 않아도됩니다.
어딘가에서 common.h
화면 높이를 기준으로 다음을 정의 할 수 있습니다.
#define HEIGHT_IPHONE_5 568
#define IS_IPHONE ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 ([[UIScreen mainScreen] bounds ].size.height == HEIGHT_IPHONE_5)
기본 컨트롤러에서 :
- (void)viewDidLoad
{
[super viewDidLoad];
if (IS_IPHONE_5) {
CGRect r = self.view.frame;
r.size.height = HEIGHT_IPHONE_5 - 20;
self.view.frame = r;
}
// now the view is stretched properly and not pushed to the bottom
// it is pushed to the top instead...
// other code goes here...
}
A의 constants.h
파일 이러한 명령문을 정의 추가 할 수 있습니다 :
#define IS_IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
#define IS_IPHONE UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone
#define IS_WIDESCREEN (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)568) < DBL_EPSILON)
#define IS_IPHONE_5 (!IS_IPAD && IS_WIDESCREEN)
앱에서 iPhone 5 Retina를 지원할 수 있는지 확인하려면 다음을 사용하십시오. 예 혹은 아니오)
일반적인 ".h"파일에서 다음을 추가하십시오.
BOOL IS_IPHONE5_RETINA(void);
일반적인 ".m"파일에서 다음을 추가하십시오.
BOOL IS_IPHONE5_RETINA(void) {
BOOL isiPhone5Retina = NO;
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
if ([UIScreen mainScreen].scale == 2.0f) {
CGSize result = [[UIScreen mainScreen] bounds].size;
CGFloat scale = [UIScreen mainScreen].scale;
result = CGSizeMake(result.width * scale, result.height * scale);
if(result.height == 960){
//NSLog(@"iPhone 4, 4s Retina Resolution");
}
if(result.height == 1136){
//NSLog(@"iPhone 5 Resolution");
isiPhone5Retina = YES;
}
} else {
//NSLog(@"iPhone Standard Resolution");
}
}
return isiPhone5Retina;
}
우선 두 개의 xib를 만들고 모든 델리게이트를 메인 클래스에 첨부 xib
한 다음 아래에 언급 된이 조건을 appdelegate.m
파일에 넣을 수 있습니다
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
if ([[UIScreen mainScreen] bounds].size.height == 568)
{
self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone5" bundle:nil];
}
else
{
self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone4" bundle:nil];
}
ViewController
수업 에서도 요구 사항에 따라 프로그램의 어느 곳에서나 사용할 수 있습니다 . 가장 중요한 것은 두 개의 xib
파일을 별도로 만들었습니다.iphone 4(320*480) and iphone 5(320*568)
싱글 톤 클래스에서 아래 방법을 시도하십시오.
-(NSString *)typeOfDevice
{
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
CGSize result = [[UIScreen mainScreen] bounds].size;
if(result.height == 480)
{
return @"Iphone";
}
if(result.height == 568)
{
return @"Iphone 5";
}
}
else{
return @"Ipad";;
}
return @"Iphone";
}
검사 bounds
와568
가로 모드에서 실패합니다. iPhone 5는 세로 모드에서만 실행되지만 회전을 지원하려면 iPhone 5 "확인"도이 시나리오를 처리해야합니다.
방향 상태를 처리하는 매크로는 다음과 같습니다.
#define IS_IPHONE_5 (CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size, CGSizeMake(640, 1136)))
'preferredMode'호출의 사용은 몇 시간 전에 읽은 다른 게시물에서 왔 으므로이 아이디어를 얻지 못했습니다.
Peter, 당신은 Canappi를 정말로 살펴 봐야합니다. 그것은 당신을 위해 모든 것을합니다.
button mySubmitButton 'Sumbit' (100,100,100,30 + 0,88,0,0) { ... }
거기에서 Canappi는 앱이 실행되는 장치를 감지하고 다음을 사용할 올바른 objective-c 코드를 생성합니다.
(100,100,100,30) for iPhone4
(100,**188**,100,30) for iPhone 5
Canappi는 텍스트 형식 인 것을 제외하고 Interface Builder 및 Story Board와 같이 작동합니다. XIB 파일이 이미있는 경우 전체 UI를 처음부터 다시 만들 필요가 없도록 변환 할 수 있습니다.
이 코드를 추가 할 수 있습니다 :
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) {
CGSize result = [[UIScreen mainScreen] bounds].size;
CGFloat scale = [UIScreen mainScreen].scale;
result = CGSizeMake(result.width * scale, result.height * scale);
if(result.height == 960) {
NSLog(@"iPhone 4 Resolution");
}
if(result.height == 1136) {
NSLog(@"iPhone 5 Resolution");
}
}
else{
NSLog(@"Standard Resolution");
}
}
scale
선택기에 응답합니다 .UIScreen
"표준 해상도"코드가 실행되지 않는 경우가 있습니다.
이것은 실제 범용 코드이며 3 가지 스토리 보드를 만들 수 있습니다.
프로젝트 유니버설 모드를 설정하고 iPhone 5 스토리 보드 및 iPad 대상 스토리 보드가있는 ipad 메인으로 iPhone의 메인 스토리를 설정하십시오. 이제 iphone 용 새 스토리 보드 대상을 추가하고 iphone 4s 이하의 해상도를 수정하십시오 .AppDelegate.m
iPhone4 / 4s (3 / 3G와 동일) iPhone5 용으로, iPad 용 새 Storyboard 대상을 사용하여 이제이 코드를 추가 하여 AppDelegate.m 에 프로젝트를 보편적으로 만듭니다 .didFinishLaunching
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
UIStoryboard *storyBoard;
CGSize result = [[UIScreen mainScreen] bounds].size;
CGFloat scale = [UIScreen mainScreen].scale;
result = CGSizeMake(result.width *scale, result.height *scale);
//----------------HERE WE SETUP FOR IPHONE4/4s/iPod----------------------
if(result.height == 960){
storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil];
UIViewController *initViewController = [storyBoard instantiateInitialViewController];
[self.window setRootViewController:initViewController];
}
//----------------HERE WE SETUP FOR IPHONE3/3s/iPod----------------------
if(result.height == 480){
storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil];
UIViewController *initViewController = [storyBoard instantiateInitialViewController];
[self.window setRootViewController:initViewController];
}
}
return YES;
}
따라서 iPhone 3 / 3Gs / 4 / 4s / 5의 모든 세대 iPod 및 모든 유형의 iPad 용 범용 앱을 만들었습니다.
모든 IMG를 myImage.png
하고myImage@2x.png
나에 따르면 이러한 문제를 해결하고 장치 높이를 확인하는 데 필요한 몇 가지 조건을 피하는 가장 좋은 방법은 뷰에 상대 프레임을 사용하거나 뷰에 추가하는 UI 요소를 사용하는 것입니다. 원하는 UI 요소는보기의 맨 아래 또는 탭 막대 바로 위에 있어야합니다.보기의 높이 또는 탭 막대 (있는 경우)와 관련하여 y 원점을 취해야하며 자동 크기 조정 속성도 있습니다. 나는 이것이 당신을 위해 작동하기를 바랍니다
조건 세트를 사용하는 대신 화면 크기를 사용하여보기의 크기를 자동으로 조정할 수 있습니다.
int h = [[UIScreen mainScreen] bounds].size.height;
int w = [[UIScreen mainScreen] bounds].size.width;
self.imageView.frame = CGRectMake(20, 80, (h-200), (w-100));
필자의 경우 상단의 일부 입력 필드와 하단의 일부 버튼 사이의 공간을 채우는 뷰를 원하므로 화면 크기에 따라 왼쪽 상단 모서리가 고정되고 오른쪽 하단이 가변적입니다. 내 응용 프로그램은 카메라로 찍은 사진으로 이미지보기를 채우므로 얻을 수있는 모든 공간을 원합니다.
iOS 기기와 iOS 시뮬레이터 모두에서 테스트 할 때 약간의 문제가 있습니다. 시뮬레이터 (XCode 6.0.1)는 [[UIScreen mainScreen] bounds].size
장치 방향 에 따라 너비와 높이에 대한 값을 전환 한 것으로 보입니다 .
따라서 올바른 실제 화면 크기를 결정할 때 문제가 될 수 있습니다. 이 코드는 또한 모든 2014 년을 구별하는 데 도움이됩니다. iPhone 모델 세대 :
예를 들어 iPhone6 +의 iPhone6을 구별하기 위해 쉽게 변경할 수도 있습니다.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone)
{
if (iOSDeviceScreenSize.width > 568 || // for iOS devices
iOSDeviceScreenSize.height > 568) // for iOS simulator
{ // iPhone 6 and iPhone 6+
// Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone6
storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone6" bundle:nil];
NSLog(@"loaded iPhone6 Storyboard");
}
else if (iOSDeviceScreenSize.width == 568 || // for iOS devices
iOSDeviceScreenSize.height == 568) // for iOS simulator
{ // iPhone 5 and iPod Touch 5th generation: 4 inch screen (diagonally measured)
// Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone5
storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone5" bundle:nil];
NSLog(@"loaded iPhone5 Storyboard");
}
else
{ // iPhone 3GS, 4, and 4S and iPod Touch 3rd and 4th generation: 3.5 inch screen (diagonally measured)
// Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone4
storyboard = [UIStoryboard story boardWithName:@"MainStoryboard_iPhone" bundle:nil];
NSLog(@"loaded iPhone4 Storyboard");
}
}
else if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
{ // The iOS device = iPad
storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPadnew" bundle:nil];
NSLog(@"loaded iPad Storyboard");
}
// rest my code
}