আমার একটিতে UIScrollView
অনেকগুলি UIImageView
, ইউআইএলবেলস ইত্যাদি রয়েছে ... লেবেলগুলি এর চেয়ে লম্বা UIScrollView
, তবে আমি যখন অ্যাপটি চালনা করি তখন আমি ক্লিক করে নীচে স্ক্রোল করতে পারি না ...
কেন হতে পারে?
ধন্যবাদ
আমার একটিতে UIScrollView
অনেকগুলি UIImageView
, ইউআইএলবেলস ইত্যাদি রয়েছে ... লেবেলগুলি এর চেয়ে লম্বা 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
আমি আইবিতে কন্টেন্টসাইজ সেট করার কোনও উপায় খুঁজে পাইনি (এক্সকোড 5.0 হিসাবে) ।
দ্রষ্টব্য: আপনি যদি এই কোডটি দেওয়ার জন্য অটোলেআউটকে সবচেয়ে ভাল জায়গা ব্যবহার করেন তবে -(void)viewDidLayoutSubviews
পদ্ধতিটির মধ্যে রয়েছে।
myScrollView.delegate = self
ALSO সেট করতে ভুলবেন না , যদি এটি এখনও কাজ করে না, তবে তার নীচের উত্তরটিতে দুর্দান্ত পরামর্শ রয়েছে (আপনার এক্সিব / স্টোরিবোর্ডে যান এবং নিশ্চিত করুন যে "অটোলাআউট" অক্ষম রয়েছে)। প্রো-টিপ: আপনি <UIScrollViewDelegate>
যদি প্রোগ্রামটিমেটিকভাবে আপনার ইউআইএসক্রোলভিউতে স্ক্রোল করার মতো কিছু করতে চান তবে আপনি নিজের .h ফাইলে অন্তর্ভুক্ত করতে পারেন ।
viewDidLayoutSubviews
আমার পক্ষে কাজ করে।
আপনি দৃশ্য আপনাকে সেট পরেও স্ক্রল না পারেন, তাহলে contentSize সঠিকভাবে, আপনি নিশ্চিত করুন আনচেক > ফাইল ইন্সপেক্টর - "স্বয়ংক্রিয়-বহির্বিন্যাস ব্যবহার" ইন্টারফেস বিল্ডার হবে।
আপনি সেট করতে হবে contentSize
সঠিকভাবে স্ক্রোল করার জন্য আপনাকে স্ক্রোল ভিউয়ের সম্পত্তি হবে।
আপনি স্বয়ংক্রিয়-বহির্বিন্যাস ব্যবহার করেন, তাহলে আপনি সেট প্রয়োজন contentSize
মধ্যে viewDidLayoutSubviews
অনুক্রমে জন্য এটি স্বয়ংক্রিয়-বহির্বিন্যাস সম্পূর্ণ হওয়ার পর প্রয়োগ করতে হবে।
কোডটি এর মতো দেখতে পারে:
-(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
একটি জীবনচক্রের সময় একাধিকবার কল করা যায় যাতে আপনি প্রত্যাশার চেয়ে উচ্চতা বাড়ানোর ঝুঁকিটি চালান।
উপরের উত্তরটি সঠিক - স্ক্রোলিংটি ঘটানোর জন্য সামগ্রীর আকার নির্ধারণ করা দরকার।
আপনি যদি ইন্টারফেস বিল্ডার ব্যবহার করে থাকেন তবে এটি করার জন্য ব্যবহারকারীর সংজ্ঞায়িত রানটাইম বৈশিষ্ট্য রয়েছে। উদাহরণ:
সামগ্রীর আকারকে বিশাল সংখ্যায় আকার দেওয়ার চেষ্টা করুন। আমার সামগ্রীর আকার নিয়ন্ত্রণ আকারের চেয়ে বড় বলে মনে হলেও কেন আমার স্ক্রোল ভিউ স্ক্রল করে না understand আমি আবিষ্কার করেছি যে যদি সামগ্রীর আকার প্রয়োজনের চেয়ে ছোট হয় তবে এটি কার্যকর হয় না।
self.scrollView.contentSize = CGSizeMake(2000, 2000);
2000 এর পরিবর্তে আপনি আপনার নিজের বড় সংখ্যা রাখতে পারেন। এবং যদি এটি কাজ করে তবে এর অর্থ হ'ল আপনি পুনরায় আকার দেওয়ার সময় আপনার সামগ্রীর আকার যথেষ্ট পরিমাণে বড় নয়।
কাজ করার জন্য স্ক্রোল ভিউয়ের জন্য প্রতিনিধিটির প্রয়োজন হয় না।
আপনার কাছে স্ক্রোল ভিউয়ের কন্টেন্টসাইজ সম্পত্তি সঠিক আকারে সেট করা আছে তা নিশ্চিত করুন (যেমন, আপনার সমস্ত সামগ্রীকে পরিবেষ্টনের জন্য যথেষ্ট বড় একটি)
'ব্যবহার অটোলেআউট' আনচেক আমার জন্য কৌশলটি করেছে।
পরিবেশ: 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)
}
স্ক্রোল ভিউ কেন স্ক্রল হচ্ছে না এই ধারণাটি আপনি স্ক্রোল ভিউয়ের আকারের চেয়ে কম স্ক্রোল করার জন্য সামগ্রীর আকার নির্ধারণ করেছেন যা ভুল। স্ক্রোল করার সময় নেভিগেট করার জন্য আপনার সামগ্রীর আকারটি আপনার স্ক্রোল ভিউয়ের আকারের চেয়ে বড় সেট করা উচিত।
জুমিংয়ের সাথে একই ধারণাটি, আপনি জুমিংয়ের জন্য ন্যূনতম এবং সর্বাধিক মান নির্ধারণ করেন যা জুমিং ক্রিয়াকলাপের মাধ্যমে প্রয়োগ করা হবে।
স্বাগত :)
সর্বোপরি একটি ছোট সংযোজন, আপনার স্ক্রোল ভিউ স্ক্রল না হওয়ার কারণগুলি হ'ল প্রকৃত কারণ তবে কখনও কখনও নির্বোধের কারণেই বিশেষত যখন কারণ হতে পারে কোডের মাধ্যমে স্ক্রোলভিউ যুক্ত করা হয় এবং আইবি নয়, আপনি আপনার সাবভিউগুলি প্যারেন্ট ভিউতে যুক্ত করেছেন এবং না স্ক্রোলভিউ এর ফলে সাবউভি স্ক্রোল না হওয়ার কারণ হয়ে থাকে
এবং সামগ্রীর আকার সেট করুন এবং পিতামাতার ভিউ ফ্রেমের চেয়ে বড় রাখুন (দুহ !!)
আমি আমার প্রথম চেষ্টাতে এটি কাজ করেছিলাম। স্বয়ংক্রিয় বিন্যাস এবং সমস্ত কিছু সহ, কোনও অতিরিক্ত কোড নেই। তারপরে একটি সংগ্রহের দৃশ্য কলাতে চলেছিল, রান সময়ে ক্র্যাশ হয়ে, আমি কী ভুল ছিল তা খুঁজে পেলাম না, তাই আমি এটি মুছে ফেলা এবং পুনরায় তৈরি করেছি (আমি এক্সকোড 10 বিটা ব্যবহার করছি 4 এটি একটি বাগের মতো অনুভূত হয়েছিল) এবং তারপরে স্ক্রোলিংটি চলে যায়। কালেকশন ভিউ আবার কাজ করেছে, যদিও!
অনেক ঘন্টা পরে .. এটি আমার জন্য এটি ঠিক করে দিয়েছে। আমার নিম্নলিখিত লেআউটটি ছিল:
UIView
সবই সীমাবদ্ধতায়। নিরাপদ অঞ্চল স্বয়ংক্রিয়ভাবে সিস্টেম দ্বারা সংজ্ঞায়িত করা হয়। সবচেয়ে খারাপ ক্ষেত্রে স্ক্রল এবং কন্টেন্ট মতামত জন্য সব সীমাবদ্ধতা মুছে ফেলুন এবং না না আইবি রিসেট / তাদের কাছে আপনার জন্য তৈরি আছে। এগুলি ম্যানুয়ালি তৈরি করুন, এটি কাজ করে।
মূলত ধারণাটি হ'ল কনটেন্ট ভিউ ফিটিং স্ক্রোলভিউ, যা নিরাপদ অঞ্চলকে ফিট করে।
কিন্তু যেমন এটি কাজ করে না। সামগ্রী ভিউটি উচ্চতা মিস করেছে। আমি সব আমি পারতাম এবং শুধুমাত্র এক কৌতুক করছেন একটি হয়েছে চেষ্টা নিজেই সামগ্রী দেখতে উচ্চতা নির্মিত কন্ট্রোল- টেনে সামগ্রী দেখতে .. । এটি একটি নির্দিষ্ট উচ্চতা সংজ্ঞায়িত করেছে, যার মানটি ভিউ কন্ট্রোলারের আকার থেকে গণনা করা হয়েছে (ফ্রিফর্ম হিসাবে সংজ্ঞায়িত, বাস্তব প্রদর্শনীর চেয়ে দীর্ঘতর, আমার সমস্ত পূর্বরূপগুলি ধারণ করে) এবং শেষ পর্যন্ত এটি আবার কাজ করে!
এমন কিছু যা আগে উল্লেখ করা হয়নি!
নিশ্চিত করুন যে আপনার আউটলেটটি সঠিকভাবে স্ক্রোলভিউয়ের সাথে সংযুক্ত ছিল! এটিতে একটি ভরাট চেনাশোনা থাকা উচিত, তবে আপনি যদি বৃত্ত পূরণ করেছেন তবে স্ক্রোলভিউ সংযুক্ত নাও হতে পারে - তাই ডাবল চেক করুন! চেনাশোনাটি ঘুরে দেখুন এবং দেখুন প্রকৃত স্ক্রোলভিউটি হাইলাইট হয়েছে কিনা! (এটি আমার জন্য কেস ছিল)
//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
কোড টি বেশিরভাগ সময় সঠিক হয় যদি আপনি কোনও টিউটোরিয়াল অনুসরণ করে থাকেন তবে যা অনেক শিক্ষানবিশ জানেন না তা হ'ল স্ক্রোলভিউ সিমুলেটারের মাধ্যমে সাধারণত স্ক্রোল করে না । মনে করা হয় আপনি কেবল মাউসপ্যাডে নীচে টিপুন এবং একই সাথে স্ক্রোল করবেন তখন sc অনেক অভিজ্ঞ এক্সকোড / সুইফট / ওবজে-সি ব্যবহারকারী এই কাজটি করতে এতটাই অভ্যস্ত এবং তাই তারা জানেন না কীভাবে এটি সম্ভবত প্রাথমিকভাবে অগ্রাহ্য করা যায়। সিওও :-)
@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>
।
এক্ষেত্রে আইডিটিকে বর্তমান দৃশ্যের মতোই রাখার বিষয়টি নিশ্চিত করুন: id = "qRn-TP-cXd"।
অ্যাপ্লিকেশন থেকে প্রাপ্ত ডেটা মুছে ফেলে আমাকে এক্সকোডের ক্যাশে থেকে xib ফ্লাশ করতে হয়েছিল:
Xcode->Window->Organizer->Projects
, উত্পন্ন ডেটা লাইনে আপনার প্রকল্পটি চয়ন করুন, মুছুন ক্লিক করুন ...বা যদি কোনও ডিভাইস ব্যবহার করে থাকে:
Xcode->Window->Organizer->Device
, আপনার ডিভাইস-> অ্যাপ্লিকেশনগুলি চয়ন করুন, আপনার অ্যাপ্লিকেশনটি চয়ন করুন, ক্লিক করুন (-)এখন প্রকল্পটি পরিষ্কার করুন এবং সিমুলেটর / ডিভাইস থেকে অ্যাপটি সরান:
Xcode->Product->Clean
Simulator/device->press
এবং ধরে রাখুন app->click
(এক্স)তারপরে আপনার অ্যাপ্লিকেশনটি তৈরি এবং চালাতে সক্ষম হবেন এবং আবার স্ক্রোলিং কার্যকারিতা থাকা উচিত।
পিএস আমাকে স্ক্রোল ভিউ এর সামগ্রীর আকার সেট করতে viewDidLayoutSubviews
বা অটো লেআউটটি বন্ধ করতে হয়নি, তবে ওয়াইএমএমভি।
যদি আপনার কোনও প্রকারের 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
অটোলেআউট সহ আমার জন্য নিম্নলিখিত কোড যুক্ত করা worked সমস্ত উত্তর চেষ্টা করার পরে:
- (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);
}
আমার সমস্যাটি এর দ্বারা সমাধান করা হয়েছিল:
একবার আমি নিরাপদ অঞ্চল এবং / অথবা তত্ত্বাবধানে আবদ্ধ শীর্ষ এবং / বা নীচের সীমাবদ্ধতাগুলি সরিয়ে ফেললে স্ক্রোলভিউয়ের অভ্যন্তরীণ দর্শনগুলি আবার স্ক্রোল করতে পারে এবং স্ক্রিনের নীচের অংশে স্থির থাকে না!
আশা করি এটি এই বিশেষ সমস্যাটির সাথে কয়েক ঘন্টা ব্যথা থেকে অন্য কাউকে থামিয়ে দিয়েছে।
আরও একটি মজার ঘটনা:
স্ক্রোলভিউ.সুপারভিউ.ইউসারআইন্ট্রিএকশন অবশ্যই সক্ষম হওয়া উচিত
আমি পিতামাতাকে ইউআইআইমেজভিউটি সনাক্ত করার জন্য এটির পিছনে পিছনে 2 + ঘন্টা নষ্ট করেছি, যা স্বাভাবিকভাবেই ব্যবহারকারীর অন্তর্নিহিতকরণ সক্ষম হয়েছে == মিথ্যা
এই থ্রেডে প্রদত্ত উত্তরের সাথে ব্যর্থ হওয়ার পরে, সমাধানের সাথে আমি এই নিবন্ধটিতে হোঁচট খেয়েছি।
অটোলেআউট দিয়ে স্ক্রোলভিউ সেট আপ করার বিষয়ে দুটি জিনিস স্বজ্ঞাত নয়:
এটি সেই নিবন্ধটির সংক্ষিপ্তসার। চিত্র সহ সম্পূর্ণ ব্যাখ্যার জন্য, এটি পরীক্ষা করে দেখুন।
আমি দেখতে পেলাম যে এই অটোলআউট ইস্যুটি দিয়ে ... আমি যদি ক্লাসের পরিবর্তে কেবল ViewController
ব্যবহারটি করি ... তবে কেবল একটি নিজেকে যুক্ত করুন ... এটি কাজ করে।UIView
UIScrollView
UIScrollView
আইবিতেও আমার একই সমস্যা ছিল।
স্ক্রোলভিউর শীর্ষস্থানীয়, পিছনে, শীর্ষ এবং নীচেটি তার সুপারভিউতে সেট করার পরে। আমি কনটেইনারভিউ স্ক্রোলযোগ্য করার জন্য নিম্নলিখিত পরিবর্তনগুলি করেছি, যা কাজ করেছে।
স্ক্রোলভিউকে কেবল অনুভূমিক দিকের দিকে স্ক্রোল করতে স্ক্রোলভিউয়ের কেন্দ্রের সাথে সীমাবদ্ধ করুন Y = কনটেইনারভিউয়ের কেন্দ্র Y
এবং এটিকে উল্লম্বভাবে স্ক্রোলযোগ্য করতে স্ক্রোলভিউয়ের কেন্দ্র x = কনটেইনারভিউ'র কেন্দ্রে এক্স করুন make