76

So che la presenza del controller di visualizzazione più (barra di navigazione) spinge verso il basso l'UIView in base all'altezza. So anche che questa altezza = 44 px. Ho anche scoperto che questo push down mantiene lo [self.view].frame.origin.y = 0.Altezza della barra di navigazione a livello di programmazione

Quindi, come determinare l'altezza di questa barra di spostamento, oltre a impostarla su una costante?

Oppure, versione più breve, come si determina che il mio UIView viene visualizzato con la barra di navigazione in alto?


La lampadina ha iniziato ad accendersi. Sfortunatamente, non ho scoperto un modo uniforme per correggere il problema, come descritto di seguito.

Credo che tutto il mio problema si concentri sulle mie funzioni di autoresizing. E il motivo per cui ho concluso che esistono gli stessi sintomi, con o senza UIWebView. E quel sintomo è che tutto è peachy per Portrait. Per Paesaggio, l'UIButton più in basso si apre dietro il TabBar.

Ad esempio, su un UIView, ho, dall'alto verso il basso:

UIView - entrambe le molle fissate (predefinita) e non puntoni

UIScrollView - Se fisso le due molle, e chiaro tutto il resto (come l'UIView), quindi l'UIButton si intromette sull'oggetto immediatamente sopra di esso. Se cancello tutto, allora UIButton è OK, ma il materiale nella parte superiore si nasconde dietro lo StatusBar. Impostando solo il puntone superiore, l'UIButton si apre dietro la Barra delle Tabulazioni.

UILabel e UIImage prossimo verticale - puntone set top, flessibile ovunque

Giusto per completare il quadro per i pochi che hanno un'UIWebView:

UIWebView - Struts: alto, a sinistra, a destra Springs: entrambi

UIButton - niente di set, vale a dire, flessibile ovunque

Anche se la mia lampadina è fioca, sembra che vi sia speranza.


Si prega di sopportare me perché avevo bisogno di più spazio di quello previsto per un breve commento di risposta.

Grazie per aver cercato di capire cosa sto veramente pescando ... quindi ecco qui.

1) Ogni UIViewController (un'app TabBar) ha un UIImage, del testo e quant'altro in alto. Un altro comune denominatore è un UIButton in basso. Su alcuni UIViewController ho una UIWebView sopra UIButton.

Quindi, UIImage, testo, ecc UIWebView (su alcuni) UIButton

circonda tutto quanto sopra è un UIScrollView.

2) Per coloro che hanno un UIWebView, la sua autoresizingMask assomiglia:

— 
    | 
    — 

^
    | 
    | 

| - | ← ---- → | - | | | V maschera del UIButton ha fissato, vale a dire, flessibile ovunque

Nel mio -viewDidLoad nulla, chiamo i miei -repositionSubViews entro il quale ho effettuare le seguenti operazioni:

Se non c'è UIWebView, non faccio niente, tranne il centro l'UIButton che ho inserito con IB.

Se si dispone di un UIWebView, quindi determinare il suo * contenuto * Altezza e impostare la sua cornice per racchiudere l'intero contenuto.

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

Una volta fatto questo, poi spingere la programmazione UIButton in modo che finisce posto sotto UIWebView.

Tutto funziona, finché non lo ruoto da Verticale a Orizzontale.

Io chiamo my -repositionSubViews all'interno del mio -didRotateFromInterfaceOrientation.

Perché l'altezza del contenuto della mia UIWebView non cambia con la rotazione ?.

Da Verticale a Orizzontale, la larghezza del contenuto dovrebbe espandersi e l'altezza del contenuto dovrebbe ridursi. Lo fa visivamente come dovrebbe, ma non secondo il mio NSLog.

In ogni caso, con o senza UIWebView, il pulsante di cui ho parlato si sposta sotto TabBar in modalità Orizzontale ma non si scorre per essere visto. Lo vedo dietro al TabBar quando faccio scorrere "vigorosamente", ma poi "cade indietro" dietro il TabBar.

Bottom line, quest'ultimo è il motivo per cui ho chiesto l'altezza del TabBar e del NavigationBar perché il TabBar si posiziona nella parte inferiore di UIView e il NavigationBar spinge l'UIView in basso.

Ora, ho intenzione di aggiungere un commento o due qui perché non avrebbero avuto senso prima.

Senza UIWebView, lascio tutto come è visto da IB.

Con UIWebView, aumenta il frame di UIWebView.altezza del suo contenutoAltezza e regola anche l'altezza del UIScrollView circostante che circonda tutte le viste secondarie.

Bene, ce l'hai.

risposta

1

La lampadina iniziato a venire su. Sfortunatamente, non ho scoperto un modo uniforme per correggere il problema, come descritto di seguito.

Credo che tutto il mio problema si concentri sulle mie funzioni di autoresizing. E il motivo per cui ho concluso che esistono gli stessi sintomi, con o senza UIWebView. E quel sintomo è che tutto è peachy per Portrait.Per Paesaggio, l'UIButton più in basso si apre dietro il TabBar.

Ad esempio, su un UIView, ho, dall'alto verso il basso:

UIView - due molle set (predefinita) e nessuna puntoni

UIScrollView - Se impostare la due molle e cancella tutto il resto (come l'UIView), quindi l'UIButton si intromette sull'oggetto immediatamente sopra di esso. Se elimino tutto, UIButton è OK, ma le cose nella parte superiore si nascondono dietro lo StatusBar Impostando solo il puntone superiore, l'UIButton si apre verso il basso dietro la barra delle schede.

UILabel e UIImage prossimo verticale - puntone set top, flessibile ovunque

Giusto per completare il quadro per i pochi che hanno un'UIWebView:

UIWebView - Struts: alto, a sinistra , destra Springs: sia

UIButton - set di niente, vale a dire, flessibile ovunque

Sebbene la mia lampadina sia scarsa, sembra che ci sia speranza.

+0

Impostare il puntone superiore e impostare le due molle di UIWebView - problema risolto e grazie grappoli. In effetti, il mio unico problema rimanente è progettare quei grafici maledetti @ 2X, ecc. Uso GraphicConverter in modo molto semplice e funziona molto bene per la progettazione di pagine Web. Ma tutta questa roba da 30px, 57px - per me, sto andando in un territorio inesplorato, almeno. –

204

Fai qualcosa del genere?

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

La versione rapida è located here

+0

Grazie, grazie. MA, ora che hai risolto il problema, come faccio a determinare se NavigationController, ovvero MostViewController, viene visualizzato per la mia app della barra delle schede. –

+0

Non capisco quello che stai cercando di dire. Stai cercando di capire se MostViewController sta mostrando? (Se sì, cosa vuoi fare?) E in caso contrario, potresti chiarire cosa intendi esattamente? – Sum

+0

Ho letto di nuovo la tua domanda e ancora non ho capito cosa vuoi fare? Se vuoi fare qualcosa quando appare la vista, devi inserire il codice in viewDidAppear. Se chiarisci un po ', renderebbe più facile capire cosa vuoi fare. – Sum

1

Ecco l'inizio della mia risposta alla vostra aggiornamento:

Perché l'altezza del contenuto del mio UIWebView non cambia con la rotazione ?.

Potrebbe essere perché il ridimensionamento automatico non ha la maschera di autorizzazione per tutte le direzioni?

Un altro suggerimento prima che torni per questo, potresti utilizzare una barra degli strumenti per le tue esigenze. È un po 'più semplice, sarà sempre sul fondo, auto-ruota/posizioni. Puoi nasconderla/mostrarla a piacimento, ecc. Un po 'come questo: http://cdn.artoftheiphone.com/wp-content/uploads/2009/01/yellow-pages-iphone-app-2.jpg

Potresti aver guardato quell'opzione, ma semplicemente lanciandola là fuori.

Un'altra idea, è possibile individuare l'orientamento da cui si sta ruotando e posizionare il pulsante a livello di programmazione per regolare la barra delle schede. (Questo è possibile con il codice)

+0

Dopo circa 2 settimane per affrontare questo problema, ho deciso che il "problema" è stato reso più difficile posizionando un UIButton SOTTO la sottoview di UIWebView. Quindi, ho messo il pulsante SOPRA. Francamente, non sembra proprio "giusto" in quel modo ... ma ora funziona SORT OF. SOTTO o SOPRA l'UIWebView ha impostato il montante superiore e solo la molla orizzontale. BTW, è il contentHeight di UIWebView che non cambia con la rotazione. –

50

Swift versione:

let navigationBarHeight: CGFloat = self.navigationController!.navigationBar.frame.height 
3
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); 
*/ 

Quindi tutto abbiamo veramente bisogno è

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; 
4

Hai provato questo?

let barHeight = self.navigationController?.navigationBar.frame.height ?? 0 
4

Con iPhone-X, l'altezza della barra superiore (barra di navigazione + barra di stato) viene modificata (aumentata).

Prova questo se si desidera che l'altezza esatta della barra superiore (entrambe di navigazione bar + barra di stato):

Objective-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) 

Per facilità, prova questa estensione UIViewController

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)