Ich weiß, dass das Vorhandensein des mehr Ansichts-Controllers (Navigationsleiste) das UIView um seine Höhe nach unten drückt. Ich weiß auch, dass diese Höhe = 44px ist. Ich habe auch festgestellt, dass dieser Druck nach unten die [self.view].frame.origin.y = 0
.
Wie bestimme ich die Höhe dieser Navigationsleiste, anstatt sie nur auf eine Konstante zu setzen?
Oder, kürzere Version, wie stelle ich fest, dass mein UIView mit der Navigationsleiste oben angezeigt wird?
Die Glühbirne ging an. Leider habe ich keinen einheitlichen Weg gefunden, um das Problem zu beheben, wie unten beschrieben.
Ich glaube, dass sich mein gesamtes Problem auf meine Autoresizing-Masken konzentriert. Und der Grund, warum ich zu dem Schluss gekommen bin, dass es dieselben Symptome gibt, mit oder ohne UIWebView. Und dieses Symptom ist, dass für Portrait alles pfirsichfarben ist. Bei Querformat wird der unterste UIButton hinter der TabBar angezeigt.
Zum Beispiel habe ich in einem UIView von oben nach unten:
UIView - beide Federn eingestellt (Standardfall) und keine Streben
UIScrollView - Wenn ich die beiden Federn setze und alles andere lösche (wie das UIView), dringt der UIButton in das Objekt unmittelbar darüber ein. Wenn ich alles lösche, ist UIButton in Ordnung, aber das Material ganz oben versteckt sich hinter der Statusleiste. Wenn Sie nur die obere Strebe einstellen, wird der UIButton hinter der Tab-Leiste angezeigt.
UILabel und UIImage als nächstes vertikal - oberes Strebenset, überall flexibel
Nur um das Bild für die wenigen zu vervollständigen, die eine UIWebView haben:
UIWebView - Streben: oben, links, rechts Federn: beide
UIButton - nichts festgelegt, dh überall flexibel
Obwohl meine Glühbirne schwach ist, scheint es Hoffnung zu geben.
Bitte nehmen Sie mit, weil ich mehr Platz brauchte, als für einen kurzen Antwortkommentar vorgesehen war.
Vielen Dank, dass Sie versucht haben zu verstehen, wonach ich wirklich fische.
1) Jeder UIViewController (eine TabBar-App) verfügt über ein UIImage, Text und was auch immer. Ein weiterer gemeinsamer Nenner ist ein UIButton auf der Unterseite. Auf einigen UIViewControllern habe ich eine UIWebView über dem UIButton.
Also, UIImage, Text usw. UIWebView (auf EINIGEN) UIButton
Um all das oben Genannte ist eine UIScrollView.
2) Für diejenigen, die eine UIWebView haben, sieht die AutoresizingMask wie folgt aus:
—
|
—
^
|
|
| - | ← ---- → | - | | | V Die Maske des UIButton ist nicht festgelegt, dh überall flexibel
In meinem -viewDidLoad rufe ich meine -repositionSubViews auf, in denen ich Folgendes mache:
Wenn es keine UIWebView gibt, mache ich nichts anderes als den UIButton zu zentrieren, den ich mit IB platziert habe.
Wenn ich eine UIWebView habe, bestimme ich deren * Inhalt * -Höhe und setze ihren Rahmen so, dass er den gesamten Inhalt einschließt.
UIScrollView *scrollViewInsideWebView = [[webView_ subviews] lastObject];
webViewContentHeight = scrollViewInsideWebView.contentSize.height;
[webView_ setFrame:CGRectMake(webViewOriginX, webViewOriginY,
sameWholeViewScrollerWidth, webViewContentHeight)]
Sobald ich das mache, drücke ich den UIButton programmgesteuert nach unten, so dass er unter der UIWebView platziert wird.
Alles funktioniert, bis ich es von Porträt zu Landschaft drehe.
Ich rufe meine -repositionSubViews in meiner -didRotateFromInterfaceOrientation auf.
Warum ändert sich die Inhaltshöhe meines UIWebView nicht mit der Drehung?
Von Hochformat zu Querformat sollte die Inhaltsbreite erweitert und die Inhaltshöhe verringert werden. Es funktioniert optisch so, wie es sollte, aber nicht gemäß meinem NSLog.
Wie auch immer, mit oder ohne UIWebView bewegt sich die Schaltfläche, über die ich gesprochen habe, im Querformat unter die TabBar, aber sie wird nicht nach oben gescrollt, um gesehen zu werden. Ich sehe es hinter der TabBar, wenn ich "kräftig" scrolle, aber dann "fällt" es hinter der TabBar zurück.
Unterm Strich ist dies der letzte Grund, warum ich nach der Höhe der TabBar und der Navigationsleiste gefragt habe, da sich die TabBar am unteren Rand der UIView befindet und die Navigationsleiste die UIView nach unten drückt.
Jetzt werde ich hier ein oder zwei Kommentare hinzufügen, weil sie früher keinen Sinn ergeben hätten.
Ohne UIWebView lasse ich alles so, wie es von IB gesehen wird.
Mit einer UIWebView erhöhe ich die Frame.Höhe der UIWebView auf ihre Inhaltshöhe und passe auch die Höhe der umgebenden UIScrollView, die alle Unteransichten umgibt, nach oben an.
Na da hast du es.
Mit dem iPhone-X wird die Höhe der oberen Leiste (Navigationsleiste + Statusleiste) geändert (erhöht).
Versuchen Sie dies, wenn Sie die genaue Höhe der oberen Leiste (sowohl Navigationsleiste als auch Statusleiste) wünschen:
AKTUALISIEREN
iOS 13
Da das
statusBarFrame
in veraltet wariOS13
, können Sie dies verwenden:Ziel c
Swift 4
Probieren Sie diese UIViewController-Erweiterung aus
Swift 3
quelle
Schnelle Version:
quelle
Hast du das versucht?
quelle
Unterstützt iOS 13 und niedriger:
quelle
Alles was wir wirklich brauchen ist
quelle
Meine Anwendung verfügt über einige Ansichten, für deren Erscheinungsbild eine angepasste Navigationsleiste in der Benutzeroberfläche erforderlich ist, jedoch ohne Navigationscontroller. Die Anwendung muss die iOS-Version vor iOS 11 unterstützen, sodass die praktische Anleitung für das Layout sicherer Bereiche nicht verwendet werden konnte und ich die Position und Höhe der Navigationsleiste programmgesteuert anpassen muss.
Ich habe die Navigationsleiste direkt an die Übersicht angehängt und die oben erwähnte Anleitung zum Layout des sicheren Bereichs übersprungen. Und die Höhe der Statusleiste könnte leicht aus UIApplication abgerufen werden, aber die Standardhöhe der Navigationsleiste ist wirklich ein Schmerz ...
Es fiel mir fast eine halbe Nacht lang auf, mit einer Reihe von Suchen und Tests, bis ich schließlich den Hinweis von einem anderen Beitrag bekam (der für mich allerdings nicht funktionierte), dass man tatsächlich die Höhe von UIView.sizeThatFits () wie diesem erhalten könnte ::
Endlich eine perfekte Navigationsleiste, die genauso aussieht wie die eingebaute!
quelle
Wenn Sie
navigationBar
nur die Höhe erhalten möchten , ist es einfach:Wenn Sie jedoch die Höhe der Spitzenklasse des iPhones benötigen, müssen Sie die
navigationBar
Höhe nicht ermitteln und die Höhe hinzufügen.statusBar
Sie können einfach anrufensafeAreaInsets
, weshalb es sie gibt.quelle
Die Glühbirne ging an. Leider habe ich keinen einheitlichen Weg gefunden, um das Problem zu beheben, wie unten beschrieben.
Ich glaube, dass sich mein gesamtes Problem auf meine Autoresizing-Masken konzentriert. Und der Grund, warum ich zu dem Schluss gekommen bin, dass es dieselben Symptome gibt, mit oder ohne UIWebView. Und dieses Symptom ist, dass für Portrait alles pfirsichfarben ist. Bei Querformat wird der unterste UIButton hinter der TabBar angezeigt.
Zum Beispiel habe ich in einem UIView von oben nach unten:
UIView - beide Federn eingestellt (Standardfall) und keine Streben
UIScrollView - Wenn ich die beiden Federn setze und alles andere lösche (wie das UIView), dringt der UIButton in das Objekt unmittelbar darüber ein. Wenn ich alles lösche, ist UIButton in Ordnung, aber das Material ganz oben versteckt sich hinter der Statusleiste. Wenn Sie nur die obere Strebe einstellen, wird der UIButton hinter der Tab-Leiste angezeigt.
UILabel und UIImage als nächstes vertikal - oberes Strebenset, überall flexibel
Nur um das Bild für die wenigen zu vervollständigen, die eine UIWebView haben:
UIWebView - Streben: oben, links, rechts Federn: beide
UIButton - nichts festgelegt, dh überall flexibel
Obwohl meine Glühbirne schwach ist, scheint es Hoffnung zu geben.
quelle
Hier ist der Beginn meiner Antwort auf Ihr Update:
Könnte es sein, dass Ihre automatische Größenänderung nicht die automatische Größenmaske für alle Richtungen enthält?
Ein weiterer Vorschlag, bevor ich darauf zurückkomme, könnten Sie eine Symbolleiste für Ihre Bedürfnisse verwenden. Es ist etwas einfacher, wird immer unten sein, dreht sich automatisch / positioniert. Sie können es nach Belieben ausblenden / anzeigen usw. So ähnlich: http://cdn.artoftheiphone.com/wp-content/uploads/2009/01/yellow-pages-iphone-app-2.jpg
Sie haben sich diese Option vielleicht angesehen, sie aber einfach rausgeworfen.
Eine andere Idee, könnten Sie möglicherweise erkennen, aus welcher Ausrichtung Sie sich drehen, und die Schaltfläche einfach programmgesteuert platzieren, um sie an die Registerkartenleiste anzupassen. (Dies ist mit Code möglich)
quelle
Ich habe benutzt:
Funktioniert hervorragend, wenn Sie die Höhe der Navigationsleiste UND deren Y-Ursprung ermitteln möchten.
quelle
Swift 5
Wenn Sie auch die safeArea in Betracht ziehen möchten:
quelle
Praktische Swift 4-Erweiterung, falls sie für andere hilfreich ist. Funktioniert auch dann, wenn der aktuelle Ansichts-Controller keine Navigationsleiste anzeigt.
Verwendung:
quelle