लंबवत रूप से "उछल" से UIWebView को रोकें?


225

क्या किसी को पता है कि UIWebView को लंबवत रूप से उछलने से कैसे रोका जाए? मेरा मतलब है कि जब कोई उपयोगकर्ता अपनी iPhone स्क्रीन को छूता है, तो अपनी उंगली को नीचे की ओर खींचता है, और वेबव्यू मेरे द्वारा लोड किए गए वेब पेज के ऊपर एक खाली स्थान दिखाता है?

मैंने निम्नलिखित संभावित समाधानों को देखा है, लेकिन उनमें से किसी ने भी मेरे लिए काम नहीं किया है:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/996-turn-off-scrolling-bounces-uiwebview.html

http://forums.macrumors.com/showthread.php?t=619534

मैं क्षैतिज रूप से उछल से एक UIScrollView को कैसे रोकूं?


1
मुझे आशा है कि आपने उस सुविधा को अक्षम करने के प्रयोज्य प्रभाव पर विचार किया होगा। यह एक कारण के लिए है। उस ने कहा, मैं उत्सुक हूं, आप भी ऐसा कैसे करेंगे।
माइकल हरेन

जिस तरह से मैंने इसे अपने ऐप में एंबेड किया है, यह मेरे पास मौजूद कुछ अन्य व्यू एलिमेंट्स के साथ प्रतीत होता है, और एकमात्र ऐसा समय नहीं दिखता है जब उछाल होता है .... निश्चित रूप से एक अच्छा बिंदु है!
ब्राड पार्क

जवाबों:


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

... ठीक काम लगता है।

इसे ऐप स्टोर पर भी स्वीकार किया जाएगा।

अपडेट : आईओएस में 5.x + एक आसान तरीका है - UIWebViewइसमें scrollViewसंपत्ति है, इसलिए आपका कोड इस तरह दिख सकता है:

webView.scrollView.bounces = NO;

उसी के लिए जाता है WKWebView


यह काम करता हैं। कोई उपवर्ग की आवश्यकता नहीं है और यदि Apple कभी भी UIWebView पदानुक्रम को बदलता है, तो यह क्रैश नहीं होना चाहिए।
लीओलोबेटो

2
यह फिक्स मेरे ओएस 4.1 सिम्युलेटर में काम करने लगता है, मेरे ओएस 3.1.3 आईफोन पर नहीं। किसी को पता है कि क्या यह फिक्स केवल विशेष ओएस संस्करणों पर काम करता है?
दान जे

@MirukRusin - आप यह गारंटी कैसे दे सकते हैं कि यह ऐप कोड की तीन पंक्तियों के आधार पर स्वीकार किया जाएगा? : पी
मोशे

@ मिरेक - आपने मेरी बात को याद किया। आप कैसे जानते हैं कि ऐप में और कुछ भी इसे अस्वीकार नहीं करेगा?
मोशे

6
इसने मेरे लिए ठीक काम किया। सुविधा के लिए, मैंने एक श्रेणी जोड़ी UIWebViewताकि मैं अपनी [webView setBounces:NO]इच्छा से कहीं भी कॉल कर सकूं।
जेकेल

46

मैं एक ऐसे प्रोजेक्ट को देख रहा था , जो QuickConnect नामक iPhone पर पूर्ण विकसित इंस्टाल एप्लिकेशन के रूप में वेब ऐप बनाना आसान बनाता है , और एक समाधान पाया गया जो काम करता है, यदि आप नहीं चाहते कि आपकी स्क्रीन स्क्रॉल करने योग्य हो, तो मेरे मामले में मैंने नहीं किया।

उपर्युक्त परियोजना / ब्लॉग पोस्ट में, वे एक जावास्क्रिप्ट फ़ंक्शन का उल्लेख करते हैं जिसे आप बाउंसिंग को बंद करने के लिए जोड़ सकते हैं, जो अनिवार्य रूप से इस पर उबलता है:

    document.ontouchmove = function(event){
        event.preventDefault();
    }

यदि आप इस बारे में अधिक देखना चाहते हैं कि वे इसे कैसे लागू करते हैं, तो बस QuickConnect डाउनलोड करें और इसे देखें .... लेकिन मूल रूप से यह सब करता है कि पेज लोड पर उस जावास्क्रिप्ट को कॉल करें ... मैंने इसे अपने दस्तावेज़ के सिर में डालने की कोशिश की और यह ठीक काम करने लगता है।


यह उत्तर UIWebView के भीतर सामग्री की ऊर्ध्वाधर स्क्रॉलिंग को रोकने का सही तरीका है।
जेसडेक

3
आप पूरे उत्तर दे सकते थे, सबसे पहले मैं किसी अन्य ऐप का संपूर्ण स्रोत कोड डाउनलोड नहीं करना चाहता, और मुझे यह भी नहीं मिल रहा है। जब आप जवाब देते हैं तो आपका जवाब दूसरी वेबसाइट पर निर्भर करता है।
जोनाथन।

यह उत्तर और ऊपर स्वीकार किया गया उत्तर कई बार आवश्यक प्रतीत होता है। मेरे मामले में, मैंने पाया कि अगर वेब दृश्य अभी तक लोड नहीं किया गया था, तो परिषद तब तक रहेगी जब तक कि ऊपर वाला जेएस वास्तव में सिस्टम में लोड नहीं हो जाता। तो उत्तर ऐसा लगता है कि यह और ऊपर स्वीकार किए गए उत्तर दोनों ही, कई बार, आवश्यक हैं।
काल

3
जैसा कि जेसडेक ने कहा, यह न केवल उछलते हुए, ऊर्ध्वाधर स्क्रॉलिंग को रोक देगा। इसका मतलब है कि अगर आपके पास div है या इसलिए स्क्रॉलिंग की आवश्यकता है, तो यह स्क्रॉल नहीं करेगा।
मेमोरियल

18

खैर यह पूरा करने के लिए मैंने किया है:

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 ऐप में इसका उपयोग करने पर अस्वीकार कर देगा।


3
यह सबसे अच्छा और सबसे सरल तरीका है। यह स्वीकृत उत्तर होना चाहिए! +1
पोस्टकोडिज्म

3
ऐसा मत करो - पहली पंक्ति का उपयोग करने के लिए मेरा ऐप अस्वीकृत हो गया। मेरे लिए इतना समय बर्बाद किया। मैंने [[webView.subviews lastObject] setScrollEnabled: NO] का उपयोग किया; और सेब ने कहा कि यह एक निजी एपीआई था और इसलिए इसे अस्वीकार कर दिया; अब के बारे में फिर से शुरू करने के लिए हूँ, लेकिन "userInteractionEnabled: NO" का उपयोग किया है क्योंकि मुझे ऐप में किसी भी सक्रिय लिंक की आवश्यकता नहीं है।
वीरु

UIWebView UIView से विरासत में मिला है। UIView के पास संपत्ति के साक्षात्कार हैं। यहाँ निजी क्या है? यह सब आप developer.apple.com पर पा सकते हैं
Valerii Pavlov

3
मैं इस का उपयोग कर appstore पर 4 क्षुधा की तरह कुछ है। आप एप्लिकेशन को किसी अन्य कारण से स्पष्ट रूप से अस्वीकार कर दिया गया था। यह एक निजी एपीआई नहीं है।
ज़िग्लगवर्थ

4
यह वास्तव में एक अच्छा विचार नहीं है। आप इस तथ्य पर भरोसा कर रहे हैं कि यह UIScrollViewपहला सबव्यू है UIWebViewजिसमें से अभी के लिए अच्छी तरह से मामला हो सकता है लेकिन यह आसानी से भविष्य में (यहां तक ​​कि मामूली) अपडेट आईओएस या विशेष कॉन्फ़िगरेशन में बदल सकता है। आपको वास्तव में वास्तव में खोजने के लिए एक forपुनरावृत्ति करना चाहिए (यह वास्तव में इतना काम नहीं है और कम से कम आपको गारंटी दी जाती है कि आप अपने प्रोग्राम को दुर्घटनाग्रस्त न करें ...subviewsUIScrollViewUIScrollView
जोनाथन एलिस

17

IOS 5 SDK में आप इसके सबव्यू के माध्यम से पुनरावृति करने के बजाय सीधे वेब दृश्य से जुड़े स्क्रॉल दृश्य तक पहुँच सकते हैं।

तो स्क्रॉल दृश्य में 'बाउंसिंग' को अक्षम करने के लिए आप इसका उपयोग कर सकते हैं:

myWebView.scrollView.bounces = NO;

UIWebView क्लास संदर्भ देखें ।

(हालांकि अगर आपको 5.0 से पहले एसडीके के संस्करणों का समर्थन करने की आवश्यकता है, तो आपको मिरेक रुसिन की सलाह का पालन ​​करना चाहिए ।)



9

चेतावनी। मैंने setAllowsRubberBanding का उपयोग किया: मेरे ऐप में, और Apple ने इसे अस्वीकार कर दिया, यह बताते हुए कि गैर-सार्वजनिक API फ़ंक्शंस की अनुमति नहीं है (उद्धृत: 3.3.1)



3

ब्रैड की विधि ने मेरे लिए काम किया। यदि आप इसका उपयोग करते हैं तो आप इसे थोड़ा सुरक्षित बनाना चाहते हैं।

id scrollView = [yourWebView.subviews objectAtIndex: 0];
अगर ([स्क्रॉलवॉच जवाब देता है तोलेक्टर: @ डिलेक्टर (सेटऑलरब्राउडरबंडिंग :) ...))
{
    [स्क्रॉल दृश्य प्रदर्शनकर्ता: @selector (setAllowsRubberBanding :) withObject: NO];
}

यदि सेब कुछ बदलता है तो उछाल वापस आएगा - लेकिन कम से कम आपका ऐप क्रैश नहीं होगा।


3

IOS5 पर केवल अगर आप उपयोगकर्ताओं को वेबव्यू कंटेंट को ज़ूम करने की योजना बनाते हैं (ei: डबल टैप) बाउंस सेटिंग पर्याप्त नहीं है। आपको यह भी निर्धारित करने की आवश्यकता है कि कोई भी बाउंसरहेर क्षैतिज और हमेशा बाउंसरविटिकल प्रॉपर्टीज को NO पर न रखें, अन्यथा जब वे ज़ूम-आउट (एक और डबल टैप ...) करने के लिए डिफ़ॉल्ट रूप से फिर से उछलेंगे।


2

मैंने UIWebView के उप-संग्रह का पता लगाया और उनकी पृष्ठभूमि [UIColor blackColor] पर सेट की, जो वेबपेज पृष्ठभूमि के समान रंग है। दृश्य अभी भी उछाल लेगा, लेकिन यह उस बदसूरत गहरे भूरे रंग की पृष्ठभूमि को नहीं दिखाएगा।


1
वास्तव में यह एक बहुत बुरा है, क्योंकि अगर Apple कभी UIWebView के इंटर्नल को बदलता है, तो यह हैक टूट सकता है।
bpapa

2

यह मुझे ऐसा लगता है जैसे UIWebView में UIScrollView है। आप इसके लिए प्रलेखित एपीआई का उपयोग कर सकते हैं, लेकिन बाउंसिंग को दोनों दिशाओं के लिए निर्धारित किया जाता है, व्यक्तिगत रूप से नहीं। यह एपीआई डॉक्स में है। UIScrollView में एक उछाल वाली संपत्ति है, इसलिए कुछ इस तरह काम करता है (पता नहीं कि एक से अधिक स्क्रॉलव्यू हो):

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;
    }
}

2

मुझे यह पता लगाने के लिए गुस्सा आया कि UIWebView एक स्क्रॉल दृश्य नहीं है, इसलिए मैंने वेब दृश्य के स्क्रॉल दृश्य पर पहुंचने के लिए एक कस्टम सबक्लास बनाया। इस suclass में एक स्क्रॉल दृश्य है जिससे आप अपने वेब दृश्य के व्यवहार को अनुकूलित कर सकते हैं। इस वर्ग की पंचलाइन हैं:

@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)

अनुकूलन योग्य स्क्रॉलिंग व्यवहार के साथ वेब दृश्य बनाने का यह एक सामान्य सामान्य उद्देश्य है। देखने के लिए कुछ चीजें हैं:

  • किसी भी दृश्य के साथ, आपको ओवरराइड करने की भी आवश्यकता होगी - (आईडी) initWithCoder: यदि आप इसे इंटरफ़ेस बिल्डर में उपयोग करते हैं
  • जब आप शुरू में एक वेब दृश्य बनाते हैं, तो इसकी सामग्री का आकार हमेशा दृश्य के फ्रेम के आकार के समान होता है। वेब स्क्रॉल करने के बाद, सामग्री का आकार दृश्य के अंदर वास्तविक वेब सामग्री के आकार का प्रतिनिधित्व करता है। इसके आस-पास जाने के लिए, मैंने कुछ हैक किया - कॉलिंग -setContentOffset: CGPointMake (0,1) एनिमेटेड: एक अचूक परिवर्तन के लिए बाध्य करने के लिए हाँ जो वेब दृश्य के उचित सामग्री आकार को सेट करेगा।

2

इस जवाब के लिए खोज कर रहे थे और मैं अंत में बस के बारे में खिलवाड़ करके अपने खुद के जवाब पर किस्मत में था। मैंने किया

[[webview scrollView] setBounces:NO];

और यह काम किया।


2

यह मेरे लिए काम करता है, और खूबसूरती से भी (मैं webView के साथ फोनगैप का उपयोग कर रहा हूं)

[[webView.webView scrollView] setScrollEnabled:NO];

या

[[webView scrollView] setScrollEnabled:NO];

1

मैंने UIWebView ऑब्जेक्ट्स को स्क्रॉल करने और बाउंस करने से रोकने के लिए थोड़ा अलग तरीका आजमाया : अन्य जेस्चर को ओवरराइड करने के लिए एक जेस्चर पहचानकर्ता को जोड़ा।

ऐसा लगता है, उपयोगकर्ता स्क्रॉलिंग का पता लगाने के लिए UIWebView या इसके स्क्रोलर सबव्यू अपने स्वयं के पैन जेस्चर पहचानकर्ता का उपयोग करते हैं। लेकिन Apple के प्रलेखन के अनुसार एक जेस्चर पहचानकर्ता को दूसरे के साथ ओवरराइड करने का एक वैध तरीका है। UIGestureRecognizerDelegate प्रोटोकॉल एक विधि है gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer: - जो किसी भी टकराने इशारा recognizers के व्यवहार को नियंत्रित करने के लिए अनुमति देता है।

इसलिए, मैंने जो किया वह किया

नियंत्रक के दृष्टिकोण में देखें

// 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;                                                                                                                                        
}              

निश्चित रूप से, यह प्रतिनिधि पद्धति मुझे एक वास्तविक एप्लिकेशन में अधिक जटिल बना सकती है - हम अन्य पहचानकर्ताओं को चुनिंदा रूप से अक्षम कर सकते हैं, अन्य GestureRecognizer.view का विश्लेषण कर सकते हैं और यह देखने के आधार पर निर्णय ले सकते हैं।

और, अंत में, पूर्णता की खातिर, जिस विधि को हमने पैन हैंडलर के रूप में पंजीकृत किया है:

- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer 
{ 
    // do nothing as of yet
}

यह खाली हो सकता है अगर हम चाहते हैं कि वेब दृश्यों को स्क्रॉल करना और बाउंस करना रद्द करना है, या यह उस तरह के पैन गतियों और एनिमेशन को लागू करने के लिए हमारा अपना कोड हो सकता है जो हम वास्तव में चाहते हैं ...

अभी तक मैं यह सब सामान के साथ प्रयोग कर रहा हूं, और ऐसा लगता है कि मैं इसे कम से कम काम करना चाहता हूं। मैंने किसी भी ऐप को iStore में सबमिट करने की कोशिश नहीं की है, हालाँकि। लेकिन मेरा मानना ​​है कि मैंने अब तक किसी भी चीज का उपयोग नहीं किया है ... अगर किसी को यह नहीं मिलता है, तो कृपया मुझे सूचित करें।


1

यहां दो नए संभावित समाधान दिए गए हैं। जाहिर है, स्क्रॉलिंग को अक्षम करने के लिए आप jqtouch या pastrykit का उपयोग कर सकते हैं। हालाँकि, मुझे ये काम करने के लिए नहीं मिला है। आप अधिक सक्षम हो सकते हैं।

ऊर्ध्वाधर स्क्रॉलिंग बंद करना

पेस्ट्रीकीट में खुदाई



1

(Xcode 5 iOS 7 SDK उदाहरण) यहां स्क्रॉलव्यू सेट का उपयोग करके एक यूनिवर्सल ऐप उदाहरण दिया गया है। यह एक ओपन सोर्स प्रोजेक्ट / उदाहरण यहां स्थित है: सिंपलवेबव्यू (प्रोजेक्ट ज़िप और सोर्स कोड उदाहरण से लिंक)


0

सबव्यू में UIWebViewसे एक होना चाहिए UIScrollView। इसके scrollEnabledलिए अपनी संपत्ति सेट करें NOऔर वेब दृश्य में स्क्रॉलिंग पूरी तरह से अक्षम हो जाएगी।

नोट: यह तकनीकी रूप से एक निजी एपीआई का उपयोग कर रहा है और इस प्रकार आपके ऐप को भविष्य के ओएस रिलीज में अस्वीकृत या क्रैश हो सकता है। का उपयोग करें @tryऔरrespondsToSelector


मैंने इसे आज़माया, और जब मैं इसे आज़माता हूं तो यह दोष होता है ... अजीब तरह से, मैं स्क्रॉलव्यू.बॉउन्स तक पहुंच सकता हूं और सेट कर सकता हूं (कोई प्रभाव नहीं), लेकिन जब मैं स्क्रॉल करता हूं और इसे सेट करता हूं, तो यह दोष ...
ब्रैड पार्क्स

मेरा मानना ​​है कि सबव्यू को UIScroller कहा जाता है, UIScrollView को नहीं। UIScroller एक अनजाने और असमर्थित वर्ग है जो UIScrollView के साथ आम तौर पर बहुत कुछ साझा करता है, लेकिन आप उसी तरह से काम करने वाले और भविष्य के ओएस संस्करणों में नहीं बदलने वाले सब कुछ पर निर्भर नहीं कर सकते।
मार्को

मैंने आईओएस 3.2 पर चलने वाले एक आईपैड (आईफोन नहीं) ऐप पर ऐसा किया, और अपने यूआईव्यू व्यू से यूआईएसक्रॉल व्यू प्राप्त करने में सक्षम था। मैंने इस दृश्य को सफलतापूर्वक अपने उछलते व्यवहार से अधिक बदलने के लिए अनुकूलित किया है ताकि मैं iPad पर इस काम की गवाही दे सकूं। मेरा ऐप ऐप स्टोर के माध्यम से नहीं चला, लेकिन मुझे नहीं लगता कि अनइंस्टॉल किए गए एपीआई की यहां कोई समस्या होगी। इस समाधान के लिए चतुर हिस्सा यह है कि आप बस एक यूआईईआरवाई पदानुक्रम का पता लगा रहे हैं और एक यूआईएसक्रोल व्यू का उपयोग कर रहे हैं - जो दोनों पूरी तरह से कोषेर हैं।
रॉल्फ हेंड्रिक्स

0

की bouncesसंपत्ति में देखें UIScrollView। Apple डॉक्स को छोड़ें:

यदि संपत्ति का मूल्य YES(डिफ़ॉल्ट) है, तो स्क्रॉल दृश्य बाउंस हो जाता है जब यह सामग्री की सीमा का सामना करता है। नेत्रहीन शेख़ी इंगित करता है कि स्क्रॉलिंग सामग्री के एक किनारे तक पहुंच गई है। यदि मान है NO, तो स्क्रॉल बाउंस किए बिना सामग्री सीमा पर तुरंत रुक जाता है।

सुनिश्चित करें कि आप सही का उपयोग कर रहे हैं UIScrollView। मुझे यकीन नहीं है कि पदानुक्रम एक के लिए कैसा दिखता है UIWebView, लेकिन स्क्रॉल दृश्य एक माता-पिता हो सकता है, एक बच्चा नहीं, का UIWebView


0

UIWebViewस्क्रॉलिंग को अक्षम करने के लिए आप निम्न लाइन कोड का उपयोग कर सकते हैं:

[ObjWebview setUserInteractionEnabled:FALSE];

इस उदाहरण में, ObjWebviewप्रकार का है UIWebView


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.