2009-09-01 7 views
8

Stosując tę ​​metodę, aby ukryć pasek stanu:iPhone OS: status Tap bar, aby przewinąć do góry nie działa po usunąć/dodać z powrotem

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 

Podczas ustawiania „ukryte” z powrotem do nie, zaczepów to-scroll-to-top (w UIWebView, UITableView, cokolwiek) już nie działa i wymaga ponownego uruchomienia aplikacji, aby odzyskać funkcjonalność.

Czy jest to błąd (mimo to zgłosiłem rdar), czy też brakowało mi jakiegoś kroku? Czy powinienem oczekiwać takiego zachowania, ponieważ statusBar "traci kontakt" w jakiś sposób z odpowiednim widokiem?

Odpowiedz

18

Można spróbować ustawić właściwość ScrollsToTop true ponownie po ponownym pokazując go:

[currentView setScrollsToTop:YES]; 

Jeśli to nie działa, to na pewno są tylko pokazuje jeden widok? Jeśli istnieje więcej niż jeden przewijany widok, komunikat scrollViewDidScrollToTop jest ignorowany ...

+0

Bardzo dobra obserwacja. Prawdopodobnie zaczyna się mylić z wieloma widokami. Muszę sprawdzić, czy mogę znaleźć obejście. – avocade

+0

Problem polega na tym, że jest to UIWebView, który musi odzyskać przewijane do góry zachowanie - i nie jest to bezpośrednia podklasa UIScrollView ... w ten sposób setScrollsToTop: w ogóle nie działa. IT prawdopodobnie ma scrollView gdzieś w swojej strukturze UIWebViewInternal, ale wygląda na to, że jest _very_ opaque. [webView valueForKey: @ "_ scrollView"] nie działał w ogóle, aby uzyskać bezpośredni dostęp do niego. Jakieś inne imię zgaduje? :) – avocade

+0

Możesz dodać UIWebView jako wyeksponowany widok UIScrollView (w mojej implementacji jest to podgląd podrzędny UITableView). Jeśli jest to jedyny widok wewnątrz tego UIScrollView, wówczas wywołanie -setScrollsToTop na UIScrollView powinno sprawić, że będzie działało na UIWebView ... – h4xxr

0

Po prostu napotkałem podobne zachowanie w aplikacji, nad którą obecnie pracuję. W takim przypadku, jeśli wczytujesz film z YouTube z poziomu interfejsu użytkownika UIWebView, przewiń do najwyższych punktów pracy przez resztę cyklu życia aplikacji. Przypuszczam, że to może się zdarzyć po załadowaniu odtwarzacza filmowego, ale go nie potwierdziłem. Ta funkcjonalność była znacznie dłuższa i prawdopodobnie zawiera mniej błędów.

5

można użyć poniższy kod, żeby mieć UIWebView ignorować scrollToTop bez dodatkowego UIScrollView:

((UIScrollView *)[[webView valueForKey:@"_internal"] valueForKey:@"scroller"]).scrollsToTop = NO; 
+4

Ponieważ używa prywatnego połączenia API, prawdopodobnie spowoduje to odrzucenie Twojej aplikacji. Możesz być w stanie uciec '((UIScrollView *) [[webview subviews] objectAtIndex: 0]) scrollsToTop = NO;' –

+0

Dzięki Alex! O wiele bardziej elegancki i bezpieczny na pewno. –

+0

To działa dla mnie. Świetne rozwiązanie, dzięki! – Jasarien

3

miałem podobny problem po gry wideo YouTube w moim app. scrollsToTop był nadal ustawiony na YES, ale dotknięcie paska stanu nie przyniosło skutku.

W końcu zdałem sobie sprawę, że moje okno aplikacji nie jest już kluczowym oknem. Po dodaniu następujący wiersz do podklasy UIWindow (który miałem już z innych powodów), wszystko działało jak powinno znowu:

if (![self isKeyWindow]) [self makeKeyWindow]; 
5

miałem podobny problem, gdzie funkcja przewijania do góry zostało utracone. Okazuje się, że będzie działać tylko wtedy, gdy masz tylko jeden aktywny widok naraz (w tym samym widoku przewijania). W moim przypadku miałem widok stołu i inny widok, który byłby zanikany. Dodanie removeFromSuperview na końcu animacji rozwiązało problem.

Odpowiedź była w komentarzach UIScrollView.h plików:

/* 
this is for the scroll to top gesture. by default, a single scroll visible scroll view with this flag set will get the call. if there is more than one visible with this 
flag set or the delegeat method returns NO, the view isn't scrolled 
*/ 
@property(nonatomic) BOOL scrollsToTop;   // default is YES. if set, special gesture will scroll to top of view after consulting delegate 
7

Następująca poprawka przez Alex pracował dla mnie. Dzięki!

((UIScrollView *)[[webView subviews] objectAtIndex:0]).scrollsToTop = NO; 

Będąc w pośpiechu to fix działał świetnie, jednak więcej czasu mogę już podklasy z UIWebView i dostęp do chronionego elementu UIScrollView bezpośrednio.

Obawiam się, że metoda Alexa polega na tym, że zakłada ona, że ​​UIScrollView jest na poziomie zerowym subskrybentów (hermetyzacja umożliwia zmianę prywatnych elementów). Co sugeruje jeszcze jedno rozwiązanie:

for (UIView* v in [webView subviews]) 
{ 
    if ([v isKindOfClass:[UIScrollView class]]) 
    { 
     (UIScrollView *)v.scrollsToTop = NO; 
    } 
} 
10

W iOS 5.0 można uzyskać dostępu do właściwości Scrollview z UIWebView

webView.scrollView.scrollsToTop = YES; 
0

chcę dodać moim przypadku dodać UIWebView na UIScrollView, jak h4xxr odpowiedział na górze:

Jeśli istnieje więcej niż jeden widok Przewijanie scrollViewDidScrollToTop wiadomość jest ignorowana

Tak, otrzymuję prosty sposób, aby działał na webView: wystarczy ustawić właściwość scrollView · s scrollsToTop false.

Po dotknięciu paska stanu nie zostanie przechwycony przez scrollView, a webView przewinie się do góry!

UIScrollView *scrollView = [[UIScrollView alloc] init]; 
    scrollView.frame = self.view.bounds; 
    scrollView.scrollsToTop = false; //igore scrollView`s scrollsToTop 
    [self.view addSubview:scrollView]; 

    UIWebView *webView = [[UIWebView alloc] init]; 
    webView.frame = scrollView.bounds; 
    [scrollView addSubview:webView]; 
Powiązane problemy