3

Meine Anwendung verwendet einen UINavigationController und die letzte Ansicht (Detailansicht) ermöglicht es Ihnen, eine externe Website innerhalb der Anwendung mit einem UIWebView anzuzeigen.Scrollbare UINavigationBar ähnlich Mobile Safari

Ich möchte einige zusätzliche Bildschirm Immobilien freigeben, wenn der Benutzer eine Webseite anzeigt und wollte wie Safari auf iPhone funktioniert, wo ihre URL-Leiste oben scrollt auf und aus dem Bildschirm, wenn Sie sehen Inhalt in der UIWebView, die unterhalb der Falte ist.

Hat jemand Ideen, wie man das erreicht? Wenn ich die Eigenschaft navigationBarHidden und meine eigene benutzerdefinierte Leiste oben setze und sie und ein UIWebView in einem UIScrollView setze, dann gibt es Scroll-Probleme in der UIWebView, da sie nicht gut mit anderen scrollbaren Ansichten zusammenspielt.

+0

ähnliche Probleme: http: // Stackoverflow.com/questions/21929220/show-hide-uitoolbar-match-finger-bewegung-genau-wie-für-beispiel-ios7-s Es ist extrem subtil, es GENAU wie Safari zu tun .... – Fattie

Antwort

0

Ich kann Ihnen keine klare Antwort geben, aber werfen Sie einen Blick auf iWebKit. Vielleicht bietet das eine Lösung. Die Demo enthält zumindest einen "Vollbild" -Eintrag.

1

Haben Sie einen Delegaten für die Scroll-Ereignisse im UIWebView und wenn Sie anfänglich mit dem Scrollen des UIWebView beginnen, erhöhen Sie die Höhe des UIWebView und verringern gleichzeitig die Y-Position, während Sie gleichzeitig den Navigationsbalken in Y-Richtung verschieben . Sobald die Navigationsleiste vollständig aus dem Blickfeld verschoben wurde, höre auf, die Größe des UIWebView zu erhöhen und erlaube nur das normale Scrollen.

Dadurch wird die Illusion erzeugt, dass die Navigationsleiste Teil des UIWebView ist, wenn sie über den Bildschirm scrollt.

Außerdem müssen Sie das Gegenteil tun, wenn Sie in die entgegengesetzte Richtung scrollen und den oberen Rand des Inhalts von UIWebView erreichen.

4

Basierend auf @ Brian Vorschlag habe ich diesen Code:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    CGFloat height = navigationBar.frame.size.height; 
    CGFloat y = scrollView.bounds.origin.y; 
    if (y <= 0) { 
     CGRect frame = navigationBar.frame; 
     frame.origin.y = 0; 
     navigationBar.frame = frame; 
    } else if (tableView.contentSize.height > tableView.frame.size.height) { 
     CGFloat diff = height - y; 
     CGRect frame = navigationBar.frame; 
     frame.origin.y = -y; 
     navigationBar.frame = frame; 

     CGFloat origin = 0; 
     CGFloat h = height; // height of the tableHeaderView 
     if (diff > 0) { 
      origin = diff; 
      h = y; 
     } 
     frame = tableView.frame; 
     frame.origin.y = origin; 
     frame.size.height = tableView.superview.frame.size.height - origin; 
     tableView.frame = frame; 

     CGRect f = CGRectMake(0, 0, tableView.frame.size.width, h); 
     UILabel* label = [[UILabel alloc] initWithFrame:f]; 
     tableView.tableHeaderView = label; 
     [label release]; 
    } 
} 

Mein Code einen UITableView hat aber soll mit jeder rollbaren Komponente arbeiten. Wenn Sie andere Komponenten als die navigationBar und die UIScrollView-Unterklasse haben, sollten Sie die Art ändern, wie die Höhe der scrollbaren Komponente berechnet wird. So etwas wie das:

Ich musste eine dumme tableHeaderView hinzufügen, um das gewünschte Verhalten zu haben. Das Problem war, dass, wenn scrollViewDidScroll: aufgerufen wird, der Inhalt einen Offset hat, aber der Apparience in Mobile Safari ist, dass der Inhalt nicht gescrollt wird, bis die navigationBar vollständig verschwindet. Ich habe versucht, zuerst die contentOffset.y auf 0 zu ändern, aber offensichtlich hat es nicht funktioniert, da der gesamte Code auf dem Scroll-Mechanismus beruht. Also habe ich gerade eine tableHeaderView hinzugefügt, deren Höhe genau der gescrollte Offset ist, also wird die Überschrift nie wirklich gesehen, und der Inhalt scheint nicht zu scrollen, bis die navigationBar vollständig verschwindet.

Wenn Sie die dumme tableHeaderView nicht hinzufügen, wird die bildlauffähige Komponente scheinbar hinter der navigationBar angezeigt.

enter image description here

Mit dem tableHeaderView ist das rollbare Komponente tatsächlich Scrolling (wie in der Bildlaufleiste zu sehen ist), aber da ein tableHeaderView deren Höhe es ist genau die gleiche, als der Offset gescrollt der rollbaren Inhalt erscheint nicht auf Scrollen werden, bis sie vollständig die navigationbar verschwindet:

enter image description here

+0

Ich möchte tun der gleiche Effekt aber mit UIWebview? Wie kann ich das machen? weil es keine Header-Ansicht hat, also irgendwie hart. jetzt verschiebe ich einfach die nav bar, und habe den web view frame das gleiche und ich habe nicht die clips subviews auf, so kann ich immer noch sehen und es bekommt den effekt, aber es erlaubt keine berührungen! also kann ich nicht an der Spitze scrollen und ich könnte ein paar Leute so könnte das ein Problem für mich sein. – Maximilian