আমি সম্প্রতি এটি নিয়ে কুস্তি করেছি। আমার সমস্যাটি ছিল যে heightForRowAtIndexPath:
পদ্ধতিটি ব্যবহার করে উপরের পোস্ট করা সমাধানগুলি সিমুলেটারে আইওএস 7.1 এর জন্য কাজ করবে তবে কেবল আইওএস 8.1 এ স্যুইচ করে ফলাফলগুলি পুরোপুরি স্ক্রু করে ফেলেছে।
আমি সেল্ফ-সাইজিং সেলগুলি সম্পর্কে আরও পড়তে শুরু করি (আইওএস 8 তে প্রবর্তিত, এখানে পড়ুন )। এটা স্পষ্ট ছিল যে UITableViewAutomaticDimension
আইওএস 8 এর ব্যবহারটি সাহায্য করবে 8 আমি সেই কৌশলটি ব্যবহার করার চেষ্টা করেছি এবং ব্যবহারটি heightForRowAtIndexPath:
এবং ভয়েলা মুছে ফেলেছি , এটি এখন আইওএস 8-এ নিখুঁতভাবে কাজ করছে। কিন্তু তখন আইওএস 7 ছিল না। আমি কী করব? আমি heightForRowAtIndexPath:
আইওএস 7 এর জন্য প্রয়োজন, আইওএস 8 এর জন্য নয়।
এখানে আমার সমাধান (ব্রেভিটির জন্য ছাঁটাই করা) যা উত্তরটি জোসেফ এইচ পোস্ট করেছেন তা থেকে নেওয়া হয়েছে:
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.estimatedRowHeight = 50.;
self.tableView.rowHeight = UITableViewAutomaticDimension;
// ...
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
return UITableViewAutomaticDimension;
} else {
NSString *cellIdentifier = [self reuseIdentifierForCellAtIndexPath:indexPath];
static NSMutableDictionary *heightCache;
if (!heightCache)
heightCache = [[NSMutableDictionary alloc] init];
NSNumber *cachedHeight = heightCache[cellIdentifier];
if (cachedHeight)
return cachedHeight.floatValue;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
CGFloat height = cell.bounds.size.height;
heightCache[cellIdentifier] = @(height);
return height;
}
}
- (NSString *)reuseIdentifierForCellAtIndexPath:(NSIndexPath *)indexPath {
NSString * reuseIdentifier;
switch (indexPath.row) {
case 0:
reuseIdentifier = EventTitleCellIdentifier;
break;
case 2:
reuseIdentifier = EventDateTimeCellIdentifier;
break;
case 4:
reuseIdentifier = EventContactsCellIdentifier;
break;
case 6:
reuseIdentifier = EventLocationCellIdentifier;
break;
case 8:
reuseIdentifier = NotesCellIdentifier;
break;
default:
reuseIdentifier = SeparatorCellIdentifier;
break;
}
return reuseIdentifier;
}
SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO (@ "8.0") আসলে আমি ব্যবহার করছি এমন ম্যাক্রো সংজ্ঞাগুলির একটি সেট থেকে যা আমি কোথাও পেয়েছি (খুব সহায়ক)। তারা হিসাবে সংজ্ঞায়িত করা হয়:
#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)