ไม่มีใครรู้วิธีที่จะหยุด UIWebView จากการตีกลับในแนวตั้ง? ฉันหมายถึงเมื่อผู้ใช้สัมผัสหน้าจอ iPhone ของพวกเขาลากนิ้วลงและเว็บวิวจะแสดงจุดว่างด้านบนของเว็บเพจที่ฉันโหลด
ฉันได้ดูวิธีแก้ปัญหาที่เป็นไปได้ แต่ไม่มีวิธีใดที่ใช้ได้ผลสำหรับฉัน:
ไม่มีใครรู้วิธีที่จะหยุด UIWebView จากการตีกลับในแนวตั้ง? ฉันหมายถึงเมื่อผู้ใช้สัมผัสหน้าจอ iPhone ของพวกเขาลากนิ้วลงและเว็บวิวจะแสดงจุดว่างด้านบนของเว็บเพจที่ฉันโหลด
ฉันได้ดูวิธีแก้ปัญหาที่เป็นไปได้ แต่ไม่มีวิธีใดที่ใช้ได้ผลสำหรับฉัน:
คำตอบ:
for (id subview in webView.subviews)
if ([[subview class] isSubclassOfClass: [UIScrollView class]])
((UIScrollView *)subview).bounces = NO;
... ดูเหมือนว่าจะทำงานได้ดี
มันจะได้รับการยอมรับใน App Store เช่นกัน
อัปเดต : ใน iOS 5.x + มีวิธีที่ง่ายกว่า - UIWebView
มีscrollView
คุณสมบัติเพื่อให้โค้ดของคุณมีลักษณะดังนี้:
webView.scrollView.bounces = NO;
WKWebView
เดียวกันจะไปสำหรับ
UIWebView
เพื่อที่ฉันจะสามารถโทรไป[webView setBounces:NO]
ที่ไหนก็ได้ที่ฉันต้องการ
ฉันกำลังดูโครงการที่ทำให้การสร้างเว็บแอปเป็นแอปพลิเคชั่นที่ติดตั้งได้อย่างสมบูรณ์บน iPhone ชื่อQuickConnectและพบวิธีแก้ปัญหาที่ใช้งานได้หากคุณไม่ต้องการให้หน้าจอเลื่อนได้เลยซึ่งในกรณีของฉัน ฉันไม่ได้
ในการโพสต์โครงการ / บล็อกดังกล่าวข้างต้นพวกเขากล่าวถึงฟังก์ชั่นจาวาสคริปต์ที่คุณสามารถเพิ่มเพื่อปิดการตีกลับซึ่งเป็นหลัก boils ลงนี้:
document.ontouchmove = function(event){
event.preventDefault();
}
หากคุณต้องการดูเพิ่มเติมเกี่ยวกับวิธีการใช้งานเพียงดาวน์โหลด QuickConnect และตรวจสอบออก .... แต่โดยพื้นฐานแล้วสิ่งที่เรียกว่าจาวาสคริปต์ในการโหลดหน้าเว็บ ... ฉันพยายามวางมันไว้ในหัวเอกสารของฉัน และดูเหมือนว่าจะทำงานได้ดี
ทั้งหมดที่ฉันทำเพื่อให้บรรลุคือ:
UIView *firstView = [webView.subviews firstObject];
if ([firstView isKindOfClass:[UIScrollView class]]) {
UIScrollView *scroll = (UIScrollView*)firstView;
[scroll setScrollEnabled:NO]; //to stop scrolling completely
[scroll setBounces:NO]; //to stop bouncing
}
ใช้งานได้ดีสำหรับฉัน ... นอกจากนี้คำตอบที่ถูกต้องสำหรับคำถามนี้คือคำถามที่ Apple จะปฏิเสธหากคุณใช้ในแอป iphone ของคุณ
UIScrollView
นี่เป็นมุมมองย่อยแรกUIWebView
ซึ่งอาจเป็นกรณีสำหรับตอนนี้ แต่สิ่งนี้อาจเปลี่ยนแปลงได้ง่ายในอนาคต (แม้แต่รายย่อย) อัปเดตเป็น iOS หรือการกำหนดค่าเฉพาะ คุณควรทำfor
ซ้ำsubviews
เพื่อค้นหาจริง ๆUIScrollView
(มันไม่ได้ทำงานมากและอย่างน้อยคุณรับประกันว่าจะได้รับUIScrollView
และไม่ผิดพลาดโปรแกรมของคุณ ...
ใน iOS 5 SDK คุณสามารถเข้าถึงมุมมองเลื่อนที่เชื่อมโยงกับมุมมองเว็บโดยตรงแทนที่จะวนซ้ำผ่านการดูย่อย
ดังนั้นหากต้องการปิดใช้งาน 'การตีกลับ' ในมุมมองการเลื่อนคุณสามารถใช้:
myWebView.scrollView.bounces = NO;
ดูUIWebView ชั้นอ้างอิง
(อย่างไรก็ตามหากคุณต้องการรองรับเวอร์ชั่น SDK ก่อน 5.0 คุณควรทำตามคำแนะนำของ Mirek Rusin )
สวิฟท์ 3
webView.scrollView.bounces = false
คำเตือน. ฉันใช้ setAllowsRubberBanding: ในแอปของฉันและ Apple ปฏิเสธว่าไม่อนุญาตให้ใช้ฟังก์ชั่น API ที่ไม่ใช่แบบสาธารณะ (อ้างอิง: 3.3.1)
ใน Swift เพื่อปิดการใช้งานการตีกลับ
webViewObj.scrollView.bounces = false
วิธีการของแบรดทำงานให้ฉัน ถ้าคุณใช้มันคุณอาจต้องการทำให้ปลอดภัยขึ้นเล็กน้อย
id scrollView = [yourWebView.subviews objectAtIndex: 0]; ถ้า ([scrollView ตอบสนองต่อ SelectSelector: @selector (setAllowsRubberBanding :)]) { [scrollView performselector: @selector (setAllowsRubberBanding :) ด้วยObject: NO]; }
ถ้าแอปเปิ้ลเปลี่ยนอะไรบางอย่างการตีกลับก็จะกลับมา แต่อย่างน้อยแอปของคุณจะไม่ผิด
บน iOS5 เฉพาะเมื่อคุณวางแผนที่จะให้ผู้ใช้ซูมเนื้อหาเว็บวิว (ei: แตะสองครั้ง) การตั้งค่าการตีกลับไม่เพียงพอ คุณจำเป็นต้องตั้งค่าคุณสมบัติ BounceH แนวนอนและ BounceVertical เป็น NO เสมอทุกครั้งที่พวกเขาซูมออก (แตะอีกสองครั้ง ... ) เป็นค่าเริ่มต้นมันจะเด้งกลับมาอีกครั้ง
ฉันสำรวจชุดข้อมูลย่อยของ UIWebView และตั้งค่าพื้นหลังเป็น [UIColor blackColor] ซึ่งเป็นสีเดียวกับพื้นหลังของเว็บเพจ มุมมองจะยังคงเด้ง แต่จะไม่แสดงพื้นหลังสีเทาเข้มที่น่าเกลียด
ดูเหมือนว่าฉันจะ UIWebView มี UIScrollView คุณสามารถใช้ API ที่ทำเป็นเอกสารสำหรับสิ่งนี้ แต่ตั้งค่าการตีกลับสำหรับทั้งสองทิศทางไม่ใช่ทีละรายการ นี่คือเอกสาร API UIScrollView มีคุณสมบัติการตีกลับดังนั้นสิ่งนี้จึงใช้ได้ (ไม่ทราบว่ามี scrollview มากกว่าหนึ่งรายการ):
NSArray *subviews = myWebView.subviews;
NSObject *obj = nil;
int i = 0;
for (; i < subviews.count ; i++)
{
obj = [subviews objectAtIndex:i];
if([[obj class] isSubclassOfClass:[UIScrollView class]] == YES)
{
((UIScrollView*)obj).bounces = NO;
}
}
ฉันรำคาญที่พบว่า UIWebView ไม่ใช่มุมมองการเลื่อนดังนั้นฉันจึงสร้างคลาสย่อยที่กำหนดเองเพื่อไปที่มุมมองการเลื่อนของมุมมองเว็บ suclass นี้มีมุมมองเลื่อนเพื่อให้คุณสามารถปรับแต่งพฤติกรรมของมุมมองเว็บของคุณ Punchlines ของชั้นนี้คือ:
@class CustomWebView : UIWebview
...
- (id) initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
// WebViews are subclass of NSObject and not UIScrollView and therefore don't allow customization.
// However, a UIWebView is a UIScrollViewDelegate, so it must CONTAIN a ScrollView somewhere.
// To use a web view like a scroll view, let's traverse the view hierarchy to find the scroll view inside the web view.
for (UIView* v in self.subviews){
if ([v isKindOfClass:[UIScrollView class]]){
_scrollView = (UIScrollView*)v;
break;
}
}
return self;
}
จากนั้นเมื่อคุณสร้างมุมมองเว็บที่กำหนดเองคุณสามารถปิดใช้งานการตีกลับด้วย:
customWebView.scrollView.bounces = NO; //(or customWebView.scrollView.alwaysBounceVertically = NO)
นี่เป็นวิธีการทั่วไปที่ยอดเยี่ยมในการสร้างมุมมองเว็บที่มีพฤติกรรมการเลื่อนที่กำหนดเอง มีบางสิ่งที่ต้องระวังคือ:
มาค้นหาคำตอบนี้และในที่สุดฉันก็โชคดีที่คำตอบของฉันเองโดยทำเรื่องยุ่ง ๆ ฉันทำ
[[webview scrollView] setBounces:NO];
และมันก็ใช้งานได้
สิ่งนี้ใช้ได้สำหรับฉันและสวยงามเช่นกัน (ฉันใช้ phonegap กับ webView)
[[webView.webView scrollView] setScrollEnabled:NO];
หรือ
[[webView scrollView] setScrollEnabled:NO];
ฉันลองวิธีที่แตกต่างกันเล็กน้อยเพื่อป้องกันไม่ให้วัตถุUIWebViewเลื่อนและกระดอน: เพิ่มตัวรู้จำท่าทางเพื่อแทนที่ท่าทางอื่น ๆ
มันดูเหมือน, UIWebViewหรือมุมมองย่อยของ scroller ใช้ตัวจดจำท่าทางเลื่อนของตัวเองเพื่อตรวจจับการเลื่อนผู้ใช้ แต่ตามเอกสารของ Apple มีวิธีที่ถูกต้องในการเอาชนะตัวรู้จำท่าทางด้วยวิธีอื่นอย่างถูกกฎหมาย UIGestureRecognizerDelegateโปรโตคอลมีรูปแบบวิธีท่าทาง Recognizer: ควรRecognizeSimพร้อมกันด้วย GestureRecognizer: - ซึ่งช่วยให้การควบคุมพฤติกรรมของตัวจดจำท่าทางการชนใด ๆ
ดังนั้นสิ่งที่ฉันทำคือ
ในวิธีการ viewDidLoad ของตัวควบคุมมุมมอง:
// Install a pan gesture recognizer // We ignore all the touches except the first and try to prevent other pan gestures
// by registering this object as the recognizer's delegate
UIPanGestureRecognizer *recognizer;
recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
recognizer.delegate = self;
recognizer.maximumNumberOfTouches = 1;
[self.view addGestureRecognizer:recognizer];
self.panGestureFixer = recognizer;
[recognizer release];
จากนั้นวิธีการแทนที่ด้วยท่าทาง:
// Control gestures precedence
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// Prevent all panning gestures (which do nothing but scroll webViews, something we want to disable in
// the most painless way)
if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]])
{
// Just disable every other pan gesture recognizer right away
otherGestureRecognizer.enabled = FALSE;
}
return NO;
}
แน่นอนวิธีการมอบสิทธิ์นี้ทำให้ฉันมีความซับซ้อนมากขึ้นในแอปพลิเคชันจริง - เราอาจปิดการใช้งานตัวจดจำอื่น ๆ โดยการคัดเลือกการวิเคราะห์ OtherGestureRecognizer.viewและทำการตัดสินใจตามมุมมองที่เป็นอยู่
และในที่สุดเพื่อความสมบูรณ์แบบวิธีการที่เราลงทะเบียนเป็นตัวจัดการกระทะ:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
มันอาจว่างเปล่าถ้าสิ่งที่เราต้องการคือการยกเลิกการเลื่อนและการตีกลับของมุมมองเว็บหรืออาจมีรหัสของเราเองเพื่อใช้การเคลื่อนไหวและภาพเคลื่อนไหวในกระทะที่เราต้องการ ...
จนถึงตอนนี้ฉันแค่ทดลองกับสิ่งเหล่านี้ทั้งหมดและดูเหมือนว่ามันจะทำงานได้มากหรือน้อยตามที่ฉันต้องการ ฉันยังไม่ได้พยายามส่งแอพใด ๆ ไปยัง iStore แต่ฉันเชื่อว่าฉันไม่ได้ใช้อะไรที่ไม่มีเอกสารจนถึงตอนนี้ ... หากใครพบมันเป็นอย่างอื่นโปรดแจ้งฉัน
นี่เป็นวิธีแก้ปัญหาที่เป็นไปได้สองแบบใหม่ เห็นได้ชัดว่าคุณสามารถใช้ jqtouch หรือ pastrykit เพื่อปิดการใช้งานการเลื่อน อย่างไรก็ตามฉันไม่ได้รับการทำงานเหล่านี้ คุณอาจมีความสามารถมากกว่า
ลิงค์นี้ช่วยฉันได้มาก ..... มันง่ายมาก .. มีตัวอย่างคือ ..
(ตัวอย่าง Xcode 5 iOS 7 SDK) นี่คือตัวอย่างแอพสากลที่ใช้ฟังก์ชั่น scrollview setBounces มันเป็นโครงการ / ตัวอย่างแบบโอเพนซอร์ซตั้งอยู่ที่นี่: ลิงก์ไปยัง SimpleWebView (ตัวอย่างซิปโครงการและซอร์สโค้ด)
หนึ่งใน subviews ของที่ควรจะเป็นUIWebView
UIScrollView
ตั้งค่าscrollEnabled
คุณสมบัติเป็นNO
และมุมมองเว็บจะปิดใช้งานการเลื่อนทั้งหมด
หมายเหตุ: นี่เป็นการใช้งานเทคนิคส่วนตัว API และทำให้แอปของคุณอาจถูกปฏิเสธหรือผิดพลาดในอนาคตระบบปฏิบัติการ ใช้@try
และrespondsToSelector
มองเข้าไปในทรัพย์สินของbounces
UIScrollView
สิ่งที่ Apple เอกสาร:
หากค่าของคุณสมบัติคือ
YES
(ค่าเริ่มต้น) มุมมองเลื่อนจะกระดอนเมื่อพบขอบเขตของเนื้อหา การสะท้อนด้วยสายตาแสดงให้เห็นว่าการเลื่อนมาถึงขอบของเนื้อหาแล้ว หากมีค่าการNO
เลื่อนจะหยุดทันทีที่ขอบเขตเนื้อหาโดยไม่ต้องกระดอน
UIScrollView
ให้แน่ใจว่าคุณกำลังใช้สิทธิ ผมไม่แน่ใจว่าสิ่งที่ลำดับชั้นดูเหมือนหาแต่มุมมองเลื่อนอาจจะเป็นพ่อแม่ไม่ได้เด็กของUIWebView
UIWebView
หากต้องการปิดการUIWebView
เลื่อนคุณสามารถใช้บรรทัดของรหัสต่อไปนี้:
[ObjWebview setUserInteractionEnabled:FALSE];
ในตัวอย่างนี้เป็นประเภทObjWebview
UIWebView
webView.scrollView.scrollEnabled = ไม่; webView.scrollView.bounces = ไม่;