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?

jsaddour
sumber

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;
Alex Stanciu
sumber
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 :)

Ryan Copley
sumber
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 :)

Eshwar Chaitanya
sumber
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;
    }
}
mturhan55
sumber
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()">

Gobi M
sumber
10

Versi SWIFT 3

    webView.scrollView.bounces = false
    webView.scrollView.isScrollEnabled = false
Ahmed Safadi
sumber
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.

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

yang menyortirnya untuk saya

theiOSDude
sumber
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.

Jane Sales
sumber
5

[[myWebView scrollView] setBounces: NO];

mafonya
sumber
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];
Nick Bull
sumber
4

Gunakan :

[[webView scrollView] setBounces:NO];
[[webView scrollView] setScrollingEnabled:NO];
Pawel Molodkin
sumber
3

Coba ini,

[(UIScrollView *)[[webView subviews] lastObject] setScrollEnabled:NO];    
Shanmugaraja G
sumber
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.

Menandai
sumber
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)

Gik
sumber
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;
    }
}
akiraspeirs
sumber
1

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

Henrik Erlandsson
sumber
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];
imran ahmed
sumber
1
itu akan bekerja sampai pembaruan di mana tempat tampilan gulir akan berubah
Martin