我希望我的IKImageBrowserView
通过包装它们并以多行显示它们来显示长标题,但我无法实现这一点。
我已经尝试更改ImageBrowserCell
子类中返回的titleFrame的大小,并在标题上设置段落样式,以便它应该换行(NSLineBreakByWordWrapping
)但我只得到一个文本行。
有人试过吗?我可能会尝试其他任何建议吗?
答案 0 :(得分:6)
不容易,我害怕。一种方法是将imageTitle
留空并在CALayer
上绘制文字。我能够以相当不错的结果使其工作:
首先要做的事情 - 因为您不打算使用标准imageTitle
属性,所以您希望在符合<IKImageBrowserItem>
的数据对象中创建新的标题属性。我只是打电话给我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
那样得到蓝色选择背景。但是,您可以在NSBezierPath
的自定义CALayer中使用IKImageBrowserCellSelectionLayer
绘制自己的选择背景。
希望这已经足够了。