Nonaktifkan Scroll di UIWebView diizinkan?


91

Saya harus menunjukkan artikel web dengan artikel di UITableViewbawah.

Satu-satunya pilihan yang saya temukan adalah menampilkan artikel di UIWebViewdalam header tableView.

Untuk melakukan itu saya harus mendapatkan ketinggian konten webView dan saya harus menonaktifkan scrolling untuk webView.

Saya menemukan dua solusi untuk menonaktifkan pengguliran:

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

atau di JavaScript:

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

Saya mendengar bahwa solusi pertama dilarang oleh Apple tetapi saya tidak memiliki buktinya. Akankah aplikasi saya ditolak dengan menggunakan solusi ini? Jika ya, dapatkah saya menggunakan solusi kedua tanpa ditolak?

Jawaban:


298

Dimulai dengan iOS5, kami memiliki akses langsung ke tampilan gulir UIWebView.
Anda dapat menonaktifkan pengguliran dan pantulan seperti ini:

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

3
terima kasih banyak, itulah yang saya cari. @jsddour, Anda harus menandai jawaban ini sebagai diterima!
marcgg

Untuk beberapa alasan, ini tidak berhasil untuk saya. :-( Saya telah meletakkan ScrollView dan telah meletakkan UIWebView di dalamnya. Kemudian setel 2 baris di atas dalam metode viewWillAppear. Tetapi scroll masih berfungsi di tampilan web. Adakah yang bisa membantu ?? Sekadar informasi, saya menjalankannya di Simulator iOS 7.
Amogh Natu

apa gunanya webView.scrollView.bounces = NO;? karena kode di baris pertama telah menonaktifkan pengguliran.
Gon

1
Senang bila orang-orang menjawab dan berlari tanpa meluangkan waktu untuk memberikan suara positif kepada penyumbang. Apakah tidak ada cara untuk memberi tahu pengguna agar memilih jawaban untuk dipilih?
John Cogan

1
untuk webView.scrollView.scrollEnabled = false / webView.scrollView.bounces = false
Chathuranga Silva

26

Karena pertanyaan ini masih berlaku, ada cara baru untuk melakukannya! (iOS 7.0+, mungkin iOS 6 juga, tidak dikonfirmasi)

webView.scrollView.scrollEnabled = NO;

Hati hati :)


Yang tidak saya mengerti adalah mengapa itu tidak ada di IB: /, cmon APPLE apa yang Anda lakukan! Solusi yang sangat bagus!
Mahmud Ahmad

20

Anda cukup menyetel properti interaksi pengguna tampilan web ke no yaitu

webView.userInteractionEnabled = NO;

Ini cukup sederhana dan berfungsi dengan baik, terima kasih :)


28
Namun, ini mencegah tautan diketuk.
Graham Perks

@GrahamPerks Saya telah mengedit jawaban sehubungan dengan komentar Anda, silakan tinjau dan setujui, terima kasih :)
Eshwar Chaitanya

12

untuk semua versi ios Anda dapat menggunakan kode ini sebagai ganti setScrollEnabled:

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

pertama, saya mencoba metode "setScrollEnabled" dan apple menolak ipa saya. Kemudian saya mengubah metode ini dan menerimanya.
mturhan55

12

Gunakan yang ini <body ontouchmove="event.preventDefault()">


10

Versi SWIFT 3

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

7

Saya pikir Javascript

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

sejauh ini merupakan solusi terbaik.

Memang :

Contoh pertama Anda, atau

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

satu (hal yang sama) dapat ditolak karena tidak didokumentasikan, atau membuat aplikasi Anda mogok dalam pembaruan iOS lebih lanjut.

Dan

[[myWebView scrollView] setBounces:NO];

metode tidak akan bekerja dengan iOS <5.


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

yang menyortirnya untuk saya


4
Akan sangat salah untuk mengandalkan ini karena ini bukan API yang terbuka.
Deepak Danduprolu

[[[Sub-tampilan WebView] lastObject] setScrollingEnabled: NO]; yang menyortirnya untuk saya. Bagaimanapun, itu tidak menjawab pertanyaanku. Pertanyaan saya, apakah saya diperbolehkan melakukan itu? Tampaknya menonaktifkan gulir melalui SDK dilarang. Tapi saya tidak yakin. Dan bagaimana dengan menonaktifkan gulir melalui javascript.
jsaddour

tidak ada bukti bahwa saran saya akan menyebabkan penolakan oleh apple, faktanya, dengan memanggil subiew terakhir di subviews array dan pengaturan scrollingEnabled terhadapnya terkena API? pasti?. dan ya lakukanlah karena Anda bisa menggunakannya. tidak tahu melalui javascript sekalipun. Maaf.
theiOSDude

3
Tidak, Anda tidak boleh melakukan ini. Seperti yang dikatakan Deepak, Anda tidak dapat mengandalkan urutan subview internal yang tidak berdokumen di salah satu elemen UI Apple. Jika mereka mengubah struktur internal dalam pembaruan OS di masa mendatang, aplikasi Anda akan macet. Mereka secara khusus memperingatkan tentang melakukan ini di banyak tempat, dan banyak aplikasi rusak dalam peningkatan ke iPhone OS 3.0 hanya karena mereka melakukan ini.
Brad Larson

5

Yang pertama ditolak oleh Apple. Itu terjadi pada saya pagi ini.



4

Menurut saya opsi pertama tidak dilarang oleh Apple.

Kamu bisa mencoba

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

Jika Anda tidak ingin tautan apa pun berfungsi di UIWebView, Anda juga bisa melakukannya

[myWebView setUserInteractionEnabled:NO];

4

Gunakan :

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

3

Coba ini,

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

3

Saya menempatkan beberapa UIWebViewdi dalam a UIScrollViewdan itu tidak menggulir untuk saya, kecuali saya menonaktifkan interaksi pengguna di tampilan web (bahkan dengan [[webview scrollview] setScrollEnabled:NO]). Jadi saya menempatkan UIWebViews di dalam a UIViewdan itu berhasil untuk saya tetapi kemudian tautan interaktif atau div di HTML saya di dalam UIWebViewtidak berfungsi lagi.

Satu-satunya hal yang berhasil bagi saya adalah mempertahankan bagian UIWebViewdalam UIScrollViewsehingga interaksi HTML berfungsi tetapi UIScrollingtidak.

Saya kemudian membuat delegasi khusus untuk tampilan web untuk mendengarkan window.open("http:/customEvent")yang dipanggil dari HTML yang terdapat dalam tampilan web. Saya juga menambahkan deteksi gesekan JavaScript yang akan menjalankan acara khusus saya.

Ketika delegasi tampilan web menerima ini, saya meneruskan pemberitahuan ke pengontrol yang kemudian secara dinamis menggulir my UIScrollView. Jelas saya harus membangun logika untuk memantau dan menggulir ke halaman berikutnya atau sebelumnya. Bukan solusi tercantik tapi ini berhasil untuk saya.


3

Coba ini di HTML ( <HEAD>tag) Anda

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

Ini akan menonaktifkan pengguliran di halaman web Anda.

(berfungsi di halaman web apa pun, tidak hanya UIWebView)


2

Saya perlu menonaktifkan scrolling karena menutup keyboard kustom benar-benar mengacaukan scrolling dengan webView. Tidak ada yang berhasil dan saya menggunakan sesuatu seperti ini:

-(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

Apakah UIWebview dan UITableView pada UIScrollview, dan pengaturan ketinggian webview (dan menambahkan total ContentSize dari Scrollview) seperti yang Anda inginkan?


Hampir. Namun tampaknya tidak terlalu rumit untuk menampilkan WebView di header tableView. Tapi pertanyaan saya adalah: Saya diizinkan untuk menonaktifkan webView scroll through SDK? Jika tidak, saya diizinkan untuk melakukannya melalui javascript?
jsaddour

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

1
itu akan bekerja sampai pembaruan di mana tempat tampilan gulir akan berubah
Martin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.