新しいiPhone 5ディスプレイは、新しいアスペクト比と新しい解像度(640 x 1136ピクセル)を持っています。
新規または既存のアプリケーションを新しい画面サイズに移行するために何が必要ですか。
古いディスプレイと新しいワイドスクリーンのアスペクト比の両方に対してアプリケーションを「普遍的」にするためには、何を覚えておくべきでしょうか。
[[UIScreen mainScreen] bounds]
の高さをチェックしなければならないようです。 iOS 8以降、画面サイズを縦または横に標準またはコンパクトに抽象化するサイズクラスもあり、UIを調整するのに推奨される方法です。iPhone 4S以前用に構築されたアプリをお持ちの場合、iPhone 5ではレターボックスで実行されます
あなたのアプリを新しいより背の高いスクリーンに適応させるために、あなたが最初にすることは起動画像を次のように変更することです:[email protected]。そのサイズは1136 x 640(H x W)です。 はい、デフォルトの画像を新しい画面サイズにすることが、アプリに新しいiPhone 5の画面全体を表示させるための鍵となります 。
(命名規則はデフォルトのイメージに対してのみ機能することに注意してください。別のイメージ "[email protected]"を命名しても "[email protected]"の代わりにそのイメージが読み込まれることはありません。異なる画面サイズに対して異なる画像を読み込むには、プログラムで実行する必要があります。)
あなたがとてもラッキーだったら、それかもしれない…でもおそらくあなたはもう少しステップを踏む必要があるだろう。
極端な場合(上記のどれでも足りない場合)は、2つの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
}
}
唯一必要なことは、 "[email protected]"という名前の起動画像をアプリのリソースに追加することです。一般的な場合(幸運なら)、アプリは正しく機能します。
アプリがタッチイベントを処理しない場合は、キーウィンドウのサイズが正しいことを確認してください。回避策は、適切なフレームを設定することです。
[window setFrame:[[UIScreen mainScreen] bounds]]
IOS 6に移行する際の画面サイズに関係のない他の問題があります。詳細については iOS 6.0リリースノート を参照してください。
レイアウトが十分に異なる場合は、(ストーリーボード以前のアプリケーションの場合)、デバイスに応じて異なるxibを指定することをお勧めします( この質問 - iPhone 5を扱うためにコードを修正する必要があります)。別のグラフィックが必要な場合は、自動サイズ変更マスクをいじって動かすことはできません。
-(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用ですが、あなたはNon-MonoTouch-projects用の情報も使うことができます):
http://redth.info/get-your-monotouch-apps-ready-for-iphone-5-ios-6-today/
「 [email protected] 」という名前で、スプラッシュ/デフォルト画面( 640 x 1136ピクセル )に新しい画像を作成します。
iOSシミュレータ で、[ハードウェア] - > [デバイス]メニューの[ iPhone(Retina 4-inch) ]を選択します。
他の画像を作成します。背景画像
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を介してiPhone 5とiPhone 4を移行するのは簡単です.........
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];
}
私はこの問題を解決します ここ 。画像に〜568h @ 2xサフィックスを追加し、xibに〜568hを追加するだけです。これ以上ランタイムチェックやコード変更は必要ありません。
私は新しいデフォルトの起動画像を追加し、(他のいくつかのSEの回答をチェックする際に...)自分のストーリーボードがすべて自動サイズ設定され、サブビューは表示されているのを確認しました。
それから、私のinfo plistに " Launch image "のラインアイテムが " Default.png "に設定されていたことに気づきました。うまくいけば、それは私が耐えた同じ狂気を他の誰かを救う。
アプリがiPhone 5 Retinaをサポートできるかどうかを判断するには、(これはディスプレイの種類、4S Retinaなどを返すほうが堅牢ですが、以下で説明するように、iPhoneがiOS 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;
}
constants.h
ファイルでは、これらのdefineステートメントを追加できます。
#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)
すべてのケースでうまくいくとは限らないと思いますが、私の特定のプロジェクトでは、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...
}
まず最初に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
クラスの中でさえもあなたの要求次第でプログラムのどこでもそれを使うことができます。最も重要なのは、iphone 4(320*480) and iphone 5(320*568)
用に別々の2つのxib
ファイルを作成したということです。
シングルトンクラスで以下のメソッドを試してください。
-(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'呼び出しの使用は、私が数時間前に読んだ別の投稿からのものなので、私はこのアイデアを思い付きませんでした。
Auto Layout
機能を使用してiPhone 5の画面解像度でデザインを作成すると、4インチと3.5インチの両方のデバイスで機能しますが、この場合はレイアウトマネージャに関する十分な知識が必要です。
ハードコードされた値がなくても、すべてのデバイスに1つのコードベースがあるため、どのデバイスでもこのような問題に直面することはありませんでした。私がしているのは、各デバイスに1つではなく、最大サイズのイメージをリソースとして使用することです。例えば、私は網膜ディスプレイ用のものを持っていて、それがアスペクトフィットとしてそれを示しているので、それはすべてのデバイス上にあるようなビューになるでしょう。例えば実行時にボタンのフレームを決定することになる。これには、パテントビューの%値を使用します。たとえば、幅を親ビューの半分にしたい場合は、親の50%を使用します。高さと中央にも同じことが適用されます。
これで私はxibさえも必要としません。
最初にこの画像を見せる。その画像では、Retina 4サポートに対する警告が表示されるので、この警告をクリックして[追加]をクリックすると、Retina 4スプラッシュスクリーンが自動的にプロジェクトに追加されます。
そして、あなたがこのコードを使った後:
if([[UIScreen mainScreen] bounds].size.height == 568)
{
// For iphone 5
}
else
{
// For iphone 4 or less
}
この定義を使用して、iPhone 5を使用しているかどうかを画面サイズに基づいて計算できます。
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
それから簡単なif
ステートメントを使います。
if (IS_IPHONE_5) {
// What ever changes
}
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全体を最初から作成し直す必要はありません。
画面サイズを手動で確認して、どのデバイスに接続しているかを判断できます。
#define DEVICE_IS_IPHONE5 ([[UIScreen mainScreen] bounds].size.height == 568)
float height = DEVICE_IS_IPHONE5?568:480;
if (height == 568) {
// 4"
} else {
// 3"
}
これは本当の普遍的なコードです、あなたは3つの異なるストーリーボードを作成することができます:
あなたのプロジェクトのユニバーサルモードを設定し、iPhone 5ストーリーボードとiPadターゲットストーリーボードを使用してメインメインストーリーiPhoneを設定します。今iphone用の新しいストーリーボードターゲットを追加し、iphone 4s以下の解像度を変更します AppDelegate.m
iPhone4/4s (3/3Gsでも同じ) iPhone5 そしてプロジェクトを作成する universal 、iPad用の新しいストーリーボードターゲットで、現在は AppDelegate.mdidFinishLaunching
name__の下に次のコードを追加します。
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
および[email protected]
と統合することを忘れないでください
このコードを追加することができます:
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");
}
}
私によると、このような問題に対処し、デバイスの高さをチェックするために必要ないくつかの条件を回避するための最良の方法は、ビューまたは追加するビューの相対フレームを使用することです。あなたが望むいくつかのUI要素はビューの一番下かタブバーのすぐ上にあるべきです、そしてあなたはあなたのビューの高さに関して、またはタブバーに関してy Originを取るべきです(もしあれば)、そして我々は同様に自動サイズ変更プロパティを持ちます。私はこれがあなたのために働くことを願っています
既存のアプリをユニバーサルに変換する必要がある場合は、対応するxibファイル - >ユーティリティの表示 - >サイズのインスペクタの表示を選択する必要があります。
サイズインスペクタでは、このツールを使用して既存のiOSアプリに変換することができ、自動サイズ調整を確認できます。
一連の条件を使用するのではなく、画面サイズを使用してビューのサイズを自動的に変更できます。
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を使用して、[プロジェクト]> [一般]で[資産カタログへの移行]を選択します。
次に、「Show in Finder」を使って起動画像を見つけ、640 x 1136になるようにダミー編集してから、下の画像に示すようにアセットカタログにドラッグします。
iOS7とiOS6 R4の両方のセクションに640x1136の画像があることを確認してください。 次回アプリを起動すると、黒いバーが消え、アプリは4インチの画面を使用します
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
}
私はあなたのUIインターフェースに従ってあなたのアプリケーションで自動サイズ変更マスクを使用することをお勧めします。
ビューにはAuto Layout
機能を使用してください。すべての解像度に自動的に調整されます。
接尾辞〜iphoneまたは〜ipadのいずれかでコントローラー名を持つコントローラー用に2つのxibを作成します。コンパイル時に、Xcodeはデバイスに基づいて正しいxibを取ります。
IPhoneとiPadの両方に単一のxibを作成する場合は、サイズクラスを使用します。ビューがiPhoneとiPadに移植するのに十分単純な場合は。
注目に値する点 - 新しいXcodeでは、この画像ファイル[email protected]をアセットに追加する必要があります