আমার UIView
আইফোনের স্প্রিংবোর্ডের মতো আমি এটি UIScrollView
এবং ব্যবহার করে তৈরি করেছি UIButtons
। আমি বলেন স্ক্রোলভিউতে অনুভূমিক স্ক্রোলিং অক্ষম করতে চাই। আমি কেবল উল্লম্ব স্ক্রোলিং চাই। আমি কীভাবে এটি সম্পাদন করব?
আমার UIView
আইফোনের স্প্রিংবোর্ডের মতো আমি এটি UIScrollView
এবং ব্যবহার করে তৈরি করেছি UIButtons
। আমি বলেন স্ক্রোলভিউতে অনুভূমিক স্ক্রোলিং অক্ষম করতে চাই। আমি কেবল উল্লম্ব স্ক্রোলিং চাই। আমি কীভাবে এটি সম্পাদন করব?
উত্তর:
আপনার contentSize
সম্পত্তি সেট করতে হবে UIScrollView
। উদাহরণস্বরূপ, যদি আপনার UIScrollView
320 পিক্সেল প্রশস্ত হয় (পর্দার প্রস্থ), তবে আপনি এটি করতে পারেন:
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
UIScrollView
উইলটি কেবল তখন উল্লম্বভাবে স্ক্রোল করবে কারণ এটি ইতিমধ্যে সমস্ত কিছু অনুভূমিকভাবে প্রদর্শন করতে পারে।
আপডেট হয়েছে: (@ ইরানমারম তার মন্তব্যে ইঙ্গিত করার পরে)
আপনি করতে পারেন অনুভূমিক স্ক্রলিং অথবা উল্লম্ব স্ক্রলিং বন্ধ মধ্যে ScrollViewDelegate
পদ্ধতি। এখানে এটি কিভাবে,
অনুভূমিক স্ক্রোলিং থামায়:
আপনি যদি অনুভূমিকভাবে স্ক্রোল করতে চান তবে আপনার সামগ্রীর অফসেট.এক্স বাড়ানো দরকার। এটি আটকাচ্ছে যে অনুভূমিক দিকে স্ক্রোলভিউ স্ক্রোলটি থামিয়ে দেয়।
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
উল্লম্ব স্ক্রোলিং থামায়:
আপনি যদি উল্লম্বভাবে স্ক্রোল করতে চান, তবে আপনার সামগ্রী ffffset.y বৃদ্ধি করতে হবে। আটকাচ্ছে যা উল্লম্ব দিকে স্ক্রোলভিউ স্ক্রোলটি থামিয়ে দেয়।
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
উপরের কোডটি এ x
এবং y
এর পরিবর্তনগুলি প্রতিরোধ করে scrollview contentOffset
এবং এটি scrollViewDidScroll:
পদ্ধতিতে স্ক্রোলিং বন্ধ করে দেয় ।
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
অনুভূমিক স্ক্রোলিং অক্ষম করতে। আমি এটিকে আরও পঠনযোগ্য বলে মনে করি এটি ছোট, এবং শূন্যের জন্য পরীক্ষা করার কোনও অর্থ নেই কারণ কোডটির সাথে কার্যত এমন কোনও ওভারহেড নেই যা এই অবিশ্বাস্যভাবে চালিত হয় (অর্থাত সেকেন্ডে সর্বোচ্চ কয়েক দশকবার)।
scrollView.contentOffset.y = 0.0
ডেলিগেটের কার্যক্রমে উল্লম্ব স্ক্রোলিং এবং scrollView.contentOffset.x = 0.0
অনুভূমিক স্ক্রোলিং বন্ধ করতে scrollViewDidScroll()
ব্যবহার করুন। যাইহোক, আমি বিশ্বাস করি যে scrollView.contentSize
সমান সমান নিশ্চিত scrollView.frame.size
করা একটি আরও ভাল (সঠিক) সমাধান। উত্তর @ উদ্যানবিউলিউ দেখুন।
iOS7 ব্যবহারের পর থেকে
self.automaticallyAdjustsScrollViewInsets = NO;
// এবং 3 পৃষ্ঠাগুলি সহ আপনার পৃষ্ঠা স্ক্রোলার তৈরি করুন
self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
[self.pageView setShowsVerticalScrollIndicator:NO];
[self.pageView setPagingEnabled:YES];
[self.view addSubview:self.pageView];
self.collectionView.pagingEnabled = YES;
মসৃণ স্ক্রোলিংয়ের সাথে সমস্যাটি সমাধান করতে আমাকে সহায়তা করেছে (টেনে আনছে না)। সমস্যাটি পদ্ধতিতে ছিল scrollViewWillEndDragging:
- টার্গেটকন্টেন্টএফসেটটি স্ক্রোলভিউ.কন্টেন্টঅফসেটের মতোই ছিল এবং পৃষ্ঠা সনাক্তকারী লজিক সঠিকভাবে কাজ করে না।
দ্রুত সমাধান
দুটি আউটলেট তৈরি করুন, একটি আপনার দেখার জন্য এবং একটি আপনার স্ক্রোল দর্শনের জন্য:
@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
তারপরে আপনার ভিউডিডলআউটসুভিউগুলিতে আপনি নিম্নলিখিত কোডটি যুক্ত করতে পারেন:
let scrollSize = CGSize(width: myView.frame.size.width,
height: myView.frame.size.height)
scrollView.contentSize = scrollSize
আমরা যা করেছি তা হল দর্শনের উচ্চতা এবং প্রস্থ সংগ্রহ করা এবং এটির সাথে মিলে স্ক্রোলভিউজের সামগ্রীর আকার সেট করা। এটি আপনার স্ক্রোলভিউটিকে অনুভূমিকভাবে স্ক্রোল করা থেকে বিরত রাখবে।
আরও চিন্তা:
সিজি সাইজমেক সিজিফ্লোটস ব্যবহার করে প্রস্থ এবং উচ্চতা নেয়। দ্বিতীয় প্যারামিটারের জন্য আপনাকে আপনার ইউআইএসক্রোলভিউ বিদ্যমান উচ্চতা ব্যবহার করতে হতে পারে। যা দেখতে এই রকম হবে:
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
আমার ক্ষেত্রে, সুইফট ৪.২ দিয়ে আপনি ব্যবহার করতে পারেন:
উল্লম্ব স্ক্রোলটি অক্ষম করুন:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
অনুভূমিক স্ক্রোলটি অক্ষম করুন:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0.0
}
আমার ক্ষেত্রে কন্টেন্টভিউয়ের প্রস্থটি ইউআইএসক্রোলভিউয়ের প্রস্থের চেয়ে বেশি ছিল এবং এটি অনাকাঙ্ক্ষিত অনুভূমিক স্ক্রোলিংয়ের কারণ ছিল। আমি এটি ইউআইস্ক্রোলভিউয়ের প্রস্থের সমান কন্টেন্টভিউয়ের প্রস্থ নির্ধারণ করে সমাধান করেছি।
আশা করি এটি কাউকে সাহায্য করবে
আমি এই এবং অন্যান্য থ্রেডের বিভিন্ন পরামর্শ ব্যর্থ চেষ্টা করে কিছু সময়ের জন্য এটির সাথে লড়াই করেছি।
তবে, অন্য থ্রেডে (নিশ্চিত নয় কোথায়) কেউ পরামর্শ দিয়েছেন যে ইউআইএসক্রোলভিউতে নেতিবাচক বাধা ব্যবহার করা তার পক্ষে কাজ করে।
তাই আমি বেমানান ফলাফলগুলির সাথে সীমাবদ্ধতার বিভিন্ন সমন্বয় চেষ্টা করেছি। পরিশেষে আমার পক্ষে যা কাজ হয়েছিল তা হ'ল স্ক্রোলভিউতে -32 এর শীর্ষস্থানীয় এবং অনুসরণীয় সীমাবদ্ধতা যুক্ত করা এবং 320 (এবং কেন্দ্রিক) প্রস্থ সহ একটি (অদৃশ্য) পাঠ্যদর্শন যুক্ত করা।
আইওএস 11-এ পরিচিত একটি নতুন সম্পত্তি UIScrollView
var contentLayoutGuide: UILayoutGuide
ডকুমেন্টেশনে বলা হয়েছে যে আপনি:
আপনি যখন কোনও স্ক্রোল দর্শনের সামগ্রী ক্ষেত্রের সাথে সম্পর্কিত স্বয়ংক্রিয় বিন্যাস সীমাবদ্ধতা তৈরি করতে চান তখন এই বিন্যাস গাইডটি ব্যবহার করুন।
অন্য কোন স্বয়ংক্রিয়-বহির্বিন্যাস সীমাবদ্ধতার আপনাকে জুড়তে করা যেতে পারে যে আপনার সীমাবদ্ধ করতে চাইবেন বরাবর widthAnchor
এর UIScrollView
'র contentLayoutGuide
"ফ্রেম" হিসাবে একই আকার যাবে। আপনি frameLayoutGuide
(আইওএস 11 এও প্রবর্তিত) বা যে কোনও বাহ্যিক প্রস্থ (যেমন আপনার superView
এর) ব্যবহার করতে পারেন
উদাহরণ:
NSLayoutConstraint.activate([
scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])
ডকুমেন্টেশন: https://developer.apple.com/docamentation/uikit/uiscrolview/2865870- কনটেন্টলআউটগাইড
আমি একবার এটি ইউআইএসক্রোলভিউয়ের পরিবর্তে কেবলমাত্র 1 টি সেল দিয়ে একটি ইউআইটিবেবল ভিউ দিয়ে প্রতিস্থাপন করেছি, এটি দুর্দান্ত কাজ করেছে।
এই একক লাইন ব্যবহার করুন।
self.automaticallyAdjustsScrollViewInsets = NO;