Ich fürchte, das ist nicht einfach. Eine Möglichkeit ist, dass Sie die imageTitle
Leerzeichen und Zeichnen von Text auf einem CALayer
. Ich konnte es mit recht anständigen Ergebnissen zum Laufen bringen:
Das Wichtigste zuerst - da Sie nicht den Standard verwenden werden imageTitle
Eigenschaft, möchten Sie eine neue Titeleigenschaft in Ihrer <IKImageBrowserItem>
-konformes Datenobjekt. Ich nannte meins einfach title
.
Dann möchten Sie eine IKImageBrowserCell
Unterklasse. Stellen Sie sicher, dass Sie Ihre IKImageBrowserView
Sie verwenden eine benutzerdefinierte Zelle; ich habe gerade eine Schnellkategorie für diese geschrieben:
@implementation IKImageBrowserView(CustomCell)
- (IKImageBrowserCell *)newCellForRepresentedItem:(id)cell
{
return [[MyCustomImageBrowserCell alloc] init];
}
@end
Als nächstes überschreiben Sie in Ihrer benutzerdefinierten Zelle die Methode - (CALayer *)layerForType:(NSString *)type
. Erstellung und Rückgabe eines CALayers für einen bestimmten Ebenenstandorttyp:
- (CALayer *)layerForType:(NSString *)type
{
if( [type isEqualToString:IKImageBrowserCellBackgroundLayer] )
{
CALayer *layer = [CALayer layer];
layer.delegate = self;
layer.frame = self.frame; // the cell's frame
layer.name = type; // a way to refer to the layer location type during drawing if need be
[layer setNeedsDisplay];
return layer;
}
return [super layerForType:type];
}
Dann implementieren Sie die -drawLayer:inContext:
Methode in Ihrer benutzerdefinierten Zelle, um die Zeichnung der Ebene zu handhaben:
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
// Set the current context.
[NSGraphicsContext saveGraphicsState];
NSGraphicsContext *nscg = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:NO];
[NSGraphicsContext setCurrentContext:nscg];
NSString *title = [self.representedItem title];
// Wrap and center the text
NSMutableParagraphStyle *paragraphStyle = [[[NSMutableParagraphStyle alloc] init] autorelease];
[paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];
[paragraphStyle setAlignment:NSCenterTextAlignment];
NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
[attrs setObject:paragraphStyle forKey:NSParagraphStyleAttributeName];
[attrs setObject:[NSFont systemFontOfSize:12.0f] forKey:NSFontAttributeName];
CGFloat padding = 4.0f;
[title drawInRect:NSMakeRect(
0,
-(self.imageFrame.size.height + padding),
self.frame.size.width,
100
) withAttributes:attrs];
[NSGraphicsContext restoreGraphicsState];
}
Leider hat dieser Ansatz auch einige Nachteile. Der Text erhält keinen blauen Auswahlhintergrund wie imageTitle
tut. Sie können jedoch Ihren eigenen Auswahlhintergrund mit einer NSBezierPath
innerhalb eines benutzerdefinierten CALayers für die IKImageBrowserCellSelectionLayer
.
Ich hoffe, das ist genug, um weiterzumachen.