উত্তর:
UIScrollView
এর অন্তর্ভুক্ত সাবউউভিউয়ের উপর ভিত্তি করে সামগ্রীর আকারের আপডেট করতে আমি সর্বকালের সেরা পদ্ধতিটি পেয়েছি:
উদ্দেশ্য গ
CGRect contentRect = CGRectZero;
for (UIView *view in self.scrollView.subviews) {
contentRect = CGRectUnion(contentRect, view.frame);
}
self.scrollView.contentSize = contentRect.size;
দ্রুতগতি
let contentRect: CGRect = scrollView.subviews.reduce(into: .zero) { rect, view in
rect = rect.union(view.frame)
}
scrollView.contentSize = contentRect.size
ইউআইএসক্রোলভিউ স্বয়ংক্রিয়ভাবে এর সামগ্রীর উচ্চতা জানে না। আপনাকে নিজের জন্য উচ্চতা এবং প্রস্থের গণনা করতে হবে
এরকম কিছু করে করুন
CGFloat scrollViewHeight = 0.0f;
for (UIView* view in scrollView.subviews)
{
scrollViewHeight += view.frame.size.height;
}
[scrollView setContentSize:(CGSizeMake(320, scrollViewHeight))];
তবে এটি কেবল তখনই কাজ করে যদি ভিউগুলি একে অপরের নীচে থাকে। যদি একে অপরের পাশে আপনার মতামত থাকে তবে আপনাকে কেবলমাত্র একটির উচ্চতা যুক্ত করতে হবে যদি আপনি স্ক্রোলারের সামগ্রীটিকে সত্যিকারের চেয়ে বড় সেট করতে না চান।
int y = CGRectGetMaxY(((UIView*)[_scrollView.subviews lastObject]).frame); [_scrollView setContentSize:(CGSizeMake(CGRectGetWidth(_scrollView.frame), y))];
সেট translatesAutoresizingMaskIntoConstraints
থেকে NO
জড়িত সকল দৃশ্য উপর।
আপনার স্ক্রোল ভিউটির বাইরে স্ক্রোল ভিউয়ের সীমাবদ্ধতার সাথে আকার দিন।
স্ক্রোল ভিউয়ের মধ্যে সংক্ষিপ্তসারগুলি সংক্ষিপ্তসারগুলি ব্যবহার করুন, সুনির্দিষ্ট হয়েছিলেন যে সীমাবদ্ধতাগুলি স্ক্রোল ভিউয়ের চারটি প্রান্তে বেঁধে দেয় এবং তাদের আকার পেতে স্ক্রোল ভিউয়ের উপর নির্ভর করে না।
সূত্র: https://developer.apple.com/library/ios/technotes/tn2154/_index.html
আমি এপুজ এবং জিসিসির উত্তরে এটি যুক্ত করেছি। এটি সাবভিউগুলির y অবস্থান ব্যবহার করে এবং স্ক্রোল বারগুলি অন্তর্ভুক্ত করে না। সম্পাদনা দৃশ্যমান যে সর্বনিম্ন সাব ভিউয়ের নীচে ব্যবহার করে।
+ (CGFloat) bottomOfLowestContent:(UIView*) view
{
CGFloat lowestPoint = 0.0;
BOOL restoreHorizontal = NO;
BOOL restoreVertical = NO;
if ([view respondsToSelector:@selector(setShowsHorizontalScrollIndicator:)] && [view respondsToSelector:@selector(setShowsVerticalScrollIndicator:)])
{
if ([(UIScrollView*)view showsHorizontalScrollIndicator])
{
restoreHorizontal = YES;
[(UIScrollView*)view setShowsHorizontalScrollIndicator:NO];
}
if ([(UIScrollView*)view showsVerticalScrollIndicator])
{
restoreVertical = YES;
[(UIScrollView*)view setShowsVerticalScrollIndicator:NO];
}
}
for (UIView *subView in view.subviews)
{
if (!subView.hidden)
{
CGFloat maxY = CGRectGetMaxY(subView.frame);
if (maxY > lowestPoint)
{
lowestPoint = maxY;
}
}
}
if ([view respondsToSelector:@selector(setShowsHorizontalScrollIndicator:)] && [view respondsToSelector:@selector(setShowsVerticalScrollIndicator:)])
{
if (restoreHorizontal)
{
[(UIScrollView*)view setShowsHorizontalScrollIndicator:YES];
}
if (restoreVertical)
{
[(UIScrollView*)view setShowsVerticalScrollIndicator:YES];
}
}
return lowestPoint;
}
self.scrollView.showsHorizontalScrollIndicator = NO;
self.scrollView.showsVerticalScrollIndicator = NO;
শুরুতে এবং self.scrollView.showsHorizontalScrollIndicator = YES;
self.scrollView.showsVerticalScrollIndicator = YES;
পদ্ধতিটির শেষে করেছিলেন?
যে কেউ এটি রূপান্তর করতে খুব অলস হয় তার জন্য দ্রুত স্বীকৃত উত্তরটি এখানে দেওয়া হল:
var contentRect = CGRectZero
for view in self.scrollView.subviews {
contentRect = CGRectUnion(contentRect, view.frame)
}
self.scrollView.contentSize = contentRect.size
@ লিভিটানের উত্তরের একটি সুইফট 3 রূপান্তর এখানে দেওয়া হয়েছে:
EXTENSION কে
import UIKit
extension UIScrollView {
func resizeScrollViewContentSize() {
var contentRect = CGRect.zero
for view in self.subviews {
contentRect = contentRect.union(view.frame)
}
self.contentSize = contentRect.size
}
}
, USAGE
scrollView.resizeScrollViewContentSize()
ব্যবহার করা খুব সহজ!
নিম্নলিখিত এক্সটেনশনটি সুইফটে সহায়ক হবে ।
extension UIScrollView{
func setContentViewSize(offset:CGFloat = 0.0) {
// dont show scroll indicators
showsHorizontalScrollIndicator = false
showsVerticalScrollIndicator = false
var maxHeight : CGFloat = 0
for view in subviews {
if view.isHidden {
continue
}
let newHeight = view.frame.origin.y + view.frame.height
if newHeight > maxHeight {
maxHeight = newHeight
}
}
// set content size
contentSize = CGSize(width: contentSize.width, height: maxHeight + offset)
// show scroll indicators
showsHorizontalScrollIndicator = true
showsVerticalScrollIndicator = true
}
}
প্রদত্ত উত্তরের সাথে যুক্তিও একই রকম। যাইহোক, এটি এর মধ্যে লুকানো দর্শন বাদ দেয় UIScrollView
এবং স্ক্রোল সূচকগুলি গোপনের পরে গণনা করা হয়।
এছাড়াও, এখানে একটি functionচ্ছিক ফাংশন প্যারামিটার রয়েছে এবং আপনি ফাংশনটিতে প্যারামিটার পাস করে একটি অফসেট মান যুক্ত করতে সক্ষম হন।
@ লেভিয়াথন থেকে দুর্দান্ত এবং সর্বোত্তম সমাধান। কেবল এফপি (ফাংশনাল প্রোগ্রামিং) পদ্ধতির সাহায্যে সুইফটে অনুবাদ করা।
self.scrollView.contentSize = self.scrollView.subviews.reduce(CGRect(), {
CGRectUnion($0, $1.frame)
}.size
self.contentSize = self.subviews.reduce(CGRect(), { $0.union($1.frame) }).size
কোন শিশু "আরও দূরে পৌঁছেছে" গণনা করে আপনি ইউআইএসক্রোলভিউয়ের ভিতরে থাকা সামগ্রীর উচ্চতা পেতে পারেন। এটি গণনা করতে আপনাকে মূল উত্স Y (শুরু) এবং আইটেমের উচ্চতা বিবেচনা করতে হবে।
float maxHeight = 0;
for (UIView *child in scrollView.subviews) {
float childHeight = child.frame.origin.y + child.frame.size.height;
//if child spans more than current maxHeight then make it a new maxHeight
if (childHeight > maxHeight)
maxHeight = childHeight;
}
//set content size
[scrollView setContentSize:(CGSizeMake(320, maxHeight))];
জিনিসগুলি এইভাবে করার মাধ্যমে আইটেমগুলি (সাবউভিউগুলি) একে অপরের অধীনে সরাসরি স্ট্যাক করা উচিত নয়।
@ ইমেনগ্রোর সমাধানের ভিত্তিতে আমি আরও একটি সমাধান নিয়ে এসেছি
NSInteger maxY = 0;
for (UIView* subview in scrollView.subviews)
{
if (CGRectGetMaxY(subview.frame) > maxY)
{
maxY = CGRectGetMaxY(subview.frame);
}
}
maxY += 10;
[scrollView setContentSize:CGSizeMake(scrollView.frame.size.width, maxY)];
মূলত, আমরা সনাক্ত করতে পারি যে ভিউটিতে কোন উপাদানটি সবচেয়ে নিচে রয়েছে এবং নীচে একটি 10px প্যাডিং যুক্ত করে
যেহেতু একটি স্ক্রোলভিউতে অন্যান্য স্ক্রোলভিউ বা পৃথক ডিপথ সাবভিউ গাছ থাকতে পারে, গভীরতার সাথে পুনরাবৃত্তভাবে চালানো ভাল is
সুইফট 2
extension UIScrollView {
//it will block the mainThread
func recalculateVerticalContentSize_synchronous () {
let unionCalculatedTotalRect = recursiveUnionInDepthFor(self)
self.contentSize = CGRectMake(0, 0, self.frame.width, unionCalculatedTotalRect.height).size;
}
private func recursiveUnionInDepthFor (view: UIView) -> CGRect {
var totalRect = CGRectZero
//calculate recursevly for every subView
for subView in view.subviews {
totalRect = CGRectUnion(totalRect, recursiveUnionInDepthFor(subView))
}
//return the totalCalculated for all in depth subViews.
return CGRectUnion(totalRect, view.frame)
}
}
ব্যবহার
scrollView.recalculateVerticalContentSize_synchronous()
বা কেবল করুন:
int y = CGRectGetMaxY(((UIView*)[_scrollView.subviews lastObject]).frame); [_scrollView setContentSize:(CGSizeMake(CGRectGetWidth(_scrollView.frame), y))];
(এই সমাধানটি এই পৃষ্ঠায় একটি মন্তব্য হিসাবে আমার দ্বারা যুক্ত হয়েছিল this এই মন্তব্যের জন্য ১৯ টি আপ-ভোট পাওয়ার পরে, আমি এই সমাধানটিকে সম্প্রদায়ের সুবিধার জন্য একটি আনুষ্ঠানিক উত্তর হিসাবে যুক্ত করার সিদ্ধান্ত নিয়েছি!)
সুইফট 4 এর জন্য হ্রাস ব্যবহার করে:
self.scrollView.contentSize = self.scrollView.subviews.reduce(CGRect.zero, {
return $0.union($1.frame)
}).size
আকারটি এর ভিতরে থাকা সামগ্রী এবং ক্লিপিং বিকল্পগুলির উপর নির্ভর করে। যদি এটি একটি পাঠ্যদর্শন হয়, তবে এটি মোড়ানো, পাঠ্যের কতগুলি লাইন, ফন্টের আকার এবং এই জাতীয় উপর নির্ভর করে। আপনার নিজের গুণন করা প্রায় অসম্ভব। সুসংবাদটি হ'ল, ভিউটি লোড হওয়ার পরে এবং ভিউইলঅপায়ারে এটি গণনা করা হয়। এর আগে, এটি সমস্ত অজানা এবং সামগ্রীর আকার ফ্রেম আকারের সমান হবে। তবে, ভিউউইল অ্যাপ্ল পদ্ধতিতে এবং এর পরে (যেমন ভিউডিডঅ্যাপিয়ার) সামগ্রীর আকারটি আসল হবে।
রিচির কোডটি মোড়ানো আমি একটি কাস্টম ইউআইএসক্রোলভিউ ক্লাস তৈরি করেছি যা সামগ্রীতে পুনরায় আকার পরিবর্তন করতে স্বয়ংক্রিয়ভাবে চলে!
SBScrollView.h
@interface SBScrollView : UIScrollView
@end
SBScrollView.m:
@implementation SBScrollView
- (void) layoutSubviews
{
CGFloat scrollViewHeight = 0.0f;
self.showsHorizontalScrollIndicator = NO;
self.showsVerticalScrollIndicator = NO;
for (UIView* view in self.subviews)
{
if (!view.hidden)
{
CGFloat y = view.frame.origin.y;
CGFloat h = view.frame.size.height;
if (y + h > scrollViewHeight)
{
scrollViewHeight = h + y;
}
}
}
self.showsHorizontalScrollIndicator = YES;
self.showsVerticalScrollIndicator = YES;
[self setContentSize:(CGSizeMake(self.frame.size.width, scrollViewHeight))];
}
@end
কীভাবে ব্যবহার করবেন:
কেবলমাত্র আপনার ভিউ কন্ট্রোলারে .h ফাইলটি আমদানি করুন এবং সাধারণ ইউআইএসক্রোলভিউয়ের পরিবর্তে একটি এসবিএসক্রোলভিউ দৃষ্টান্ত ঘোষণা করুন।
এই জাতীয় গতিশীল কন্টেন্ট আকার সেট করুন।
self.scroll_view.contentSize = CGSizeMake(screen_width,CGRectGetMaxY(self.controlname.frame)+20);
আমি সবচেয়ে ভাল কাজ করার জন্য লিবিয়াথনের উত্তরও পেয়েছি। তবে এটি একটি অদ্ভুত উচ্চতা গণনা করা হয়েছিল was সাবভিউগুলি লুপ করার সময়, যদি স্ক্রোলভিউটি স্ক্রোল সূচকগুলি দেখানোর জন্য সেট করা থাকে তবে সেগুলি সাবভিউয়ের অ্যারেতে থাকবে। এই ক্ষেত্রে সমাধানটি হ'ল লুপিংয়ের আগে অস্থায়ীভাবে স্ক্রোল সূচকগুলি অক্ষম করা উচিত, তারপরে তাদের পূর্বের দৃশ্যমানতার সেটিংসটি পুনরায় প্রতিষ্ঠিত করুন।
-(void)adjustContentSizeToFit
ইউআইএসক্রোলভিউয়ের একটি কাস্টম সাবক্লাসে একটি সর্বজনীন পদ্ধতি।
-(void)awakeFromNib {
dispatch_async(dispatch_get_main_queue(), ^{
[self adjustContentSizeToFit];
});
}
-(void)adjustContentSizeToFit {
BOOL showsVerticalScrollIndicator = self.showsVerticalScrollIndicator;
BOOL showsHorizontalScrollIndicator = self.showsHorizontalScrollIndicator;
self.showsVerticalScrollIndicator = NO;
self.showsHorizontalScrollIndicator = NO;
CGRect contentRect = CGRectZero;
for (UIView *view in self.subviews) {
contentRect = CGRectUnion(contentRect, view.frame);
}
self.contentSize = contentRect.size;
self.showsVerticalScrollIndicator = showsVerticalScrollIndicator;
self.showsHorizontalScrollIndicator = showsHorizontalScrollIndicator;
}
আমি মনে করি এটি ইউআইএসক্রোলভিউয়ের সামগ্রী দেখার আকার আপডেট করার একটি ঝরঝরে উপায় হতে পারে।
extension UIScrollView {
func updateContentViewSize() {
var newHeight: CGFloat = 0
for view in subviews {
let ref = view.frame.origin.y + view.frame.height
if ref > newHeight {
newHeight = ref
}
}
let oldSize = contentSize
let newSize = CGSize(width: oldSize.width, height: newHeight + 20)
contentSize = newSize
}
}
import UIKit
class DynamicSizeScrollView: UIScrollView {
var maxHeight: CGFloat = UIScreen.main.bounds.size.height
var maxWidth: CGFloat = UIScreen.main.bounds.size.width
override func layoutSubviews() {
super.layoutSubviews()
if !__CGSizeEqualToSize(bounds.size,self.intrinsicContentSize){
self.invalidateIntrinsicContentSize()
}
}
override var intrinsicContentSize: CGSize {
let height = min(contentSize.height, maxHeight)
let width = min(contentSize.height, maxWidth)
return CGSize(width: width, height: height)
}
}
viewDidLayoutSubviews
তাই অটোলেআউটটি শেষ হবে, আইওএস 7 এ এটি ভাল কাজ করেছে, তবে কোনও কারণের কারণে ওএস আইওএল 6 এর পরীক্ষা করা কাজটি শেষ করেনি, তাই আমার কিছু উচ্চতার মান রয়েছে, তাই আমিviewDidAppear
এখন ঠিকঠাক কাজ করে চলেছি .. কেবল কারোর এটির প্রয়োজন হতে পারে তা উল্লেখ করার জন্য। ধন্যবাদ