Frage

Ich weiß, dass das Vorhandensein des mehr View Controller (Navigationsleiste) die UIView nach ihrer Höhe drückt. Ich weiß auch, dass diese Höhe = 44px. Ich habe auch festgestellt, dass dieser Schub nach unten das beibehält [self.view].frame.origin.y = 0.

Wie bestine ich also die Höhe dieser Navigationsleiste, abgesehen davon, als sie nur auf eine Konstante einzustellen?

Oder, kürzere Version, wie stelle ich fest, dass meine UIView mit der Navigationsleiste oben angezeigt wird?


Die Glühbirne kam zu. Leider habe ich keinen einheitlichen Weg entdeckt, um das Problem zu beheben, wie unten beschrieben.

Ich glaube, dass sich mein ganzes Problem auf meine Autorisierungsmasken konzentriert. Und der Grund, warum ich zu dem Schluss gekommen bin, dass es die gleichen Symptome gibt, die mit oder ohne UIWebview sind. Und dieses Symptom ist, dass alles für Porträt pfirsichfarben ist. Für die Landschaft taucht der untere Uibutton hinter der Tabbar auf.

Zum Beispiel habe ich von oben nach unten in einem UIView:

UIView - Beide Federn setzen (Standardfall) und keine Streben

UiscrollView - Wenn ich die beiden Federn einstellte und alles andere (wie die UIView) lösche, dann dringt der Uibutton das Objekt unmittelbar darüber ein. Wenn ich alles lösche, dann ist Uibutton in Ordnung, aber das Zeug ganz oben versteckt sich hinter dem Statusbuch nur die obere Strebe, der Uibutton spielt hinter der Tab -Bar herab.

Uilabel und Uiimage Nächst vertikal - oberste Strebe -Set, überall sonst flexibel

Nur um das Bild für die wenigen zu vervollständigen, die eine UIWebview haben:

UIWebview - Streben: Oben, links, rechte Quellen: Beide

Uibutton - Nichts Set, dh überall flexibel

Obwohl meine Glühbirne schwach ist, scheint es Hoffnung zu geben.


Bitte tragen Sie es mit mir, weil ich mehr Platz brauchte als das für einen kurzen Antwortkommentar.

Danke, dass du versuchst zu verstehen, wofür ich wirklich fische ... Also hier geht es.

1) Jeder UIViewController (eine Tabbar -App) verfügt über eine Benutzeroberfläche, einen Text und was auch immer oben. Ein weiterer gemeinsamer Nenner ist ein Uibutton am Boden. Auf einigen der UIViewController habe ich eine UIWebview über dem Uibutton.

Also, UIImage, Text usw. UIWebview (auf einigen) Uibutton

Um all das oben zu umgeben, ist eine Uiscrollview.

2) Für diejenigen, die eine UIWebView haben, sieht die Autorisierungsmaskas aus wie:

   —
   |
   —

   ^
   |
   |

| - | ← ---- → |-| | | V Die Maske des Uibutton hat nichts 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 außer dem Uibutton, das ich mit IB platziert habe.

Wenn ich eine UIWebView habe, bestmege ich die Höhe des *Inhalts *und stelle seinen Rahmen so ein, dass der gesamte Inhalt eingeschlossen ist.

UIScrollView *scrollViewInsideWebView = [[webView_ subviews] lastObject];
webViewContentHeight = scrollViewInsideWebView.contentSize.height;
[webView_ setFrame:CGRectMake(webViewOriginX, webViewOriginY,
                          sameWholeViewScrollerWidth, webViewContentHeight)]

Sobald ich das tue, schiebe ich das Uibutton programmgesteuert nach unten, damit er unter die UIWebview platziert ist.

Alles funktioniert, bis ich es von Porträt zu Landschaft drehte.

Ich nenne meine RepositionSubviews in meiner Didrotatefrominterfaceorientierung.

Warum ändert sich die Inhaltshöhe meiner UIWebview nicht mit der Rotation?

Von Porträt bis Landschaft sollte sich die Inhaltsbreite ausdehnen und die Inhaltshöhe schrumpfen. Es tut visuell, wie es sollte, aber nicht nach meinem NSlog.

Wie auch immer, mit oder ohne UIWebview, die Schaltfläche, über die ich gesprochen habe, bewegt sich im Landschaftsmodus unterhalb der Tabbar. Ich sehe es hinter der Tabbar, wenn ich "heftig" scrolle, aber dann "fällt es zurück" hinter der Tabbar.

Fazit, dieser letzte ist der Grund, warum ich nach der Höhe der Tabbar und der Navigationsleiste gefragt habe, da sich die Tabbars am unteren Rand des Uiviews und die Navigationsleiste auf die UIView drückt.

Jetzt werde ich hier einen oder zwei Kommentare hinzufügen, weil sie früher keinen Sinn gemacht hätten.

Ohne UIWebView lasse ich alles so, wie es von IB zu sehen ist.

Mit einem UIWebView erhöhe ich den Rahmen des UIWebView.

Nun, da hast du es.

War es hilfreich?

Lösung 7

Die Glühbirne kam zu. Leider habe ich keinen einheitlichen Weg entdeckt, um das Problem zu beheben, wie unten beschrieben.

Ich glaube, dass sich mein ganzes Problem auf meine Autorisierungsmasken konzentriert. Und der Grund, warum ich zu dem Schluss gekommen bin, dass es die gleichen Symptome gibt, die mit oder ohne UIWebview sind. Und dieses Symptom ist, dass alles für Porträt pfirsichfarben ist. Für die Landschaft taucht der untere Uibutton hinter der Tabbar auf.

Zum Beispiel habe ich von oben nach unten in einem UIView:

UIView - Beide Federn setzen (Standardfall) und keine Streben

UiscrollView - Wenn ich die beiden Federn setze und alles andere (wie die UIView) lösche, dann drückt das Uibutton das Objekt unmittelbar darüber ein. Wenn ich alles lösche, dann ist Uibutton in Ordnung, aber das Zeug ganz oben versteckt sich hinter dem Statusbuch nur die obere Strebe, der Uibutton spielt hinter der Tab -Bar herab.

Uilabel und Uiimage nächstes vertikal - oberes Strebenset, überall sonst flexibel

Nur um das Bild für die wenigen zu vervollständigen, die eine UIWebview haben:

UIWebView - Streben: oben, links, rechte Quellen: Beide

Uibutton - Nichts Set, dh überall flexibel

Obwohl meine Glühbirne schwach ist, scheint es Hoffnung zu geben.

Andere Tipps

So etwas tun?

    NSLog(@"Navframe Height=%f",
        self.navigationController.navigationBar.frame.size.height);

Die schnelle Version ist befindet sich hier


AKTUALISIEREN

iOS 13

Als die statusBarFrame war veraltet in iOS13 Sie können dies verwenden:

extension UIViewController {

    /**
     *  Height of status bar + navigation bar (if navigation bar exist)
     */

    var topbarHeight: CGFloat {
        return (view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0.0) +
            (self.navigationController?.navigationBar.frame.height ?? 0.0)
    }
}

Mit iPhone-X wird die Höhe der oberen Balken (Navigationsleiste + Statusleiste) geändert (erhöht).

Versuchen Sie dies, wenn Sie eine genaue Höhe der oberen Balken (beide Navigationsleiste + Statusleiste) wünschen:

AKTUALISIEREN

iOS 13

Als die statusBarFrame war veraltet in iOS13 Sie können dies verwenden:

extension UIViewController {

    /**
     *  Height of status bar + navigation bar (if navigation bar exist)
     */

    var topbarHeight: CGFloat {
        return (view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0.0) +
            (self.navigationController?.navigationBar.frame.height ?? 0.0)
    }
}

Ziel c

CGFloat topbarHeight = ([UIApplication sharedApplication].statusBarFrame.size.height +
       (self.navigationController.navigationBar.frame.size.height ?: 0.0));

Swift 4

let topBarHeight = UIApplication.shared.statusBarFrame.size.height +
        (self.navigationController?.navigationBar.frame.height ?? 0.0)

Versuchen Sie zur Leichtigkeit diese UIViewController -Erweiterung

extension UIViewController {

    /**
     *  Height of status bar + navigation bar (if navigation bar exist)
     */

    var topbarHeight: CGFloat {
        return UIApplication.shared.statusBarFrame.size.height +
            (self.navigationController?.navigationBar.frame.height ?? 0.0)
    }
}

Swift 3

let topBarHeight = UIApplication.sharedApplication().statusBarFrame.size.height +
(self.navigationController?.navigationBar.frame.height ?? 0.0)

Schnell Ausführung:

let navigationBarHeight: CGFloat = self.navigationController!.navigationBar.frame.height

Hast du das versucht?

let barHeight = self.navigationController?.navigationBar.frame.height ?? 0
UIImage*image = [UIImage imageNamed:@"logo"];

float targetHeight = self.navigationController.navigationBar.frame.size.height;
float logoRatio = image.size.width / image.size.height;
float targetWidth = targetHeight * logoRatio;

UIImageView*logoView = [[UIImageView alloc] initWithImage:image];
// X or Y position can not be manipulated because autolayout handles positions.
//[logoView setFrame:CGRectMake((self.navigationController.navigationBar.frame.size.width - targetWidth) / 2 , (self.navigationController.navigationBar.frame.size.height - targetHeight) / 2 , targetWidth, targetHeight)];
[logoView setFrame:CGRectMake(0, 0, targetWidth, targetHeight)];
self.navigationItem.titleView = logoView;

// How much you pull out the strings and struts, with autolayout, your image will fill the width on navigation bar. So setting only height and content mode is enough/
[logoView setContentMode:UIViewContentModeScaleAspectFit];

/* Autolayout constraints also can not be manipulated since navigation bar has  immutable constraints
self.navigationItem.titleView.translatesAutoresizingMaskIntoConstraints = false;

NSDictionary*metricsArray = @{@"width":[NSNumber numberWithFloat:targetWidth],@"height":[NSNumber numberWithFloat:targetHeight],@"margin":[NSNumber numberWithFloat:20]};
NSDictionary*viewsArray = @{@"titleView":self.navigationItem.titleView};

[self.navigationItem.titleView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>margin=)-H:[titleView(width)]-(>margin=)-|" options:NSLayoutFormatAlignAllCenterX metrics:metricsArray views:viewsArray]];
[self.navigationItem.titleView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[titleView(height)]" options:0 metrics:metricsArray views:viewsArray]];

NSLog(@"%f", self.navigationItem.titleView.width );
*/

Wir brauchen also nur, was wir brauchen, ist

UIImage*image = [UIImage imageNamed:@"logo"];
UIImageView*logoView = [[UIImageView alloc] initWithImage:image];
float targetHeight = self.navigationController.navigationBar.frame.size.height;
[logoView setFrame:CGRectMake(0, 0, 0, targetHeight)];
[logoView setContentMode:UIViewContentModeScaleAspectFit];

self.navigationItem.titleView = logoView;

Meine Bewerbung hat einige Ansichten, bei denen eine angepasste Navigationsleiste in der Benutzeroberfläche zum Erscheinungsbild erforderlich war, jedoch ohne Navigationscontroller. Die Anwendung ist erforderlich, um die iOS -Version vor iOS 11 zu unterstützen, sodass der praktische Layout -Layouthandbuch nicht verwendet werden konnte, und ich muss die Position und Höhe der Navigationsleiste programmatisch anpassen.

Ich habe die Navigationsleiste direkt an ihre Übersicht angehängt und die oben erwähnte Layouthandbuch für sichere Bereiche übersprungen. Und die Statusbalkenhöhe könnte leicht aus der UIAPPLICATION abgerufen werden, aber die Standardhöhe der Navigationsleiste ist wirklich ein Schmerzmittel ...

Es fiel mir fast eine halbe Nacht mit einer Reihe von Suchen und Tests auf, bis ich endlich den Hinweis aus einem anderen Beitrag bekam (aber nicht für mich arbeitet), dass Sie tatsächlich die Höhe von uiView.Sizethatfits () wie diese erhalten könnten :

- (void)viewWillLayoutSubviews {
    self.topBarHeightConstraint.constant = [UIApplication sharedApplication].statusBarFrame.size.height;
    self.navBarHeightConstraint.constant = [self.navigationBar sizeThatFits:CGSizeZero].height;

    [super viewWillLayoutSubviews];    
}

Schließlich eine perfekte Navigationsleiste, die genauso aussieht wie die eingebaute!

Hier ist der Beginn meiner Antwort auf Ihr Update:

Warum ändert sich die Inhaltshöhe meiner UIWebview nicht mit der Rotation?

Könnte es sein, dass Ihre automatische Größe nicht über die Autorisierungsmaskierung für alle Richtungen verfügt?

Ein weiterer Vorschlag, bevor ich dazu zurückkomme, könnten Sie eine Symbolleiste für Ihre Bedürfnisse verwenden. Es ist etwas einfacher, wird immer unten, automatische Positionen/Positionen sein. Sie können es nach Belieben verstecken/zeigen usw. irgendwie wie folgt: http://cdn.artoftheiphone.com/wp-content/uploads/2009/01/yellow-pages-iphone-app-2.jpg

Sie haben sich vielleicht diese Option angesehen, aber einfach dort rausgeworfen.

Eine andere Idee, könnten Sie möglicherweise erkennen, aus welcher Ausrichtung Sie sich drehen, und platzieren Sie einfach die Taste programmgesteuert, um die Registerkarte anzupassen. (Dies ist mit Code möglich)

Ich habe benutzt:

let originY: CGFloat = self.navigationController!.navigationBar.frame.maxY

Arbeiten Sie großartig, wenn Sie die Navigationsleistehöhe und ihren Ursprung erhalten möchten.

Handy Swift 4 Extension, falls es für jemand anderen hilfreich ist.

import UIKit

extension UINavigationController {
  static public func navBarHeight() -> CGFloat {
    let nVc = UINavigationController(rootViewController: UIViewController(nibName: nil, bundle: nil))
    let navBarHeight = nVc.navigationBar.frame.size.height
    return navBarHeight
  }
}

Verwendungszweck:

UINavigationController.navBarHeight()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top