मैं हाल ही में इससे कुश्ती कर रहा हूं। मेरा मुद्दा था कि सॉल्यूशंस का उपयोग करके ऊपर पोस्ट किए गए समाधान heightForRowAtIndexPath:
सिम्युलेटर में iOS 7.1 के लिए काम करेंगे, लेकिन फिर केवल iOS 8.1 पर स्विच करके परिणामों को पूरी तरह से खराब कर दिया है।
मैंने स्वयं-आकार वाली कोशिकाओं (iOS 8 में पेश किया गया, यहां पढ़ें ) के बारे में अधिक पढ़ना शुरू किया । यह स्पष्ट था कि UITableViewAutomaticDimension
आईओएस 8 का उपयोग करने में मदद मिलेगी। मैंने उस तकनीक का उपयोग करने की कोशिश की heightForRowAtIndexPath:
और वॉयला का उपयोग हटा दिया , यह अब iOS 8 में एकदम सही काम कर रहा था। लेकिन तब iOS 7 नहीं था। मुझे क्या करने की जरूरत थी? मुझे heightForRowAtIndexPath:
iOS 7 के लिए जरूरत थी न कि iOS 8 के लिए।
यहां मेरा समाधान है (संक्षिप्तता के लिए छंटनी की गई) जो उत्तर @JosephH से उधार ली गई है:
- (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)