新しい iPhone 5 ディスプレイは、新しい縦横比と新しい解像度 (640 x 1136 ピクセル) を備えています。
新規のアプリケーションを開発する、または既存のアプリケーションを新しい画面サイズに移行するには何が必要ですか?
古いディスプレイと新しいワイドスクリーンのアスペクト比の両方でアプリケーションを「ユニバーサル」にするために、何を心に留めておく必要がありますか?
[[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 を設計し、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 を処理するにはコードを変更する必要があります)。異なるグラフィックスが必要な場合、マスクの自動サイズ変更をいじっても機能しないためです。
-(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-今日/
スプラッシュ/デフォルト画面(640 x 1136ピクセル)の新しい画像を「 Default-568h@2x.png」 という名前で作成します
iOSシミュレーターで、[ハードウェア]-> [デバイス]メニューに移動し、[ iPhone(Retina 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];
}
ここでこの問題を解決します。~568h@2x サフィックスをイメージに、~568h を xib に追加するだけです。ランタイム チェックやコード変更は必要ありません。
私は新しいデフォルトの起動イメージを追加し、(他のいくつかのSEの回答をチェックして...)ストーリーボードがすべて自分自身とサブビューのサイズを自動調整したが、網膜の4インチはまだレターボックスになっていることを確認しました.
次に、情報 plist に「 Launch image 」の行項目が「 Default.png 」に設定されていることに気付きました。これを削除すると、魔法のようにレターボックスが表示されなくなりました。うまくいけば、それが私が耐えたのと同じ狂気を他の誰かが救う.
ファイルに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)
すべてのケースで機能するとは限りませんが、私の特定のプロジェクトでは、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...
}
アプリが 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)
このAuto Layout
機能を使用し、iPhone 5の画面解像度を使用してデザインを作成できます。これは、4インチと3.5インチの両方のデバイスで機能しますが、この場合、レイアウトマネージャーに関する十分な知識が必要です。
ランドスケープ モードでのチェックbounds
は失敗します。568
iPhone 5 は縦向きモードでのみ起動しますが、回転をサポートしたい場合は、iPhone 5 の「チェック」でこのシナリオも処理する必要があります。
向きの状態を処理するマクロは次のとおりです。
#define IS_IPHONE_5 (CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size, CGSizeMake(640, 1136)))
「preferredMode」呼び出しの使用は、数時間前に読んだ別の投稿からのものであるため、このアイデアは思いつきませんでした。
シングルトン クラスで以下のメソッドを試してください。
-(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";
}
ハードコーディングされた値なしで、すべてに対して 1 つのコードベースを持っていたので、どのデバイスでもこのような問題に直面したことはありません。私がしていることは、デバイスごとに 1 つではなく、最大サイズの画像をリソースとして持つことです。たとえば、Retina ディスプレイ用に 1 つ用意し、アスペクト フィットとして表示するので、すべてのデバイスでそのまま表示されます。ボタンのフレームなどを実行時に決めていきます。このために、特許ビューの % 値を使用します。たとえば、幅を親ビューの半分にしたい場合は、親ビューの 50% を取り、高さと中央にも同じことが適用されます。
これで、xibsさえ必要ありません。
まずこの画像を見せてください。その画像では、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
}
ピーター、あなたは Canappi を実際に見てみる必要があります。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 を iPhone5 ストーリーボードで設定し、iPad メインを iPad ターゲット ストーリーボードで設定し、iPhone の新しいストーリーボード ターゲットを追加し、iPhone 4s 以下の解像度を変更して、AppDelegate.mを実装します。
iPhone4/4s (3/3Gs と同じ) を iPhone5 用に 1 つ作成し、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
次のコードを追加できます。
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");
}
}
既存のアプリをユニバーサルに変換する必要がある場合は、対応する xib ファイルを選択する必要があります->ユーティリティを表示->サイズ インスペクターを表示します。
サイズ インスペクタでは Autosizing を確認できます。このツールを使用すると、既存の iOS アプリに変換できます。
注目すべき点 - 新しい Xcode では、この画像ファイル Default-568h@2x.png をアセットに追加する必要があります
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
}
Auto Layout
ビューの機能を使用します。すべての解像度に自動的に調整されます。
~iphone または ~ipad のいずれかのサフィックスを持つコントローラー名を持つコントローラー用に 2 つの xib を作成します。コンパイル時に、Xcode はデバイスに基づいて適切な xib を取得します。
iPhone と iPad の両方に単一の xib を作成する場合、ビューが iPhone と iPad に移植するのに十分単純な場合は、サイズ クラスを使用します。
UI インターフェイスに応じて、アプリケーションで Autoresizing Mask を使用することをお勧めします。これにより、iPhone 4 と 5 の画面で異なる UI を作成するよりも多くの手間を省くことができます。
xCode 5 を使用して、[Project] > [General] で [Migrate to Asset Catalog] を選択します。
次に、「Show in finder」を使用して起動画像を見つけます。640x1136 になるようにダミー編集してから、下の画像に示すようにアセット カタログにドラッグします。
iOS7 と iOS6 R4 の両方のセクションに 640x1136 の画像があることを確認してください。次回アプリを起動すると、黒いバーが消え、アプリは 4 インチの画面を使用します