2010-02-01 20 views
8

Basit bir çözüme sahip olabilecek bir soruna benziyor, ancak buna yol açabilecek bir şey bulamadım. UISWrollView'u UIScrollView içinde kullanıyorum ve statusBar'a (içeriği en üste kaydırmak için) dokunmak işe yaramıyor.UIScrollView + UIWebView = NO scrollsToTop

Gerçekten UIWebViews hatasının olup olmadığını görmek için basit bir test uygulaması yaptım. Ve gerçekten öyle.

// scrolls to top on status bar tap 
UIScrollView *sv = [[UIScrollView alloc] init]; 
sv.frame = CGRectMake(0, 0, 320, 480); 
sv.contentSize = CGSizeMake(320, 1200); 
[self.view addSubview:sv]; 

// doesn't scroll 
UIScrollView *sv = [[UIScrollView alloc] init]; 
sv.frame = CGRectMake(0, 0, 320, 480); 
sv.contentSize = CGSizeMake(320, 1200); 

UIWebView *wv = [[UIWebView alloc] init]; 
wv.frame = CGRectMake(0, 0, 320, 100); 
[sv addSubview:wv]; 

[self.view addSubview:sv]; 

Yani, belki scrollToTop uğraşmak değil UIWebView yapmak devre dışı bir şey olduğunu düşünüyorum? Ya da bir çeşit çözüm de güzel olurdu.

Herhangi bir fikrin var mı?

cevap

7

Son bir geceye rastladım, en sonunda cevaba bir yoruma yorumda buldum.

- (void) ensureScrollsToTop: (UIView*) ensureView { 
    ((UIScrollView *)[[webView subviews] objectAtIndex:0]).scrollsToTop = NO; 
} 

Bu UIWebView ilk alt görünümden beri bana balık gibiydi bir alt sınıfı olmayan bir UIScroller olduğunu iddia: idea of that original post Eğer UIScrollingView için UIWebView eklediğinizde, aşağıdaki kullanmasıdır UIScrollView. UIScroller scrollsToTop özelliğini destekler olduğundan Ancak, dökme sadece derleyici uyarı geçmiş bize bir yol sağlar:

 
Class List: 
    Class = UIScroller 
    Class = UIView 
    Class = UIResponder 
    Class = NSObject 
Supported Methods: 
    ... 
    Method _scrollToTop 
    Method setScrollsToTop: 
    Method scrollsToTop 
    ... 
Supported Properties: 
    Property scrollsToTop 

DÜZENLEME: webViewDidFinishLoad geri aramasında: bu aslında gerçekleşmesi gereken yerler hakkında Bir başka hızlı not. Şimdi

:

- (void)webViewDidFinishLoad:(UIWebView *) wv {  
    [self ensureScrollsToTop: wv]; 
} 

DÜZENLEME # 2: UIWebView inşaat üzerine çağrılması soruna neden olanlardır ki, çünkü UIWebView henüz çocuk görünümleri var oluşturmadı o zaman yeterince iyi değil iOS 5'de, iPhone OS: Tap status bar to scroll to top doesn't work after remove/add back'da belirtildiği gibi, UIWebView'ın yeni @ özellik kaydırma Görünümü'nü kullanarak iOS 5.0'dan daha düşük dağıtım hedeflerini kullanmayan projeler için ensureScrollsToTop uygulamasını gereksiz hale getirin.

+0

Teşekkürler nivekastoreth, bu beni rahatsız ediyordu. Ben sadece 'bir' ('in' eminScrollsToTop ve webview delici ayarlamak için bu webViewDidFinishLoad denir bulan herkes başkalarına hatırlatmak istiyorum işaret etmek istiyorum. –

+0

bu çalışır, ama muhtemelen kastediyorum: ((UIScrollView *) [[webView alt görünümleri] objectAtIndex: 0]) scrollsToTop = YES; –

+0

Şu andaki belleğim biraz bulanık, ama hatırladığım gibi, sorun scrollsToTop'u NO olarak ayarlamanız gerektiğidir. çoklu kaydırma görünümleri YES döndürürse (çocuklara zincirleme yaptıkça) bu işlevselliği gerçekten devre dışı bırakır.Yalnızca bir kaydırma görünümü YES döndürürse, yalnızca etkin olur. – nivekastoreth

3

iPhone OS'de, geçerli viewController'da birden fazla UIScrollView (veya UITWebView gibi alt sınıfı, örneğin UITWebView) varsa, sistem hangi UIScrollView öğesinin en üste kaydırılacağını bilmez.

Hızlı düzeltme: scrollsToTop'u desteklemek istemediğiniz tüm UIScrollViews için, scrollsToTop'u NO olarak ayarlayın, sonra her şey mükemmel çalışır. Varsayılan olarak

self.scrollView1.scrollsToTop = NO; 
self.scrollView2.scrollsToTop = NO; 
self.scrollView1.scrollsToTop = YES; // by default scrollsToTop is set as YES, this line is not necessary 
0

Webviews scrollsToTop-değeri YES olacaktır. Bu özel sorun için basit bir sınıf yazdım. Uygulamamda birden fazla web görüntüleme ve kaydırma görünümü kullanıyoruz. Bu çok daha kolay hale getirir.

https://gist.github.com/hfossli/6776203

Temelde belirtiyorsanız olandan diğer tüm scrollViews üzerinde NO için scrollsToTop ayarlar.

Davamı eklemek istediğiniz
0

, ben as h4xxr said, bir UIScrollView bir UIWebView ekleyin:

bir scrollViewDidScrollToTop mesajı Yani

ihmal edilir birden fazla kaydırma görünümü varsa, ben olsun webView üzerinde çalışmasını sağlamanın basit bir yolu: sadece scrollViewToS özelliğini scrollsToTop özelliğini ayarlayın.

Durum çubuğuna dokunduğunuzda, scrollView tarafından yakalanmadı ve web Görünümü en üste kayar!

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