我希望我的IKImageBrowserView能够通过包装并在多行中显示长标题来显示它们,但我一直无法实现这一点。
我曾尝试更改在ImageBrowserCell子类中返回的titleFrame的大小,并在标题上设置段落样式,使其可以换行(NSLineBreakByWordWrapping),但我只能看到一行文本。
有人试过这个吗?还有其他建议我可以试试吗?
发布于 2011-08-28 10:40:33
恐怕不是那么容易。可以这样做的一种方法是将imageTitle留空并在CALayer上绘制文本。我能够让它工作,并获得相当不错的结果:

首先,由于不打算使用标准的imageTitle属性,因此需要在<IKImageBrowserItem>-conforming数据对象中创建一个新的title属性。我简单地把我的命名为title。
然后,您想要创建一个IKImageBrowserCell子类。一定要告诉你的IKImageBrowserView你正在使用一个自定义的单元格;我刚刚写了一个简短的分类:
@implementation IKImageBrowserView(CustomCell)
- (IKImageBrowserCell *)newCellForRepresentedItem:(id)cell
{
return [[MyCustomImageBrowserCell alloc] init];
}
@end接下来,在您的自定义单元格中,覆盖方法- (CALayer *)layerForType:(NSString *)type。创建并返回特定图层位置类型的CALayer:
- (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];
}然后,在您的自定义单元格中实现-drawLayer:inContext:方法来处理图层的绘制:
- (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];
}不幸的是,这种方法确实有一些缺点。文本不会像imageTitle那样有蓝色的选择背景。但是,您可以在IKImageBrowserCellSelectionLayer的自定义NSBezierPath中使用CALayer绘制自己的选择背景。
希望这足以继续下去。
https://stackoverflow.com/questions/4880916
复制相似问题