Bir UI'de Kaydırma Devre Dışı BırakWebView'a izin verildi mi?


91

Makalenin UITableViewaltında bir web makalesi göstermem gerekiyor .

Bulduğum tek seçenek, makaleyi UIWebViewtableView üstbilgisinde görüntülemekti.

Bunu yapmak için webView içeriğinin yüksekliğini almam ve webView için kaydırmayı devre dışı bırakmam gerekiyor.

Kaydırmayı devre dışı bırakmak için iki çözüm buldum:

for (id subview in webView.subviews)
    if ([[subview class] isSubclassOfClass: [UIScrollView class]])
        ((UIScrollView *)subview).scrollEnabled=NO;

veya JavaScript'te:

<script type="text/javascript">
touchMove = function(event) {
    event.preventDefault();
}

İlk çözümün Apple tarafından yasaklandığını duydum ama buna dair bir kanıtım yok. Başvurum bu çözüm kullanılarak reddedilecek mi? Eğer öyleyse, ikinci çözümü reddedilmeden kullanabilir miyim?

Yanıtlar:


298

İOS5'ten başlayarak, UIWebView'ın kaydırma görünümüne doğrudan erişime sahibiz.
Kaydırma ve zıplamaları şu şekilde devre dışı bırakabilirsiniz:

webView.scrollView.scrollEnabled = NO; 
webView.scrollView.bounces = NO;

3
çok teşekkürler, tam da aradığım buydu. @jsddour, bu yanıtı kabul edildi olarak işaretlemelisiniz!
marcgg

Nedense bu benim için çalışmıyor. :-( Bir ScrollView koydum ve içine bir UIWebView koydum. Sonra yukarıdaki 2 satırı viewWillAppear yönteminde ayarlayın. Ancak kaydırma hala web görünümünde çalışıyor. Biri yardımcı olabilir mi? Sadece bilgi için, onu çalıştırıyorum iOS 7 simülatörü.
Amogh Natu

ne işe yarar webView.scrollView.bounces = NO;? ilk satırdaki kod kaydırmayı devre dışı bıraktığından.
Gon

1
İnsanların bir cevap alıp katkıda bulunan kişiye bir oy vermek için zaman ayırmadan koşmasını sevin. Kullanıcıya oy vermek için bir cevap seçmesini bildirmenin bir yolu yok mu?
John Cogan

1
hızlı webView.scrollView.scrollEnabled = false / webView.scrollView.bounces = false
Chathuranga Silva için

26

Bu soru hala geçerli olduğundan, bunu yapmanın yeni bir yolu var! (iOS 7.0+, belki de iOS 6 da onaylanmadı)

webView.scrollView.scrollEnabled = NO;

Kendine iyi bak :)


Anlamadığım şey bunun neden IB'de olmadığı: /, cmon APPLE ne yapıyorsun! Yine de çok güzel bir çözüm!
Mahmud Ahmad

20

Web görünümü kullanıcı etkileşimi özelliğini hiçbir ie olarak ayarlayabilirsiniz.

webView.userInteractionEnabled = NO;

Oldukça basit ve iyi çalışıyor, teşekkürler :)


28
Ancak bu, bağlantılara dokunulmasını engeller.
Graham Perks

@GrahamPerks Yorumunuza göre cevabı düzenledim, nazikçe inceleyin ve onaylayın, teşekkürler :)
Eshwar Chaitanya

12

tüm ios sürümleri için setScrollEnabled yerine bu kodu kullanabilirsiniz:

for (UIView *view in webview.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
       UIScrollView *scrollView = (UIScrollView *)view;
       scrollView.scrollEnabled = NO;
    }
}

ilk olarak "setScrollEnabled" yöntemini deniyorum ve apple ipa'mı reddetti. Sonra bu yöntemi değiştirdim ve kabul ettim.
mturhan55

12

Bunu kullan <body ontouchmove="event.preventDefault()">


10

SWIFT 3 versiyonu

    webView.scrollView.bounces = false
    webView.scrollView.isScrollEnabled = false

7

Sanırım Javascript

<script type="text/javascript">
touchMove = function(event) {
event.preventDefault();
}

en iyi çözümdür.

Aslında :

İlk sınavınız veya

[[[WebView subviews] lastObject] setScrollingEnabled:NO];

bir (aynı şeyler) belgelenmediği için reddedilebilir veya başka bir ios güncellemesinde uygulamanızın çökmesine neden olabilir.

Ve

[[myWebView scrollView] setBounces:NO];

yöntem iOS <5 ile çalışmaz.


5
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

bu benim için sıraladı


4
Açık bir API olmadığı için buna güvenmek çok yanlış olur.
Deepak Danduprolu

[[[WebView alt görünümleri] lastObject] setScrollingEnabled: HAYIR]; bu benim için sıraladı. Her neyse, soruma cevap vermiyor. Sorum şu, bunu yapma iznim var mı? Görünüşe göre SDK üzerinden kaydırmayı devre dışı bırakmak yasak. Ama emin değilim. Ve javascript üzerinden kaydırmayı devre dışı bırakmaya ne dersiniz?
jsaddour

benim önerimin alt görünüm dizisindeki son alt görünümü çağırarak ve buna karşı scrollingEnabled ayarını yaparak Apple tarafından reddedilmesine neden olacağına dair hiçbir kanıt yok API açık mı? kesinlikle mi? ve evet bunun için gidin çünkü onu kullanabilirsiniz. javascript yoluyla hiçbir fikrim yok. afedersiniz.
theiOSDude

3
Hayır, bunu yapmamalısın. Deepak'ın dediği gibi, Apple'ın UI öğelerinden birindeki alt görünümlerin belgelenmemiş iç sırasına güvenemezsiniz. Gelecekteki bir işletim sistemi güncellemesinde dahili yapıyı değiştirirlerse, uygulamanız çökecektir. Bunu birden çok yerde yapma konusunda özellikle uyarıyorlar ve birçok uygulama, sırf bunu yaptıkları için iPhone OS 3.0'a yükseltmede başarısız oldu.
Brad Larson

5

İlki Apple tarafından reddedildi. Daha bu sabah başıma geldi.



4

İlk seçeneğin Apple tarafından yasaklandığını sanmıyorum.

Deneyebilirsin

[[[Webview subviews] lastObject] setScrollingEnabled:NO];

UIWebView'da herhangi bir bağlantının çalışmasını istemiyorsanız, şunu da yapabilirsiniz:

[myWebView setUserInteractionEnabled:NO];

4

Kullanın:

[[webView scrollView] setBounces:NO];
[[webView scrollView] setScrollingEnabled:NO];

3

Bunu dene,

[(UIScrollView *)[[webView subviews] lastObject] setScrollEnabled:NO];    

3

Bazı yerleştirilen UIWebViewbir iç s UIScrollViewve (hatta I webviews kullanıcı etkileşimi devre dışı sürece, benim için kaydırma değildi [[webview scrollview] setScrollEnabled:NO]). Bu yüzden s'leri a'nın UIWebViewiçine yerleştirdim UIViewve bu benim için işe yaradı, ancak sonra HTML'mdeki etkileşimli bağlantılar veya div'ler UIWebViewartık çalışmıyordu.

Benim için çalıştı tek şey tutmaktır UIWebViewiçindeki UIScrollViewHTML etkileşimleri iş ama o kadar UIScrollingdeğil.

Daha sonra window.open("http:/customEvent"), web görünümünde bulunan HTML'den çağrılan web görüntülemeleri için özel bir temsilci oluşturdum . Ayrıca özel etkinliğimi başlatacak bir JavaScript kaydırma algılaması ekledim.

Web görünümü temsilcisi bunu aldığında, bir denetleyiciye bir bildirim iletirim ve bu da daha sonra dinamik olarak UIScrollView. Açıkçası, sonraki veya önceki sayfayı izlemek ve kaydırmak için bir mantık oluşturmam gerekiyordu. En güzel çözüm değil ama benim için çalışıyor.


3

Bunu HTML'nizde ( <HEAD>etiketi) deneyin

<script> 
  document.ontouchmove = function(event) { event.preventDefault(); }
</script>

Web sayfanızda kaydırmayı devre dışı bırakır.

(sadece UIWebView'da değil, herhangi bir web sayfasında çalışır)


2

Kaydırmayı devre dışı bırakmam gerekiyordu çünkü özel bir klavyeyi kaldırmak, webView ile kaydırmayı gerçekten karıştırdı. Başka hiçbir şey işe yaramadı ve bunun gibi bir şeye başvurdum:

-(void)viewDidLoad{
  [super viewDidLoad];
  [self.webView.scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
  self.webView.scrollView.showsVerticalScrollIndicator = NO;
}  

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if (!CGPointEqualToPoint(self.webView.scrollView.contentOffset, CGPointZero)){
        self.contentOffset = CGPointZero;
    }
}

1

Bir UIScrollview üzerinde bir UIWebview ve bir UITableView ve web görünümünün yüksekliğini ayarlamak (ve Scrollview'un toplam ContentSize değerine eklemek) istediğiniz gibi mi?


Neredeyse. Ancak Web Görünümünü tableView başlığında görüntülemek daha az karmaşık görünüyor. Ama sorum şu: WebView kaydırmasını SDK üzerinden devre dışı bırakma iznim var mı? Değilse javascript ile yapabilir miyim?
jsaddour

1
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

1
kaydırma görüntüleme yerinin değişeceği güncellemeye kadar çalışacak
Martin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.