iPhone-Entwicklung - eine Andere Frage auf resizng UILabel & custom UITableViewCell
Ich habe folgende Funktion in einige meiner Projekte, aber vor kurzem habe ich ein kleines Beispiel, die behaupten, dass es nicht zuverlässig (zumindest in manchen Situationen):
[NSString sizeWithFont:font constrainedToSize:size]
[NSString sizeWithFont:font constrainedToSize:size lineBreakMode:lineBreak]
Erstellte ich eine custom UITableViewCell Klasse zu erreichen, die Ergebnisse, wie gesehen in den iPhone-Foto-Album-Anwendung, wie z.B. Bild, mit Album-Name, und die Anzahl der Bilder im album. Ich habe die oben genannten Funktion stellen Sie meine detail-text - (für count). Hier ist der code:
Interface File:
#import <UIKit/UIKit.h>
@interface CustomValue2Cell : UITableViewCell {
UIImageView *cellImage;
UILabel *cellTextLabel;
UILabel *cellDetailTextLabel;
}
@property (nonatomic, retain) UIImageView *cellImage;
@property (nonatomic, retain) UILabel *cellTextLabel;
@property (nonatomic, retain) UILabel *cellDetailTextLabel;
- (void)setCellImage:(UIImage *)image withText:(NSString *)text andDetail:(NSString *)detail;
- (CGSize)getSizeOfText:(NSString *)text withFont:(UIFont *)font;
@end
Implementation File:
#import "CustomValue2Cell.h"
@implementation CustomValue2Cell
@synthesize cellImage;
@synthesize cellTextLabel;
@synthesize cellDetailTextLabel;
//Coordinate positions of Image, Text Label, and Detail Text Label
# define kImageXPosition 3
# define kImageYPosition 3
# define kImageWidth 37.0
# define kImageHeight 37.0
# define kTextXPosition 55
# define kTextYPosition 10
# define kTextWidth 200
# define kTextHeight 22
# define kDetailXPosition 55
# define kDetailYPosition 10
# define kDetailWidth 40
# define kDetailHeight 22
//Displacement value for Text Label with Detail Text Label
//Displacement value of 10-15 works with non-bold font
# define kCellSubviewDisplacement 20
//Label Font Size for Text Label and Detail Text Label
# define kTextLabelFontSize 18
# define kDetailLabelFontSize 16
- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) {
//Color and font for the main label
UIColor *textLabelColor = [UIColor blackColor];
UIFont *textLabelFont = [UIFont systemFontOfSize:kTextLabelFontSize];
//Color and font for the detail label
UIColor *detailTextColor = [UIColor darkGrayColor];
UIFont *detailTextFont = [UIFont systemFontOfSize:kDetailLabelFontSize];
//Highligted row color
UIColor *highlightedTextColor = [UIColor whiteColor];
//Define boundary of the cell contents
CGRect rect;
//Set properties of Image Thumbnail
rect = CGRectMake(kImageXPosition, kImageYPosition, kImageWidth, kImageHeight);
cellImage = [[UIImageView alloc] initWithFrame:rect];
//Set properties of Name
rect = CGRectMake(kTextXPosition, kTextYPosition, kTextWidth, kTextHeight);
cellTextLabel = [[UILabel alloc] initWithFrame:rect];
[cellTextLabel setFont:textLabelFont];
[cellTextLabel setTextColor:textLabelColor];
[cellTextLabel setHighlightedTextColor:highlightedTextColor];
//Set properties of Value
rect = CGRectMake(kDetailXPosition, kDetailYPosition, kDetailWidth, kDetailHeight);
cellDetailTextLabel = [[UILabel alloc] initWithFrame:rect];
[cellDetailTextLabel setFont:detailTextFont];
[cellDetailTextLabel setTextColor:detailTextColor];
[cellDetailTextLabel setHighlightedTextColor:highlightedTextColor];
//Put Image, Name, and Value in Content View
[[self contentView] addSubview:cellImage];
[[self contentView] addSubview:cellTextLabel];
[[self contentView] addSubview:cellDetailTextLabel];
//Set cell selection style (Blue)
self.selectionStyle = UITableViewCellSelectionStyleBlue;
}
return self;
}
- (void)setCellImage:(UIImage *)image withText:(NSString *)text andDetail:(NSString *)detail {
cellImage.image = image;
cellTextLabel.text = text;
cellDetailTextLabel.text = detail;
//Get an estimated size of text in the label,
//which will be used to estimate the position of detail label
UIFont *textLabelFont = [UIFont systemFontOfSize:kTextLabelFontSize];
CGSize size = [self getSizeOfText:text withFont:textLabelFont];
//Re-set the frame of detail view
CGRect frame = CGRectMake(kDetailXPosition, kDetailYPosition, kDetailWidth, kDetailHeight);
frame.origin.x = frame.origin.x + size.width + kCellSubviewDisplacement;
[cellDetailTextLabel setFrame:frame];
}
- (CGSize)getSizeOfText:(NSString *)text withFont:(UIFont *)font {
return [text sizeWithFont:font constrainedToSize:CGSizeMake(kTextWidth, kTextHeight)];
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
//Configure the view for the selected state
}
- (void)dealloc {
[cellImage release];
[cellTextLabel release];
[cellDetailTextLabel release];
[super dealloc];
}
@end
Testen meine custom class bereitete ich eine Liste von fonts angezeigt und Sie in meiner Tabelle Anzeigen. Code zum abrufen der Liste der verfügbaren Schriftarten:
fontFamily = [[NSMutableArray alloc] initWithArray:[UIFont familyNames]];
fonts = [[NSMutableArray alloc] init];
for(NSUInteger i=0; i<[fontFamily count]; i++) {
NSString *familyName = [fontFamily objectAtIndex:i];
NSArray *array = [UIFont fontNamesForFamilyName:familyName];
[fonts addObjectsFromArray:array];
}
Hier ist der code zur Rückgabe der Zellen:
//Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
CGRect rect = CGRectMake(0.0, 0.0, 320.0, 50.0);
CustomValue2Cell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[CustomValue2Cell alloc] initWithFrame:rect reuseIdentifier:CellIdentifier] autorelease];
}
NSString *font = [fonts objectAtIndex:indexPath.row];
NSString *detail = [NSString stringWithFormat:@"%d", [[fonts objectAtIndex:indexPath.row] length]];
[cell setCellImage:[UIImage imageNamed:@"Pointy.gif"] withText:font andDetail:detail];
[cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]
return cell;
}
Result: Text Label and Detail Text Label are overlapping for some values. e.g. "CouierNewPS-BoldMT" and "25" overlap each other, and in some other cases, they are not overlapping but they are very close.
Question: Is their a better alternative to -sizeWithFont function? Or, am i doing something very stupid to mess things up?
Sorry für die lange post. Jede Hilfe ist willkommen. Dankend in Erwartung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, man kann nie wirklich sagen, was genau das problem IST. Hat Sie wieder eine Größe zu groß, zu klein, alle auf einer Linie, oder etwas ganz anderes?
Wenn ich string-Dimensionierung, ich benutze
und geben Sie
UILineBreakModeWordWrap
für den line-break-Modus. Ich bin mir nicht sicher, ob dies endet mit der Rückkehr im wesentlichen den gleichen Wert haben oder nicht, aber ich habe festgestellt, dass es für mich arbeiten.Referenz : NSString UIKit Zusätze-Referenz-Referenz-Klasse
CGSize size, constrainedSize;
constrianedSize.Breite = MAXFLOAT;
constrainedSize.Höhe = MAXFLOAT;
size = [text sizewithFont:systemFontofSize:14 constrainedToSize:constrinedSize lineBreakMode];
zurückgegeben constrainedSize sollte richtige Breite/Höhe text.
Ich hatte ein ähnliches problem mit dieser Funktion und nach dem Debuggen Sie es für viele Male, die ich endlich herausgefunden, dass wenn Sie übergeben die Breite kleiner als die label-Breite der parameter constratainedToSize, es funktioniert in allen Fällen.
Bitte versuchen Sie die folgenden
Verwenden auch UILineBreakModeWordWrap als Wert für UILineBreakMode