আমি কীভাবে একটি ইউআইএসক্রোলভিউ শীর্ষে স্ক্রোল তৈরি করব?
আমি কীভাবে একটি ইউআইএসক্রোলভিউ শীর্ষে স্ক্রোল তৈরি করব?
উত্তর:
[self.scrollView setContentOffset:
CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];
[self.scrollView setContentOffset:CGPointZero animated:YES];
অথবা আপনি যদি অনুভূমিক স্ক্রোল অবস্থানটি সংরক্ষণ করতে চান এবং কেবল উল্লম্ব অবস্থানটি পুনরায় সেট করতে চান:
[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, 0)
animated:YES];
[scrollView setContentOffset:CGPointMake(0, -scrollView.contentInset.top) animated:YES];
এটি আইওএস 6 এবং 7
[scrollView setContentOffset:CGPointMake(0, scrollView.contentSize.height-scrollView.frame.size.height) animated:YES];
এখানে একটি সুইফট এক্সটেনশন যা এটি সহজ করে তোলে:
extension UIScrollView {
func scrollToTop() {
let desiredOffset = CGPoint(x: 0, y: -contentInset.top)
setContentOffset(desiredOffset, animated: true)
}
}
ব্যবহার:
myScrollView.scrollToTop()
নতুন সঙ্গে কাজ করার চেষ্টা করুন adjustedContentInset
।
উদাহরণস্বরূপ (শীর্ষে স্ক্রোল):
var offset = CGPoint(
x: -scrollView.contentInset.left,
y: -scrollView.contentInset.top)
if #available(iOS 11.0, *) {
offset = CGPoint(
x: -scrollView.adjustedContentInset.left,
y: -scrollView.adjustedContentInset.top)
}
scrollView.setContentOffset(offset, animated: true)
আপনি ব্যবহার এমনকি যদি
prefersLargeTitles
,safe area
ইত্যাদি
সুইফট 4 এর জন্য
scrollView.setContentOffset(.zero, animated: true)
ব্যবহার setContentOffset:animated:
[scrollView setContentOffset:CGPointZero animated:YES];
আইওএস 7-তে আমি শীর্ষে যেতে একটি নির্দিষ্ট স্ক্রোলভিউ পেতে সমস্যা পেয়েছিলাম, যা আইওএস 6-এ কাজ করেছিল এবং শীর্ষে যেতে স্ক্রোলভিউ সেট করতে এটি ব্যবহার করেছে।
[self.myScroller scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
রব মায়োফের উত্তরের সুইফ্ট 3.0.1 সংস্করণ :
self.scrollView.setContentOffset(
CGPoint(x: 0,y: -self.scrollView.contentInset.top),
animated: true)
স্ট্যাটাস বারের স্ক্রোলটপ টপ আচরণ সম্পূর্ণরূপে প্রতিলিপি করতে আমাদের কেবল কন্টেন্টঅফসেট সেট করতে হবে তা নয়, এটিও নিশ্চিত করতে চাই যে স্ক্রোলইন্ডিসেটর প্রদর্শিত হয়েছে। অন্যথায় ব্যবহারকারী দ্রুত হারিয়ে যেতে পারে।
এটি সম্পাদন করার একমাত্র পাবলিক পদ্ধতি flashScrollIndicators
। দুর্ভাগ্যক্রমে, কন্টেন্টঅফসেটটি সেট করার পরে একবার এটি কল করার কোনও প্রভাব নেই কারণ তা অবিলম্বে পুনরায় সেট হয়ে যায়। আমি প্রতিটি বার ফ্ল্যাশ করার সময় এটি কাজ করে দেখতে পেলাম scrollViewDidScroll:
।
// define arbitrary tag number in a global constants or in the .pch file
#define SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG 19291
- (void)scrollContentToTop {
[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];
self.scrollView.tag = SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.scrollView.tag = 0;
});
}
আপনার ইউআইএসক্রোলভিউ ডেলেগেটে (বা ইউআইটিএবেবল / ইউআইসি কলিকেশনভিউডেলিগেট) এটিকে প্রয়োগ করুন:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.tag == SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG) {
[scrollView flashScrollIndicators];
}
}
স্ট্যাটাস বারের স্ক্রোলটপ টপ আচরণের তুলনায় আড়াল করার বিলম্বটি কিছুটা ছোট but তবে এটি এখনও দুর্দান্ত দেখাচ্ছে।
নোট করুন যে আমি "ইসক্রলিংটোটপ" রাষ্ট্রের সাথে যোগাযোগ করার জন্য ভিউ ট্যাগটিকে অপব্যবহার করছি কারণ আমার দেখার নিয়ামকগুলিতে আমার এটির প্রয়োজন। আপনি যদি অন্য কোনও কিছুর জন্য ট্যাগ ব্যবহার করে থাকেন তবে আপনি এটি আইভার বা কোনও সম্পত্তি দিয়ে প্রতিস্থাপন করতে পারেন might
আমি মনে করি আমার কাছে একটি উত্তর আছে যা আইওএস 11 এর সাথে পূর্ববর্তী সংস্করণগুলির সাথে (উল্লম্ব স্ক্রোলিংয়ের জন্য) পুরোপুরি সামঞ্জস্যপূর্ণ হওয়া উচিত
এটি নতুন অ্যাডজাস্টেড কনটেন্টইনসেটকে অ্যাকাউন্টে গ্রহণ করে এবং যখন নেভিগেশনবারে PreferLargeTitles সক্ষম করা থাকে তখন প্রয়োজনীয় অতিরিক্ত অফসেটের জন্যও অ্যাকাউন্ট লাগে যা ডিফল্ট যাই হোক না কেন তার উপরে অতিরিক্ত 52px অফসেটের প্রয়োজন বলে মনে হয়
এটি কিছুটা জটিল ছিল কারণ শিরোনামবারের অবস্থার উপর ভিত্তি করে অ্যাডজাস্টড কনটেন্টইনসেট পরিবর্তিত হয় (বড় শিরোনাম বনাম ছোট শিরোনাম) সুতরাং শিরোনামবারের উচ্চতাটি কী ছিল তা পরীক্ষা করে দেখার দরকার ছিল এবং 52px অফসেটটি যদি এর আগে থেকেই বড় অবস্থায় থাকে তবে তা প্রয়োগ করতে পারি না। নেভিগেশনবারের অবস্থাটি যাচাই করার জন্য অন্য কোনও পদ্ধতি খুঁজে পাওয়া যায় নি তাই উচ্চতা> ৪৪.০ আছে কিনা তা দেখার চেয়ে কারও কাছে যদি আরও ভাল বিকল্প থাকে তবে আমি এটি শুনতে চাই
func scrollToTop(_ scrollView: UIScrollView, animated: Bool = true) {
if #available(iOS 11.0, *) {
let expandedBar = (navigationController?.navigationBar.frame.height ?? 64.0 > 44.0)
let largeTitles = (navigationController?.navigationBar.prefersLargeTitles) ?? false
let offset: CGFloat = (largeTitles && !expandedBar) ? 52: 0
scrollView.setContentOffset(CGPoint(x: 0, y: -(scrollView.adjustedContentInset.top + offset)), animated: animated)
} else {
scrollView.setContentOffset(CGPoint(x: 0, y: -scrollView.contentInset.top), animated: animated)
}
}
জাকুব এর সমাধান দ্বারা অনুপ্রাণিত
এটি খুব সাধারণ যখন আপনার নেভিগেশন বারটি স্ক্রোলভিউ সামগ্রীর ছোট্ট অংশটিকে ওভারল্যাপ করে এবং দেখে মনে হয় বিষয়বস্তু উপরের দিক থেকে শুরু হয় না। এটি ঠিক করার জন্য আমি 2 টি কাজ করেছি:
স্ক্রোল জন্য শীর্ষে UITableViewController
, UICollectionViewController
বা কোনো UIViewController
থাকারUIScrollView
extension UIViewController {
func scrollToTop(animated: Bool) {
if let tv = self as? UITableViewController {
tv.tableView.setContentOffset(CGPoint.zero, animated: animated)
} else if let cv = self as? UICollectionViewController{
cv.collectionView?.setContentOffset(CGPoint.zero, animated: animated)
} else {
for v in view.subviews {
if let sv = v as? UIScrollView {
sv.setContentOffset(CGPoint.zero, animated: animated)
}
}
}
}
}
সুইফট 5-এ কেবল অফসেট শূন্যে সেট করুন
scrollView.setContentOffset(CGPoint.zero, animated: true)
আমি সব চেষ্টা করেছিলাম। তবে কিছুই আমার পক্ষে কাজ করেনি। অবশেষে আমি এটি পছন্দ করেছিলাম।
আমি self.view .addSubview(self.scroll)
ভিউডিডলডে কোডের লাইন যুক্ত করেছি। স্ক্রোল ভিউ এবং ফ্রেম ভিউতে উপাদান যুক্ত করার জন্য ফ্রেম সেট আপ শুরু করার পরে।
এটা আমার জন্য কাজ করেছে।
আপনি self.view .addSubview(self.scroll)
শুরুতে লাইন যুক্ত করেছেন তা নিশ্চিত করুন । তারপরে আপনি ইউআই উপাদান যুক্ত করতে পারেন।
UIScrollView
contentInset
দুর্ভাগ্যক্রমে আপনাকে অ্যাকাউন্টটি গ্রহণ করতে হতে পারে ।[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];
আমার জন্য কাজটি করে