webentwicklung-frage-antwort-db.com.de

Wie man xib mit iPhone 5 und iPhone 4 Geräten kompatibel macht

Ich versuche, mein Xib so zu gestalten, dass es sowohl in das iPhone 5 (4 Zoll Retina) als auch in das 3,5-Gerät passt. 

Da ich IOS-5 unterstützen muss, kann ich kein Autolayout verwenden. Ich muss Federn und Federbeine verwenden.

Ich habe alles im Interface Builder versucht. Aber entweder geht meine Sicht über die Unterseite des iPhone-3,5-Zoll hinaus oder füllt die iPhone-4-Zoll-Retina nicht vollständig aus. 

Kann jemand einen Tipp geben, wie man eigentlich ein Xib mit beiden Geräten kompatibel macht?

Für mehr Klarheit füge ich Screenshots hinzu:

Wenn ich im Attribut-Inspector die Größe 3,5 einstelle: When I set size in attribute inspector to 3.5

es sieht in iphone-5 aus. Unter den Schaltflächen ist ein Leerzeichen: And this is how it looks in simulator for 3.5 inch device

Wenn ich die Größe 4 Zoll im Interface Builder einstelle. Sie können sehen, dass die unteren Schaltflächen in iphone-4 nicht sichtbar sind.If I set size 3.5 inch in interface builder

Sie werden also fragen, welche Einstellungen ich verwende. Hier sind sie:

enter image description hereenter image description hereenter image description here

45
user739711
  1. Sie fügen eine neue Kategorie für UIviewController hinzu und fügen diesen Code in die .h-Datei ein 

     - (id)initWithNibNameforIphone4:(NSString *)nibNameOrNil4 NibNameforIphone5:(NSString *)nibNameOrNil5 NibNameforIpad:(NSString *)nibNameOrNilpad bundle:(NSBundle *)nibBundleOrNil;
    
  2. Fügen Sie diesen Code in Ihre .m-Datei ein 

     - (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. Öffnen Sie die Datei "YouProject-Prefix.pch" und importieren Sie Ihre Kategorie hier 

  4. jetzt verwenden Sie dies einfach in diesem gesamten Projekt 

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

    danke und jede frage dann kommentieren und nicht vergessen :-)

\

38
Waseem Shah

Fügen Sie dies allen Controllern hinzu, die das iPhone 5 unterstützen müssen:

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

Setzen Sie die Ansichtsgröße mit dem Interface-Builder auf Keine
Es dauert nur die Ansichtsgröße zur Laufzeit, Sie müssen lediglich für jedes Element (UILabel, UIImage usw.) in der Ansicht Herkunft und die automatische Größenanpassung berücksichtigen.

  • Interface-Builder (XIB) -> Attributinspektor -> Simulierte Metriken - Größe: Keine

enter image description here

11
Navnath Godse

Ich hatte heute Probleme damit und egal was ich tat, meine Ansichten wurden immer als 320x480 angezeigt, selbst wenn auf dem Retina 4 "-Simulator gearbeitet wurde. Sogar [UIScreen mainScreen] .bounds kehrte mit 320x480 zurück!

Ich fand, dass das Hinzufügen des Startbilds [email protected] der Schlüssel dafür war, dass iOS meine App als "Retina 4" "ready" erkennt. Als ich das getan hatte, musste ich nichts weiter tun, um die Größe der Spitze automatisch zu ändern ohne die schwarzen Balken, keine Notwendigkeit für zwei separate Xibs, Ändern der Einstellungen im Interface Builder, Überschreiben von loadView usw.

6
Diarrhio

Wenn Sie sich für die Lösung von 2 xib-Dateien entscheiden, In Ihrer Methode initWithNibName () rufen Sie einfach super mit dem anderen Spitznamen auf. 

Ich würde eher auf der ursprünglichen 480-Höhen-Dimension als auf der 568-Höhe testen, sodass die größere XIB-Datei ausgewählt wird, wenn Apple einen größeren Bildschirm freigibt. In Zukunft wird zumindest das größere Xib nicht so viel Briefkasten wie das kleinere sein.

// 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

Für die 3,5-Zoll- und 4-Zoll-Geräte müssen Sie keine andere Spitze verwenden. Entwerfen Sie die App für das 4-Zoll-Gerät, und legen Sie die AutoResizingMask richtig fest, und es sollte ordnungsgemäß funktionieren.

In Ihrem Fall setzen Sie einfach die AutoResizingMask auf

[view setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];

Die Maske zur automatischen Größenänderung positioniert die Ansicht in beiden Geräten korrekt an ihrer Position. 

3
MaheshShanbhag

Ich hatte auch ein Problem mit 3,5 "vs. 4", und ich habe falsch verstanden, was falsch war. Daher wollte ich es hier dokumentieren, da es jedem hilft.

Wenn Sie versuchen, auf self.view.frame zuzugreifen, wird dies erst nach viewDidAppear oder einem ähnlichen Ereignis korrekt gemeldet. Wenn Sie versuchen, über viewDidLoad auf self.view.frame zuzugreifen, können Sie die Dimensionen des Frames vor autosizing angeben.

1
BigCheesy

Ich habe eine Idee. Lassen Sie Ihre Benutzeroberfläche in Header, Body und Footer (wie Website) unterteilen. Suchen Sie dann in Ihrer Codekonsole nach Größeninspektor und verwenden Sie die automatische Größenanpassung.

Beachten Sie die Außenlinien des Quadrats, es ist Ihre Steuerposition gegenüber der Hauptansicht. Stellen Sie die Steuerelemente (Navigationsleiste, UIImageView, UIButton usw.) im Kopfzeilenteil und am Hauptteil, die an der Oberseite angebracht sind, und die Steuerelemente (Lesezeichen, Schließen usw.) in der Fußzeile auf Unten.

Jedes Mal, wenn Sie ausführen, werden die Steuerelemente mit den AutoSizing-Einstellungen verknüpft. Sie haben auf dem iPhone 5 ein Leerzeichen zwischen Kopfzeile/Körper und Fußzeile, aber ich denke, es ist in Ordnung.

1
Shinigamae

Definieren Sie die Zeile unten und prüfen Sie den Zustand basierend auf dem Gerät.

#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

Ohne Autolayout müssen Sie möglicherweise viele Dinge im Code behandeln. Ich gehe davon aus, dass der Großteil Ihres Layouts gut mit Federn und Streben funktionieren kann, aber einige Elemente der Benutzeroberfläche können nicht so einfach manuell die Rahmen bestimmter Objekte entsprechend der Größe Ihrer Ansicht einstellen. 

0
rooster117
  • Klicken Sie in Ihrem Storyboard auf "Dateiinspektor anzeigen".
  • Wählen Sie unter Interface Builder Dokument-> Dokumentversionierung die Option Bereitstellung = iOS 5 (oder Ihre Wahl) aus.

Wenn dies nicht funktioniert, müssen Sie mit jeder Ihrer Ansichten arbeiten. Wählen Sie sie aus. Unter Eigenschaften-Inspektor für jeden von ihnen im Abschnitt Ansicht siehe Attribut Modus. Setzen Sie diese Option auf "Neu zeichnen".

Wenn auch das kein zufriedenstellendes Ergebnis liefert, setzen Sie die Ansichtsgröße auf die kleinste aller Versionen, die Sie verwenden werden. Setzen Sie das Modusattribut = 'Scale to fill'.

Programmgesteuert ist das Modusattribut view.contentmode property.

0
Nirav Bhatt

das ivanzoid-Snippet oberhalb dieser Abfrage für die gesamte Bildschirmgröße führt den Trick aus, solange Sie daran denken, die Offsets für die Navigation und die Symbolleisten (in den meisten Fällen 64) abzuziehen. 

Es ist die Ansichtshöhe, die angepasst werden muss. Federn und Streben kümmern sich sonst darum. 

Beim erneuten Testen meiner App auf dem iPhone 5 musste ich dies nur auf einem Bildschirm mit einigen Anpassungen der Laufzeitsteuerung vornehmen. Jeder andere Fall wird durch XIB-Standardwerte behandelt.

0
Chris Fox

Wenn Sie nicht zwei xib verwenden möchten und Autosizing verwenden möchten, verwenden Sie hier .

0
the1pawan