web-dev-qa-db-ja.com

xibをiPhone 5とiPhone 4の両方のデバイスと互換性を持たせる方法

レイアウトがiphone 5(4インチの網膜)と3.5デバイスの両方に収まるようにxibをレイアウトしようとしています。

IOS-5をサポートする必要があるため、自動レイアウトを使用できません。スプリングとストラットを使用する必要があります。

インターフェイスビルダーですべてを試しました。しかし、私の意見はiphone-3.5-inchの底を越えているか、iphone-4-inch-retinaを完全に埋めていないかのどちらかです。

誰かが実際に両方のデバイスと互換性のあるxibを作成する方法のヒントを提供できますか?

より明確にするために、スクリーンショットを追加しています:

属性インスペクターでサイズ3.5を設定すると: When I set size in attribute inspector to 3.5

iphone-5に見えます。ボタンの下にスペースがあります。 And this is how it looks in simulator for 3.5 inch device

インターフェイスビルダーでサイズを4インチに設定した場合。 iphone-4では下のボタンが見えないことがわかります。 If I set size 3.5 inch in interface builder

そのため、私が使用している設定は何かを尋ねられます。それらは次のとおりです。

enter image description hereenter image description hereenter image description here

45
user739711
  1. UIviewControllerの新しいカテゴリを追加し、このコードを.hファイルに追加します

     - (id)initWithNibNameforIphone4:(NSString *)nibNameOrNil4 NibNameforIphone5:(NSString *)nibNameOrNil5 NibNameforIpad:(NSString *)nibNameOrNilpad bundle:(NSBundle *)nibBundleOrNil;
    
  2. このコードを.mファイルに追加します

     - (id)initWithNibNameforIphone4:(NSString *)nibNameOrNil4 NibNameforIphone5:(NSString *)nibNameOrNil5 NibNameforIpad:(NSString *)nibNameOrNilpad bundle:(NSBundle *)nibBundleOrNil
     {
       if (self = [super init])
     {
      self = [self initWithNibName:[self CheckDeviceIphone4:nibNameOrNil4 Iphone5:nibNameOrNil5 Ipad:nibNameOrNilpad] bundle:nibBundleOrNil];
      }
      return self;
    
    }
    
      -(NSString *)CheckDeviceIphone4:(NSString *)iphone4 Iphone5:(NSString *)iphone5 Ipad:(NSString *)ipad {
    
        return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) ? ipad :([[UIScreen mainScreen] bounds].size.height == 568) ?  iphone5 :iphone4;
      }
    
  3. YouProject-Prefix.pchファイルを開き、ここにカテゴリをインポートします

  4. 今、あなたはこのようなプロジェクト全体でこれを使用するだけです

     self.firstView=[[firstView alloc]initWithNibNameforIphone4:@"firstView4" NibNameforIphone5:@"firstView" NibNameforIpad:@"firstViewIpad" bundle:[NSBundle mainBundle]];
    

    おかげで、質問があればコメントして、投票することを忘れないでください:-)

\

38
Waseem Shah

IPhone 5をサポートする必要があるすべてのコントローラーにこれを追加してみてください。

- (void) loadView
{
    [super loadView];
    self.view.frame = [UIScreen mainScreen].bounds;
}
20
ivanzoid

Interface-builderを使用して、表示サイズをNoneに設定するだけです

  • Interface-builder(XIB)-> Attribute Inspector-> Simulated Metrics-Size:None

enter image description here

11
Navnath Godse

今日はこれに苦労していましたが、Retina 4インチシミュレーターで実行しているときでも、何をしようとも、常に320x480として表示されていました。[UIScreen mainScreen] .boundsでも320x480を返していました。

[email protected]起動画像を追加することが、iOSにアプリを「レチナ4」準備完了として認識させるための鍵であることがわかりました。 2つの独立したxib、Interface Builderでの設定変更、loadViewのオーバーライドなどは必要ありません。

6
Diarrhio

2つのxibファイルを使用するソリューションを選択した場合; initWithNibName()メソッドで、異なるnib名でsuperを呼び出すだけです。

568の高さではなく、元の480の高さの寸法でテストして、Appleが大きな画面をリリースした場合、少なくとも大きなxibが将来的には '小さい方と同じくらいレターボックスに入れてください。

// From MainView.m
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    CGSize result = [[UIScreen mainScreen] bounds].size;
    if(result.height == 480)
    {
        // iPhone Classic
        self = [super initWithNibName:@"MainView" bundle:nibBundleOrNil];
    }
    else
    {
        // iPhone 5 or maybe a larger iPhone ??
        self = [super initWithNibName:@"MainView5" bundle:nibBundleOrNil];
    }

    return self;
}
3
Ed Trujillo

3.5インチと4インチのデバイスに別のペン先を使用する必要はありません。 4インチデバイス用のアプリを設計し、AutoResizingMaskを正しく設定すると、正しく動作するはずです。

あなたの場合、AutoResizingMaskを

[view setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];

自動サイズ変更マスクは、両方のデバイスでビューをその位置に正しく配置します。

3
MaheshShanbhag

3.5 "対4"でも問題が発生していましたが、何が間違っているのかを誤解していたので、誰にも役立つようにここに文書化したいと思いました。

self.view.frameにアクセスしようとすると、viewDidAppearまたは同様のイベントが発生するまで正しく報告されません。 viewDidLoad内からself.view.frameにアクセスしようとすると、フレームの寸法を報告できますbefore自動サイズ変更が行われます。

1
BigCheesy

考えがある。 UIをヘッダー、本文、およびフッター(Webサイトなど)に分離します。次に、コードコンソールで[サイズインスペクター]に移動し、自動サイズ設定を使用します。

正方形の外側の線に注目してください。メインビューに対するコントロールの位置です。 Topに接続されたヘッダー部分と本文部分のコントロール(ナビゲーションバー、UIImageView、UIButtonなど)とフッターのコントロール(Bookmark、Closeなど)をBottomに設定します。

実行するたびに、コントロールは自動サイズ設定に添付されます。 iPhone 5ではヘッダー/本文とフッターの間にスペースがありますが、問題ないと思います。

1
Shinigamae

以下の行を定義し、デバイスに基づいて条件を確認します。

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) 
if (IS_IPHONE_5) {
    btnBookmark.frame=CGRectMake(0, 460, 100, 70);
    btnBookmark.frame=CGRectMake(150, 460, 100, 70);
}
else {
    btnBookmark.frame=CGRectMake(0, 360, 100, 70);
    btnBookmark.frame=CGRectMake(150, 360, 100, 70);
}
1
Chris Alan

自動レイアウトを使用しないと、コードで多くのことを処理する必要がある場合があります。ほとんどのレイアウトはスプリングとストラットでうまく機能すると思いますが、一部のUI要素ではできないため、ビューのサイズに応じて特定のオブジェクトのフレームを手動で設定する必要があります。

0
rooster117
  • ストーリーボードで、[ファイルインスペクターを表示]をクリックします。
  • Interface builder document-> Document versioningで、Deployment = iOS 5(または選択)を選択します。

これが機能しない場合は、各ビューで作業する必要があります。それらを選択します。それぞれの属性インスペクターの「表示」セクションで、「モード属性」を参照してください。これを「再描画」に設定します。

それでも満足のいく結果が得られない場合は、ビューサイズを、使用するすべてのバージョンの最小値に設定します。そして、Mode属性を「Scale to fill」に設定します。

プログラム的に、Mode属性は view.contentmode propertyです。

0
Nirav Bhatt

画面全体のサイズを照会する上記のivanzoidのスニペットは、ナビゲーションとツールバー(ほとんどの条件で合計64)のオフセットを減算することを忘れない限り、うまくいきます。

調整する必要があるのはビューの高さです。それ以外の場合は、スプリングとストラットがそれを処理します。

IPhone 5でアプリを再テストしました。これは、1つの画面で実行時制御位置調整を行うだけで済みました。他のすべてのケースはXIBのデフォルトで処理されます。

0
Chris Fox

2つのxibを使用したくなく、自動サイズ設定を使用したい場合 here

0
the1pawan