ব্যবহারের জন্য সঠিক এপিআই হ'ল UIView systemLayoutSizeFittingSize:
হয় UILayoutFittingCompressedSize
বা পাস হচ্ছে UILayoutFittingExpandedSize
।
UIView
অটোলেআউট ব্যবহারের জন্য সাধারণ হিসাবে এটি যতক্ষণ না আপনার সীমাবদ্ধতাগুলি সঠিক ততক্ষণ কাজ করা উচিত। আপনি যদি এটির UITableViewCell
(উদাহরণস্বরূপ সারির উচ্চতা নির্ধারণ করতে) ব্যবহার করতে চান তবে আপনার নিজের ঘরের বিরুদ্ধে এটি কল করতে হবে contentView
এবং উচ্চতাটি দখল করতে হবে।
যদি আপনার দৃষ্টিভঙ্গিতে এক বা একাধিক ইউআইএলবেল একাধিকরেখা থাকে তবে আরও বিবেচনাগুলি বিদ্যমান। এগুলির জন্য এটি নিখুঁত হয় যে preferredMaxLayoutWidth
সম্পত্তিটি সঠিকভাবে সেট করা উচিত যাতে লেবেলটি একটি সঠিক সরবরাহ করে intrinsicContentSize
, যা systemLayoutSizeFittingSize's
গণনায় ব্যবহৃত হবে ।
সম্পাদনা: অনুরোধ অনুসারে, একটি সারণী দর্শন ঘরের জন্য উচ্চতার গণনার উদাহরণ যুক্ত করুন
টেবিল-সেল উচ্চতার গণনার জন্য অটোলেআউট ব্যবহার অত্যন্ত দক্ষ নয় তবে এটি নিশ্চিত করা সুবিধাজনক, বিশেষত যদি আপনার একটি ঘর জটিল কাঠামোযুক্ত থাকে।
যেমন আমি উপরে বলেছি, আপনি যদি কোনও মাল্টলাইন ব্যবহার করছেন তবে লেবেলের প্রস্থে UILabel
সিঙ্ক করা জরুরী preferredMaxLayoutWidth
। আমি এটি করতে একটি কাস্টম UILabel
সাবক্লাস ব্যবহার করি:
@implementation TSLabel
- (void) layoutSubviews
{
[super layoutSubviews];
if ( self.numberOfLines == 0 )
{
if ( self.preferredMaxLayoutWidth != self.frame.size.width )
{
self.preferredMaxLayoutWidth = self.frame.size.width;
[self setNeedsUpdateConstraints];
}
}
}
- (CGSize) intrinsicContentSize
{
CGSize s = [super intrinsicContentSize];
if ( self.numberOfLines == 0 )
{
// found out that sometimes intrinsicContentSize is 1pt too short!
s.height += 1;
}
return s;
}
@end
এখানে একটি অনুমোদিত ইউআইটিএবল ভিউকন্ট্রোলার সাবক্লাস উচ্চতা প্রদর্শন করছে রোআউটআইডেক্সপথ:
#import "TSTableViewController.h"
#import "TSTableViewCell.h"
@implementation TSTableViewController
- (NSString*) cellText
{
return @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
}
#pragma mark - Table view data source
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView
{
return 1;
}
- (NSInteger) tableView: (UITableView *)tableView numberOfRowsInSection: (NSInteger) section
{
return 1;
}
- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath
{
static TSTableViewCell *sizingCell;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sizingCell = (TSTableViewCell*)[tableView dequeueReusableCellWithIdentifier: @"TSTableViewCell"];
});
// configure the cell
sizingCell.text = self.cellText;
// force layout
[sizingCell setNeedsLayout];
[sizingCell layoutIfNeeded];
// get the fitting size
CGSize s = [sizingCell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize];
NSLog( @"fittingSize: %@", NSStringFromCGSize( s ));
return s.height;
}
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
TSTableViewCell *cell = (TSTableViewCell*)[tableView dequeueReusableCellWithIdentifier: @"TSTableViewCell" ];
cell.text = self.cellText;
return cell;
}
@end
একটি সাধারণ কাস্টম সেল:
#import "TSTableViewCell.h"
#import "TSLabel.h"
@implementation TSTableViewCell
{
IBOutlet TSLabel* _label;
}
- (void) setText: (NSString *) text
{
_label.text = text;
}
@end
এবং, স্টোরিবোর্ডে সংজ্ঞায়িত প্রতিবন্ধকতার একটি চিত্র এখানে। মনে রাখবেন যে লেবেলে কোনও উচ্চতা / প্রস্থের সীমাবদ্ধতা নেই - সেগুলি লেবেলের থেকে অনুমান করা হয় intrinsicContentSize
: