ปิดการใช้งาน Scroll บน UIWebView ที่อนุญาตหรือไม่


91

ฉันต้องแสดงบทความทางเว็บที่มีUITableViewใต้บทความ

ตัวเลือกเดียวที่ฉันพบคือการแสดงบทความในUIWebViewส่วนหัวของ tableView

ในการทำเช่นนั้นฉันต้องได้รับความสูงของเนื้อหา webView และฉันต้องปิดการใช้งานการเลื่อนสำหรับ webView

ฉันพบสองวิธีในการปิดใช้งานการเลื่อน:

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

หรือใน JavaScript:

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

ฉันได้ยินมาว่าวิธีแก้ปัญหาแรกถูกห้ามโดย Apple แต่ฉันไม่มีข้อพิสูจน์ใด ๆ ใบสมัครของฉันจะถูกปฏิเสธโดยใช้วิธีนี้หรือไม่? ถ้าเป็นเช่นนั้นฉันสามารถใช้แนวทางที่สองโดยไม่ถูกปฏิเสธได้หรือไม่?

คำตอบ:


298

เริ่มต้นด้วย iOS5 เราสามารถเข้าถึง scrollview ของ UIWebView ได้โดยตรง
คุณสามารถปิดการเลื่อนและการตีกลับได้ดังนี้:

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

3
ขอบคุณมากนั่นคือสิ่งที่ฉันกำลังมองหา @jsddour คุณควรทำเครื่องหมายคำตอบนี้ว่ายอมรับ!
marcgg

ด้วยเหตุผลบางประการสิ่งนี้ใช้ไม่ได้กับฉัน :-( ฉันใส่ ScrollView และใส่ UIWebView แล้วจากนั้นตั้งค่า 2 บรรทัดข้างต้นในเมธอด viewWillAppear แต่การเลื่อนยังคงใช้งานได้ในมุมมองเว็บมีใครช่วยได้บ้างฉันกำลังเรียกใช้เพื่อดูข้อมูล iOS 7 simulator
Amogh Natu

ใช้ของwebView.scrollView.bounces = NO;อะไร? เนื่องจากโค้ดในบรรทัดแรกปิดใช้งานการเลื่อน
กอน

1
ชอบเวลาที่มีคนตอบและเรียกใช้โดยไม่ใช้เวลาในการโหวตให้ผู้ร่วมให้ข้อมูล ไม่มีวิธีใดในการแจ้งให้ผู้ใช้โปรดเลือกคำตอบเพื่อโหวต?
John Cogan

1
สำหรับ swift webView.scrollView.scrollEnabled = false / webView.scrollView.bounces = false
Chathuranga Silva

26

เนื่องจากคำถามนี้ยังใช้ได้อยู่จึงมีวิธีใหม่ในการทำ! (iOS 7.0+ อาจเป็น iOS 6 ด้วยไม่ได้รับการยืนยัน)

webView.scrollView.scrollEnabled = NO;

ดูแล :)


สิ่งที่ฉันไม่เข้าใจคือทำไมถึงไม่อยู่ใน IB: /, cmon APPLE คุณกำลังทำอะไรอยู่! วิธีแก้ปัญหาที่ดีมาก!
Mahmud Ahmad

20

คุณสามารถตั้งค่าคุณสมบัติการโต้ตอบกับผู้ใช้มุมมองเว็บเป็นไม่ใช่เช่น

webView.userInteractionEnabled = NO;

มันค่อนข้างง่ายและใช้งานได้ดีขอบคุณ :)


28
อย่างไรก็ตามวิธีนี้จะป้องกันไม่ให้มีการแตะลิงก์
Graham Perks

@GrahamPerks ฉันได้แก้ไขคำตอบด้วยความเคารพต่อความคิดเห็นของคุณโปรดตรวจสอบและอนุมัติขอบคุณ :)
Eshwar Chaitanya

12

สำหรับ iOS ทุกรุ่นคุณสามารถใช้รหัสนี้แทน setScrollEnabled:

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

ประการแรกฉันลองใช้เมธอด "setScrollEnabled" และ apple ปฏิเสธ ipa ของฉัน จากนั้นฉันก็เปลี่ยนวิธีนี้และยอมรับ
mturhan55



7

ฉันคิดว่า Javascript

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

เป็นทางออกที่ดีที่สุด

แท้จริง:

การสอบครั้งแรกของคุณหรือ

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

หนึ่ง (สิ่งเดียวกัน) อาจถูกปฏิเสธเนื่องจากไม่มีเอกสารหรือทำให้แอปของคุณขัดข้องในการอัปเดต iOS เพิ่มเติม

และ

[[myWebView scrollView] setBounces:NO];

วิธีนี้ใช้ไม่ได้กับ iOS <5


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

ที่จัดเรียงให้ฉัน


4
จะผิดอย่างมากที่ต้องพึ่งพาสิ่งนี้เนื่องจากไม่ใช่ API ที่เปิดเผย
Deepak Danduprolu

[[[มุมมองย่อย WebView] lastObject] setScrollingEnabled: NO]; ที่จัดเรียงให้ฉัน อย่างไรก็ตามมันไม่ตอบคำถามของฉัน คำถามของฉันคือฉันได้รับอนุญาตให้ทำหรือไม่? ดูเหมือนว่าการปิดใช้งานการเลื่อนผ่าน SDK เป็นสิ่งต้องห้าม แต่ฉันไม่แน่ใจ. และสิ่งที่เกี่ยวกับการปิดการใช้งานการเลื่อนผ่านจาวาสคริปต์
jsaddour

ไม่มีหลักฐานว่าข้อเสนอแนะของฉันจะทำให้แอปเปิลปฏิเสธโดยการเรียก subiew สุดท้ายในอาร์เรย์มุมมองย่อยและการตั้งค่า scrollingEnabled เทียบกับมันถูกเปิดเผย API? แน่นอน?. และใช่ไปเพราะคุณสามารถใช้มันได้ ไม่มีความคิดผ่านทางจาวาสคริปต์ ขอโทษ.
theiOSDude

3
ไม่คุณไม่ควรทำเช่นนี้ ดังที่ Deepak กล่าวไว้คุณไม่สามารถพึ่งพาลำดับภายในของมุมมองย่อยที่ไม่มีเอกสารในองค์ประกอบ UI ของ Apple ได้ หากพวกเขาเปลี่ยนโครงสร้างภายในในการอัปเดตระบบปฏิบัติการในอนาคตแอปพลิเคชันของคุณจะหยุดทำงาน พวกเขาเตือนโดยเฉพาะเกี่ยวกับการทำสิ่งนี้ในหลาย ๆ ที่และแอพพลิเคชั่นจำนวนมากเกิดปัญหาในการอัปเกรดเป็น iPhone OS 3.0 เพียงเพราะพวกเขาทำเช่นนี้
Brad Larson



4

ฉันไม่คิดว่าตัวเลือกแรกถูกห้ามโดย Apple

คุณสามารถลอง

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

หากคุณไม่ต้องการให้ลิงก์ทำงานใน UIWebView ของคุณคุณสามารถทำได้เช่นกัน

[myWebView setUserInteractionEnabled:NO];



3

ฉันวางบางส่วนไว้UIWebViewใน a UIScrollViewและมันไม่ได้เลื่อนให้ฉันเว้นแต่ฉันจะปิดใช้งานการโต้ตอบของผู้ใช้บน webviews (แม้จะมี[[webview scrollview] setScrollEnabled:NO]) ดังนั้นฉันจึงวางUIWebViews ไว้ใน a UIViewและมันก็ใช้ได้ผลสำหรับฉัน แต่ลิงก์แบบโต้ตอบหรือ divs ใน HTML ของฉันข้างในUIWebViewก็ไม่ทำงานอีกต่อไป

สิ่งเดียวที่ได้ผลสำหรับฉันคือการเก็บไว้UIWebViewข้างในUIScrollViewเพื่อให้การโต้ตอบ HTML ทำงาน แต่UIScrollingไม่ทำ

จากนั้นฉันก็สร้างผู้รับมอบสิทธิ์ที่กำหนดเองสำหรับมุมมองเว็บเพื่อรับฟังwindow.open("http:/customEvent")สิ่งที่เรียกว่าจาก HTML ที่มีอยู่ในมุมมองเว็บ ฉันยังเพิ่มการตรวจจับการปัดด้วย JavaScript ซึ่งจะทำให้เหตุการณ์ที่กำหนดเองของฉันเริ่มขึ้น

เมื่อผู้รับมอบสิทธิ์ webview ได้รับสิ่งนี้ฉันจะส่งการแจ้งเตือนไปยังคอนโทรลเลอร์ซึ่งจะเลื่อนUIScrollViewไฟล์. เห็นได้ชัดว่าฉันต้องสร้างตรรกะเพื่อตรวจสอบและเลื่อนไปที่หน้าถัดไปหรือก่อนหน้านี้ ไม่ใช่วิธีแก้ปัญหาที่สวยที่สุด แต่ใช้ได้ผลสำหรับฉัน


3

ลองใช้สิ่งนี้ใน HTML ( <HEAD>แท็ก)

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

มันจะปิดการเลื่อนบนหน้าเว็บของคุณ

(ทำงานบนหน้าเว็บใดก็ได้ไม่ใช่แค่ UIWebView)


2

ฉันจำเป็นต้องปิดการใช้งานการเลื่อนเนื่องจากการปิดแป้นพิมพ์แบบกำหนดเองทำให้การเลื่อนด้วย webView นั้นยุ่งมาก ไม่มีอะไรได้ผลและฉันใช้สิ่งนี้:

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

UIWebview และ UITableView บน UIScrollview และการตั้งค่าความสูงของ webview (และเพิ่ม ContentSize ทั้งหมดของ Scrollview) เป็นแบบที่คุณต้องการหรือไม่


เกือบ. แต่ดูเหมือนว่าจะไม่ซับซ้อนในการแสดง WebView ในส่วนหัวของ tableView แต่คำถามของฉันคือ: ฉันได้รับอนุญาตให้ปิดการใช้งานการเลื่อน webView ผ่าน SDK หรือไม่ หากไม่ได้รับอนุญาตให้ทำ javascript รางน้ำ?
jsaddour

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.