it-swarm.com.de

In iOS 7 werden die Statusleiste und die Navigationsleiste über den Grenzen meiner Ansicht angezeigt

Ich habe vor kurzem Xcode 5 DP heruntergeladen, um meine Apps in iOS 7 zu testen. Als Erstes habe ich festgestellt und bestätigt, dass die Größe der Grenzen meiner Ansicht nicht immer geändert wird, um die Statusleiste und die Navigationsleiste zu berücksichtigen.

In viewDidLayoutSubviews drucke ich die Grenzen der Ansicht:

{{0, 0}, {320, 568}}

Dies führt dazu, dass mein Inhalt unterhalb der Navigationsleiste und der Statusleiste angezeigt wird.

Ich weiß, dass ich die Höhe selbst berechnen könnte, indem ich die Höhe des Hauptbildschirms abziehe, die Höhe der Statusleiste und die Höhe der Navigationsleiste abziehe, aber das scheint unnötiger zusätzlicher Aufwand zu sein.

Wie kann ich dieses Problem beheben?

Update:

Ich habe eine Lösung für dieses spezielle Problem gefunden. Setzen Sie die transluzente Eigenschaft der Navigationsleiste auf NO:

self.navigationController.navigationBar.translucent = NO;

Dadurch wird verhindert, dass die Ansicht unter der Navigationsleiste und der Statusleiste eingerahmt wird.

Ich habe jedoch keine Lösung für den Fall gefunden, dass die Navigationsleiste durchsichtig sein soll. Wenn ich beispielsweise ein Foto im Vollbildmodus betrachte, möchte ich, dass die Navigationsleiste durchsichtig ist und die Ansicht darunter eingerahmt wird. Das funktioniert, aber wenn ich die Navigationsleiste ein- oder ausblende, werden noch seltsamere Ergebnisse erzielt. Bei der ersten Unteransicht (einer UIScrollView) werden die Grenzen von Origin jedes Mal geändert.

432
beebcon

Sie können dies erreichen, indem Sie eine neue Eigenschaft namens edgesForExtendedLayout in iOS7 SDK implementieren. Bitte fügen Sie den folgenden Code hinzu, um dies zu erreichen,

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

Sie müssen das Obige in Ihre -(void)viewDidLoad -Methode einfügen.

iOS 7 bringt verschiedene Änderungen mit sich, wie Sie das Erscheinungsbild Ihrer UI gestalten und anpassen. Die Änderungen an Layout, Farbton und Schriftart des View-Controllers wirken sich auf alle UIKit -Objekte in Ihrer App aus. Darüber hinaus bieten Verbesserungen der APIs für die Gestenerkennung eine genauere Kontrolle über Gesteninteraktionen.

View-Controller verwenden

In iOS 7 verwenden View Controller das Vollbild-Layout. Gleichzeitig können Sie mit iOS 7 genauer steuern, wie ein Ansichtscontroller seine Ansichten anordnet. Insbesondere wurde das Konzept des Vollbild-Layouts dahingehend verfeinert, dass ein Ansichtscontroller das Layout jeder Kante seiner Ansicht festlegen kann.

Die View Controller-Eigenschaft wantsFullScreenLayout ist in iOS 7 veraltet. Wenn Sie derzeit wantsFullScreenLayout = NO angeben, zeigt der View Controller seinen Inhalt möglicherweise an einer unerwarteten Stelle auf dem Bildschirm an, wenn er in iOS 7 ausgeführt wird.

UIViewController bietet die folgenden Eigenschaften, um das Layout der Ansichten eines Ansichtscontrollers anzupassen:

  • edgesForExtendedLayout

Die edgesForExtendedLayout -Eigenschaft verwendet den UIRectEdge -Typ, der jede der vier Kanten eines Rechtecks ​​angibt und keine oder alle angibt. Verwenden Sie edgesForExtendedLayout, um festzulegen, welche Ränder einer Ansicht unabhängig von der Balkentransparenz erweitert werden sollen. Standardmäßig lautet der Wert dieser Eigenschaft UIRectEdgeAll.

  • extendedLayoutIncludesOpaqueBars

Wenn in Ihrem Entwurf undurchsichtige Balken verwendet werden, verfeinern Sie edgesForExtendedLayout, indem Sie auch die Eigenschaft extendedLayoutIncludesOpaqueBars auf NO setzen. (Der Standardwert von extendedLayoutIncludesOpaqueBars ist NO.)

  • passt automatischScrollViewInsets an

Wenn Sie nicht möchten, dass die Inhaltsbereiche einer Bildlaufansicht automatisch angepasst werden, setzen Sie automaticallyAdjustsScrollViewInsets auf NO. (Der Standardwert von automaticallyAdjustsScrollViewInsets ist YES.)

  • topLayoutGuide, bottomLayoutGuide

Die Eigenschaften topLayoutGuide und bottomLayoutGuide geben die Position der oberen oder unteren Leistenränder in der Ansicht eines View Controllers an. Wenn Balken den oberen oder unteren Rand einer Ansicht überlappen sollen, können Sie die Ansicht mit dem Interface Builder relativ zum Balken positionieren, indem Sie Abhängigkeiten am unteren Rand von topLayoutGuide oder am oberen Rand von bottomLayoutGuide erstellen. (Wenn sich keine Balken mit der Ansicht überschneiden sollten, entspricht der untere Rand von topLayoutGuide dem oberen Rand der Ansicht und der obere Rand von bottomLayoutGuide dem unteren Rand der Ansicht.) Beide Eigenschaften sind träge erstellt auf Anfrage.

Bitte lesen Sie Apple doc

494
Nandha

Sie müssen nicht berechnen, wie weit alles nach unten verschoben werden soll, dafür gibt es eine eingebaute Eigenschaft. Markieren Sie im Schnittstellen-Generator Ihren Ansichtscontroller und navigieren Sie zum Attributinspektor. Hier sehen Sie einige Kontrollkästchen neben den Wörtern "Kanten verlängern". Wie Sie im ersten Screenshot sehen können, wird der Inhalt standardmäßig unter der oberen und unteren Leiste angezeigt, nicht jedoch unter undurchsichtigen Leisten. Aus diesem Grund hat es sich für Sie bewährt, den Leistenstil so einzustellen, dass er nicht durchsichtig ist.

Wie Sie im ersten Screenshot sehen können, gibt es zwei UI-Elemente, die sich unter der Navigationsleiste verstecken. (Ich habe Drahtmodelle in IB aktiviert, um dies zu veranschaulichen.) Bei diesen Elementen, einem UIButton und einem UISegmentedControl, ist der "y" -Ursprung auf Null gesetzt, und der Ansichtscontroller ist so eingestellt, dass der Inhalt unterhalb der oberen Leiste zulässig ist.

enter image description here

Dieser zweite Screenshot zeigt, was passiert, wenn Sie das Kontrollkästchen "Unter den oberen Balken" deaktivieren. Wie Sie sehen, wurde die Ansicht der Ansichtssteuerungen entsprechend nach unten verschoben, damit sich ihr Ursprung direkt unter der Navigationsleiste befindet.

enter image description here

Dies kann auch programmgesteuert durch die Verwendung von -[UIViewController edgesForExtendedLayout] erreicht werden. Hier ist ein Link zur Klassenreferenz für edgeForExtendedLayout und für IRectEdge

[self setEdgesForExtendedLayout:UIRectEdgeNone];
110
Mick MacCallum

Ich habe meine Sicht programmgesteuert erstellt und dies hat letztendlich für mich funktioniert:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.Origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

Quelle (im Abschnitt topLayoutGuide unten auf Seite 39).

33
Stunner

Swift 3/Swift 4-Lösung, die auch mit NIBs/XIB-Dateien in iOS 10+ funktioniert:

override func viewDidLoad() {
    super.viewDidLoad()

    edgesForExtendedLayout = []
}
28
flo_23

Wenn Sie möchten, dass die Ansicht über eine durchscheinende Navigationsleiste verfügt (was ein bisschen nett ist), müssen Sie ein contentInset oder ähnliches einrichten.

So mache ich es:

// Check if we are running on ios7
if([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue] >= 7) {
      CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
      float heightPadding = statusBarViewRect.size.height+self.navigationController.navigationBar.frame.size.height;

      myContentView.contentInset = UIEdgeInsetsMake(heightPadding, 0.0, 0.0, 0.0);
}
10
Magnus

Fügen Sie in Ihrer App-Plist-Datei eine Zeile hinzu, nennen Sie sie "Controller-basierte Statusleiste anzeigen" und setzen Sie sie auf NO.

9
Idan

edgesForExtendedLayout macht den Trick für iOS 7. Wenn Sie die App jedoch für iOS 7 SDK erstellen und in iOS 6 bereitstellen, wird die Navigationsleiste durchsichtig und die Ansichten werden darunter angezeigt. Gehen Sie wie folgt vor, um das Problem sowohl für iOS 7 als auch für iOS 6 zu beheben:

self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
9

Der einfachste Trick besteht darin, die Datei NIB zu öffnen und diese beiden einfachen Schritte auszuführen:

  1. Schalten Sie das einfach um und stellen Sie es auf das gewünschte ein:

Enter image description here

  1. Wählen Sie die UIView/UIIMageView/... aus, die Sie nach unten verschieben möchten. In meinem Fall war nur das Logo überlappt und ich habe das Delta auf +15 gesetzt. (ODER -15, wenn Sie in Schritt 1 iOS 7 gewählt haben)

Enter image description here

Und das Ergebnis :

BeforeAfter

7
Riskov

Schnelle Lösung:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.edgesForExtendedLayout = UIRectEdge.None
}
5
fatihyildizhan

Swift

override func viewWillAppear(_ animated: Bool) {
    self.edgesForExtendedLayout = []
}
4
Shahrukh

Ich möchte die Antwort von Stunner erweitern und eine if -Anweisung hinzufügen, um zu prüfen, ob es sich um iOS-7 handelt, da meine App beim Testen unter iOS 6 abstürzen würde.

Der Zusatz würde hinzufügen:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

Daher würde ich vorschlagen, diese Methode zu Ihrer MyViewControler.m -Datei hinzuzufügen:

- (void) viewDidLayoutSubviews {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.Origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
    }
}
4
werdsackjon

Ich habe ein Szenario, in dem ich den von Apple geschriebenen BannerViewController verwende, um meine Anzeigen und einen im BannerViewController eingebetteten ScrollViewController anzuzeigen.

Um zu verhindern, dass die Navigationsleiste meinen Inhalt verbirgt, musste ich zwei Änderungen vornehmen.

1) Ändern Sie BannerViewController.m

- (void)viewDidLoad
{
   [super viewDidLoad];
   float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
   if (systemVersion >= 7.0) {
      self.edgesForExtendedLayout = UIRectEdgeNone;
   }
}

2) Ändern Sie meinen ScrollViewContoller

- (void)viewDidLoad
{
    [super viewDidLoad];
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0) {
        self.edgesForExtendedLayout = UIRectEdgeBottom;
    }
}

Jetzt werden die Anzeigen im unteren Bereich der Ansicht korrekt angezeigt, anstatt von der Navigationsleiste verdeckt zu werden, und der Inhalt im oberen Bereich wird nicht abgeschnitten.

3
Xavier John

mache eine Einschränkung zu Top Layout wie folgt enter image description here

2
carmen_munich

stellen Sie einfach den folgenden Code in der Ansicht ein.

  if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
 }
2

Für mich ist die einfachste Lösung, zwei Schlüssel in die Liste aufzunehmen

enter image description here

1
giuseppe

Swift 4.2 - Xcode 10.0 - iOS 12.0:

if #available(iOS 11.0, *) {} else {
  self.edgesForExtendedLayout = []
  self.navigationController?.view.backgroundColor = .white
}
1
juliancadi

Fügen Sie den Schlüssel "View Controller-based status bar appear" aus der Dropdown-Liste als Zeile in info.plist hinzu. Etwas wie das:

Enter image description here

1
Kursat Turkay

Ich hatte das gleiche Problem mit meiner App von iPads (armv7, armv7s, amr64), nur indem ich einen anderen UIViewController präsentierte und nachdem ich sie entlassen hatte, ging die Navigationsleiste in die Statusleiste ... Ich verbringe viel Zeit damit, eine Lösung dafür zu finden. Ich benutze Storyboard und in InterfaceBuilder für UIViewController, was es fürchterlich macht, Präsentation von Vollbild -> Aktueller Kontext einzustellen und dieses Problem zu beheben. Es funktioniert in meiner App nur für iPads => iOS8.0 (testen mit iOS8.1) und für iPads mit iOS 7.1 nicht !! see screenshot

1
Alexej W.

Schritte zum Ausblenden der Statusleiste in iOS 7:

1.Gehen Sie zu Ihrer Datei application info.plist.

2.Und Set, Controller-basierte Statusleiste anzeigen: Boolean NO

Hoffe, ich habe das Problem mit der Statusleiste behoben ...

0
chandrika

In meinem Fall wurde loadView () unterbrochen
dieser Code: self.edgesForExtendedLayout = UIRectEdgeNone

aber nach dem Löschen von loadView () hat alles gut funktioniert

0
DevB2F