मेरे पास एक है UIScrollView
जिसमें कई UIImageView
s, UILabels, आदि हैं ... लेबल बहुत लंबे हैं कि UIScrollView
, लेकिन जब मैं एप्लिकेशन चलाता हूं, तो मैं क्लिक नहीं कर सकता और नीचे स्क्रॉल कर सकता हूं ...
ऐसा क्यों हो सकता है?
धन्यवाद
मेरे पास एक है UIScrollView
जिसमें कई UIImageView
s, UILabels, आदि हैं ... लेबल बहुत लंबे हैं कि UIScrollView
, लेकिन जब मैं एप्लिकेशन चलाता हूं, तो मैं क्लिक नहीं कर सकता और नीचे स्क्रॉल कर सकता हूं ...
ऐसा क्यों हो सकता है?
धन्यवाद
जवाबों:
एक पूर्ण कार्य कोड स्निपेट दिखाना हमेशा अच्छा होता है:
// in viewDidLoad (if using Autolayout check note below):
UIScrollView *myScrollView;
UIView *contentView;
// scrollview won't scroll unless content size explicitly set
[myScrollView addSubview:contentView];//if the contentView is not already inside your scrollview in your xib/StoryBoard doc
myScrollView.contentSize = contentView.frame.size; //sets ScrollView content size
स्विफ्ट 4.0
let myScrollView
let contentView
// scrollview won't scroll unless content size explicitly set
myScrollView.addSubview(contentView)//if the contentView is not already inside your scrollview in your xib/StoryBoard doc
myScrollView.contentSize = contentView.frame.size //sets ScrollView content size
मुझे IB में सामग्री सेट करने का कोई तरीका नहीं मिला है (Xcode 5.0 के रूप में) ।
नोट: यदि आप इस कोड को डालने के लिए सबसे अच्छी जगह ऑटोलैयूट का उपयोग कर रहे हैं तो यह -(void)viewDidLayoutSubviews
विधि के अंदर है ।
myScrollView.delegate = self
ALSO को सेट करना न भूलें , अगर यह अभी भी काम नहीं कर रहा है, तो नीचे दिए गए जवाब में यह अच्छी सलाह है (अपने xib / StoryBoard पर जाएं और सुनिश्चित करें कि "AutoLayout अक्षम है")। प्रो-टिप: आप <UIScrollViewDelegate>
अपनी .h फ़ाइल में भी शामिल कर सकते हैं यदि आप प्रोग्राम करना चाहते हैं जैसे कि प्रोग्राम को अपने UIScrollView को स्क्रॉल करें।
viewDidLayoutSubviews
यह मेरे लिए काम करता है।
यदि आप सामग्री को सही ढंग से सेट करने के बाद भी दृश्य को स्क्रॉल नहीं कर सकते हैं , तो सुनिश्चित करें कि आप इंटरफ़ेस बिल्डर -> फ़ाइल इंस्पेक्टर में "ऑटोलेयआउट का उपयोग करें" को अनचेक करें।
contentSize
इसे ठीक से स्क्रॉल करने के लिए आपको स्क्रॉल दृश्य की संपत्ति सेट करने की आवश्यकता है ।
आप autolayout का उपयोग कर रहे हैं, तो आप सेट करने की जरूरत है contentSize
में viewDidLayoutSubviews
क्रम में के लिए यह autolayout पूर्ण होने के बाद लागू किया जाएगा।
कोड इस तरह दिख सकता है:
-(void)viewDidLayoutSubviews
{
// The scrollview needs to know the content size for it to work correctly
self.scrollView.contentSize = CGSizeMake(
self.scrollContent.frame.size.width,
self.scrollContent.frame.size.height + 300
);
}
contentSize
आकार के मान को सेट करता हूं contentView
, तो स्क्रॉलव्यू और सामग्री दृश्य का आकार समान होने लगता है। लेकिन की ऊंचाई से contentSize
अधिक मूल्य की ऊंचाई की स्थापना contentView
, यह काम किया।
viewDidLayoutSubviews
एक जीवनचक्र के दौरान कई बार कॉल किया जा सकता है ताकि आप जोखिम को ऊंचाई से बढ़ाकर चला सकें।
ऊपर दिया गया उत्तर सही है - स्क्रॉलिंग होने के लिए, सामग्री का आकार निर्धारित करना आवश्यक है।
यदि आप इंटरफ़ेस बिल्डर का उपयोग कर रहे हैं, तो उपयोगकर्ता परिभाषित रनटाइम विशेषताओं के साथ ऐसा करने का एक अच्छा तरीका है। उदाहरण के लिए:
सामग्री आकार को बड़ी संख्या में आकार देने का प्रयास करें। मुझे समझ में नहीं आ रहा है कि जब मेरा कंटेंट साइज़ कंट्रोल साइज़ से बड़ा होने लगता है तो भी मेरा स्क्रॉल व्यू क्यों नहीं स्क्रॉल करता है। मुझे पता चला कि यदि सामग्री का आकार आवश्यकता से छोटा है, तो यह भी काम नहीं करता है।
self.scrollView.contentSize = CGSizeMake(2000, 2000);
2000 के बजाय आप अपनी खुद की बड़ी संख्या डाल सकते हैं। और अगर यह काम करता है, तो इसका मतलब है कि आपके आकार का आकार बड़ा नहीं है जब आप आकार बदलते हैं।
स्क्रॉल दृश्य को कार्य करने के लिए प्रतिनिधि आवश्यक नहीं है।
सुनिश्चित करें कि आपके पास स्क्रॉल आकार की संपत्ति को सही आकार में सेट करना है (यानी, सभी सामग्री को शामिल करने के लिए पर्याप्त बड़ा)।
अनचेक for यूज ऑटोलाययूट ’ने मेरे लिए चाल चली।
पर्यावरण: xCode 5.0.2 स्टोरीबोर्ड ios7
मेरे मामले में मुझे यह delaysContentTouches
सच करना था क्योंकि स्क्रोल व्यू के अंदर की सभी वस्तुएं टच ईवेंट को कैप्चर कर रही थीं और स्क्रॉलव्यू को खुद को संभालने देने के बजाय खुद को संभाल रही थीं।
सेट contentSize
की संपत्ति UIScrollview
में ViewDidLayoutSubviews
विधि। कुछ इस तरह
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height)
}
स्क्रॉल दृश्य क्यों स्क्रॉल नहीं है, इसका विचार यह है कि आपने स्क्रॉल दृश्य के आकार से कम स्क्रॉल करने के लिए सामग्री का आकार निर्धारित किया है, जो गलत है। आपको स्क्रॉल करते समय इसके माध्यम से नेविगेट करने के लिए अपने स्क्रॉल दृश्य के आकार से बड़ा सामग्री आकार सेट करना चाहिए।
जूमिंग के साथ एक ही विचार, आपने जूमिंग के लिए न्यूनतम और अधिकतम मूल्य निर्धारित किया है जो ज़ूमिंग एक्शन के माध्यम से लागू होगा।
स्वागत हे :)
एक छोटा सा जोड़, उपरोक्त सभी कारण हैं कि आपके स्क्रॉल दृश्य स्क्रॉल नहीं हो सकते हैं, लेकिन कभी-कभी माइंडलेस रूप से यह विशेष रूप से कारण हो सकता है जब स्क्रॉलव्यू को कोड के माध्यम से जोड़ा जाता है और आईबी नहीं, तो आपने अपने साक्षात्कारों को मूल दृश्य में जोड़ा होगा और नहीं स्क्रॉलव्यू इस सबव्यू को स्क्रॉल नहीं करने का कारण बनता है
और सामग्री का आकार सेट रखें और पैरेंट व्यू फ्रेम (duhh) से बड़ा है !!
मैंने इसे अपनी पहली कोशिश में काम किया। ऑटो लेआउट और सब कुछ के साथ, कोई अतिरिक्त कोड नहीं। फिर एक संग्रह दृश्य केला चला गया, रन टाइम पर दुर्घटनाग्रस्त हो गया, मुझे पता नहीं चला कि क्या गलत था, इसलिए मैंने इसे हटा दिया और इसे फिर से बनाया (मैं एक्सकोड 10 बीटा 4 का उपयोग कर रहा हूं। यह एक बग की तरह लगा) और फिर स्क्रॉलिंग चला गया था। संग्रह दृश्य फिर से काम किया, हालांकि!
कई घंटे बाद .. यह वही है जो मेरे लिए तय है। मेरे पास निम्न लेआउट था:
UIView
यह सभी बाधाओं में है। सुरक्षित क्षेत्र स्वचालित रूप से सिस्टम द्वारा परिभाषित किया गया है। सबसे खराब स्थिति में स्क्रॉल और सामग्री दृश्यों के लिए सभी बाधाओं को हटा दें और आपके लिए उन्हें IB रीसेट करना / बनाना नहीं है। उन्हें मैन्युअल रूप से बनाएं, यह काम करता है।
मूल रूप से अवधारणा सामग्री दृश्य फिटिंग स्क्रॉलव्यू है, जो सुरक्षित क्षेत्र फिटिंग है।
लेकिन इस तरह से यह काम नहीं किया। सामग्री दृश्य ऊँचाई से चूक गई। मैंने कोशिश की सभी मैं कर सकता था और केवल एक ही तरकीब कर रहा था कि कंटेंट व्यू ऊँचाई कंट्रोल-ड्रैगिंग कंटेंट व्यू .. अपने आप में हो । यह एक निश्चित ऊँचाई को परिभाषित करता है, जिसका मान व्यू कंट्रोलर के आकार से निर्धारित किया गया है (जिसे फ़्रीफ़ॉर्म के रूप में परिभाषित किया गया है, जो वास्तविक डिस्प्ले से अधिक लंबा है, जिसमें मेरे सभी साक्षात्कार शामिल हैं) और आखिरकार इसने फिर से काम किया!
पहले उल्लेख नहीं किया गया था कि कुछ!
सुनिश्चित करें कि आपका आउटलेट स्क्रॉलव्यू से सही तरीके से जुड़ा हुआ था! इसमें एक भरा हुआ सर्कल होना चाहिए, लेकिन अगर आपने भरा हुआ सर्कल है, तो भी स्क्रॉल दृश्य कनेक्ट नहीं किया जा सकता है - इसलिए डबल चेक करें! सर्कल पर होवर करें और देखें कि क्या वास्तविक स्क्रोलव्यू हाइलाइट हो जाता है! (यह मेरे लिए एक मामला था)
//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
यदि आपने एक ट्यूटोरियल का अनुसरण किया है, तो उस समय का अधिकांश भाग सही है, लेकिन कई शुरुआती जो नहीं जानते हैं, वह यह है कि स्क्रॉलव्यू सिम्युलेटर के माध्यम से सामान्य रूप से स्क्रॉल नहीं करने जा रहा है। यह केवल स्क्रॉल करने के लिए माना जाता है जब आप माउसपैड पर दबाते हैं और एक साथ स्क्रॉल करते हैं। कई अनुभवी XCode / Swift / Obj-C उपयोगकर्ता ऐसा करने के लिए उपयोग कर रहे हैं और इसलिए उन्हें नहीं पता कि इसे शुरुआती लोगों द्वारा कैसे अनदेखा किया जा सकता है। Ciao :-)
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(scrollView)
// Do any additional setup after the view
}
override func viewWillLayoutSubviews(){
super.viewWillLayoutSubviews()
scrollView.contentSize = CGSize(width: 375, height: 800)
}
यह कोड तब तक पूरी तरह से ठीक काम करेगा जब तक कि आप ऊपर बताए गए तरीके से काम करते हैं
यदि कोई अन्य समाधान आपके लिए काम नहीं करता है, तो जांच लें कि आपका स्क्रॉल दृश्य वास्तव UIScrollView
में इंटरफ़ेस बिल्डर में है।
पिछले कुछ दिनों में कुछ बिंदु पर, मेरे UIScrollView
अनायास बदल प्रकार एक करने के लिए UIView
, भले ही अपने वर्ग कहा UIScrollView
निरीक्षक में। मैं उपयोग कर रहा हूं Xcode 5.1 (5B130a)
।
आप या तो एक नया स्क्रॉल दृश्य बना सकते हैं और माप, सेटिंग्स और बाधाओं को पुराने दृश्य से कॉपी कर सकते हैं, या आप फ़ाइल UIScrollView
में अपना दृश्य मैन्युअल रूप से बदल सकते हैं xib
। मैंने एक तुलना की और निम्नलिखित अंतर पाए गए:
मूल:
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wsk-WB-LMH">
...
</scrollView>
अनायास बदल जाने के बाद:
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" customClass="UIScrollView" id="qRn-TP-cXd">
...
</view>
इसलिए मैंने <view>
लाइन को अपनी मूल <scrollView>
लाइन से बदल दिया ।
मैंने दृश्य के नज़दीकी टैग </view>
को भी बदल दिया </scrollView>
।
आईडी को वर्तमान दृश्य के समान रखना सुनिश्चित करें, इस मामले में: आईडी = "qRn-TP-cXd"।
मुझे ऐप के व्युत्पन्न डेटा को हटाकर Xcode के कैश से xib को फ्लश करना होगा:
Xcode->Window->Organizer->Projects
, अपने प्रोजेक्ट को Derived डेटा लाइन पर चुनें, हटाएं पर क्लिक करें ...या अगर किसी डिवाइस का उपयोग कर रहे हैं:
Xcode->Window->Organizer->Device
, अपना डिवाइस चुनें-> एप्लिकेशन, अपना ऐप चुनें, (-) पर क्लिक करेंअब प्रोजेक्ट को साफ करें, और ऐप को सिम्युलेटर / डिवाइस से हटा दें:
Xcode->Product->Clean
Simulator/device->press
और app->click
इसे निकालने के लिए (X) दबाए रखेंफिर आपको अपने ऐप को बनाने और चलाने में सक्षम होना चाहिए और फिर से कार्यक्षमता को स्क्रॉल करना होगा।
PS मुझे स्क्रॉल दृश्य की सामग्री का आकार सेट करने viewDidLayoutSubviews
या ऑटो लेआउट बंद करने की आवश्यकता नहीं थी , लेकिन YMMV।
यदि आपका किसी प्रकार का scrollView
सबव्यू है containerView
, तो सुनिश्चित करें कि आपका scrollView
फ्रेम या सीमा के भीतर है containerView
। मैं containerView.clipsToBounds = NO
अभी भी स्क्रॉल स्क्रीन देखने की अनुमति देता था, लेकिन क्योंकि यह scrollView
सीमा के भीतर नहीं था containerView
स्पर्श घटनाओं का पता नहीं लगाएगा।
उदाहरण के लिए:
containerView.frame = CGRectMake(0, 0, 200, 200);
scrollView.frame = CGRectMake(0, 200, 200, 200);
[containerView addSubview:scrollView];
scrollView.userInteractionEnabled = YES;
आप स्क्रॉलव्यू को देख पाएंगे, लेकिन यह उपयोगकर्ता के इंटरैक्शन प्राप्त नहीं करेगा।
निम्नलिखित कोड को viewDidLayoutSubviews
मेरे लिए Autolayout के साथ काम करने में जोड़ना। सभी उत्तरों को आजमाने के बाद:
- (void)viewDidLayoutSubviews
{
self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620);
}
//set the height of content size as required
जोड़ें UIScrollViewDelegate
और निम्न कोड को viewDidAppear
मेरे लिए निर्धारित विधि में जोड़ दें।
@interface testScrollViewController () <UIScrollViewDelegate>
-(void)viewDidAppear:(BOOL)animated {
self.scrollView.delegate = self;
self.scrollView.scrollEnabled = YES;
self.scrollView.contentSize = CGSizeMake(375, 800);
}
मेरी समस्या का समाधान इसके द्वारा किया गया:
एक बार जब मैंने सुरक्षित क्षेत्र और / या पर्यवेक्षण के लिए बाध्य शीर्ष और / या नीचे की बाधाओं को हटा दिया, तो स्क्रॉल दृश्य के अंदर के दृश्य फिर से स्क्रॉल कर सकते हैं और स्क्रीन के नीचे के शीर्ष पर स्थिर नहीं रह सकते हैं!
आशा है कि यह इस विशेष मुद्दे के साथ किसी और को दर्द के घंटों से रोकता है।
अभी तक एक और मजेदार मामला:
scrollview.superview.userInteractionEnabled सही होना चाहिए
मैं 2 + hrs बर्बाद कर रहा हूं, यह पता लगाने के लिए कि माता-पिता UIImageView हैं, जो स्वाभाविक रूप से, userInteractionEnabled == झूठा है
इस सूत्र में दिए गए उत्तरों के साथ असफल होने के बाद, मैं इस लेख पर समाधान के साथ ठोकर खाई ।
ऑटोलॉयआउट के साथ स्क्रॉलव्यू सेट करने के बारे में दो बातें सहज नहीं हैं:
यह उस लेख का सार है। दृष्टांत सहित पूर्ण विवरण के लिए, इसे देखें।
मैंने पाया कि इस AutoLayout मुद्दे के साथ ... अगर मैं सिर्फ कक्षा के बजाय ViewController
उपयोग करता हूं ... तो बस अपने आप को जोड़ें ... यह काम करता है।UIView
UIScrollView
UIScrollView
आईबी में भी मेरा यही मुद्दा था।
स्क्रॉल करने के लिए अग्रणी, अनुगामी, ऊपर और नीचे सेट करने के बाद इसके SuperView पर जाएं। मैंने कंटेनर दृश्य स्क्रॉल करने योग्य बनाने के लिए निम्नलिखित परिवर्तन किए, जो काम किया।
स्क्रॉल दृश्य को केवल क्षैतिज दिशा में स्क्रॉल करने के लिए स्क्रॉल दृश्य के केंद्र = कंटेनर दृश्य के केंद्र के साथ बाधा बनाएं
और इसे स्क्रॉल करने के लिए लंबवत स्क्रॉल करें