回答:
[[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」の代わりに読み込まれることはありません。別の画像を読み込む必要がある場合異なる画面サイズの場合は、プログラムで行う必要があります。)
非常に運が良ければそれでいいかもしれませんが、おそらくもう少し手順を踏む必要があります。
極端な場合(上記のいずれでも不十分な場合)には、2つのXibを設計し、適切なXibをView Controllerにロードします。
画面サイズを検出するには:
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リリースノートをお読みください。
ときどき(ストーリーボードアプリの場合)、レイアウトが十分に異なる場合は、viewControllerでデバイスに応じて異なるxibを指定する価値があります(この質問を参照してください-iPhone 5を処理するためにコードを変更する必要があります)。 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-today /
「Default-568h@2x.png」 という名前で、スプラッシュ/デフォルト画面の新しい画像(640 x 1136ピクセル)を作成します
ではiOSシミュレータ「> Deviceメニュー、及び選択- 、ハードウェアにアクセスしてくださいiPhone(網膜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...
}
で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をサポートできるかどうかを判断するには、これを使用します(これは、ディスプレイのタイプ、4S Retinaなどを返す方がより堅牢である可能性がありますが、以下に記載されているように、iPhoneがiOS5 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;
}
まず最初に2つの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
クラス内でも、要件に応じて、プログラム内の任意の場所で使用できます。最も重要なことは、2つの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」呼び出しの使用は、数時間前に読んだ別の投稿からのものであるため、このアイデアは思いつきませんでした。
最初にこの画像を表示します。その画像では、Retina 4サポートの警告が表示されているので、この警告をクリックして[追加]をクリックすると、Retina 4スプラッシュスクリーンがプロジェクトに自動的に追加されます。
そしてこのコードを使用した後:
if([[UIScreen mainScreen] bounds].size.height == 568)
{
// For iphone 5
}
else
{
// For iphone 4 or less
}
ハードコードされた値がなく、すべてに対して1つのコードベースを持っているので、どのデバイスでもこのような問題に直面したことはありません。デバイスごとに1つではなく、最大サイズのイメージをリソースとして使用するようにしています。たとえば、Retinaディスプレイ用に1つ用意し、アスペクトフィットとして表示すると、すべてのデバイスでそのままのビューになります。たとえば、実行時にボタンのフレームを決定することになります。これには、パテントビューの例の%値を使用します。たとえば、幅を親ビューの半分にしたい場合は、親の50%を取り、高さと中心にも同じことが適用されます。
これがあれば、xibsも必要ありません。
ピーター、カナッピを実際に見てみるべきです、それはあなたのためにすべてを行います、あなたがしなければならないすべてはそのようなレイアウトを指定することです:
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をiPhone5ストーリーボードに、iPadのメインをiPadターゲットストーリーボードに設定し、新しいストーリーボードターゲットをiphoneに追加し、iphone 4s以下の解像度を変更して、AppDelegate.mを実装します。
iPhone4 / 4s(3 / 3Gでも同じ)iPhone5用、プロジェクトをユニバーサルにして、新しいストーリーボードターゲットをiPad用にして、次のコードを追加して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));
私の場合、上部のいくつかの入力フィールドと下部のいくつかのボタンの間のスペースを埋めるビューが必要なので、画面サイズに基づいて左上隅と可変右下を修正しました。私のアプリは、カメラで撮影した写真を画像ビューに表示するため、取得できるすべてのスペースが必要です。
xCode 5を使用して、Project> Generalで「Migrate to Asset Catalog」を選択します。
次に、[ファインダーに表示]を使用して起動画像を見つけます。640x1136になるようにダミー編集してから、下の画像に示すようにアセットカタログにドラッグできます。
iOS7とiOS6 R4の両方のセクションに640x1136の画像があることを確認してください。次回アプリを起動すると、黒いバーが消え、アプリは4インチ画面を使用します
使用 Auto Layout
ビュー機能をします。すべての解像度に自動的に調整されます。
〜iphoneまたは〜ipadのいずれかのサフィックスが付いたコントローラー名を持つコントローラー用に2つのxibを作成します。コンパイル時に、Xcodeはデバイスに基づいて適切なxibを取得します。
iPhoneとiPadに移植できるようにビューがシンプルな場合は、iPhoneとiPadの両方で1つのxibを作成する場合は、サイズクラスを使用します。
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
}