Dal*_*eck 4 cocoa ikimagebrowserview
我希望IKImageBrowserView通过包装它们并以多行显示来显示长标题,但我无法实现这一点.
我已经尝试更改ImageBrowserCell子类中返回的titleFrame的大小,并在标题上设置段落样式,以便它应该wrap(NSLineBreakByWordWrapping)但我只得到一行文本.
有没人试过这个?我可能会尝试其他任何建议吗?
我很害怕,不容易.你可以做到的一种方法是imageTitle留空和绘图文字CALayer.我能够以相当不错的结果使它工作:

首先要做的事情 - 因为您不打算使用标准imageTitle属性,所以您希望在<IKImageBrowserItem>符合要求的数据对象中创建新的标题属性.我简单地打电话给我title.
然后,您要创建一个IKImageBrowserCell子类.务必告诉IKImageBrowserView你正在使用自定义单元格; 我刚为此写了一个快速类别:
@implementation IKImageBrowserView(CustomCell)
- (IKImageBrowserCell *)newCellForRepresentedItem:(id)cell
{
return [[MyCustomImageBrowserCell alloc] init];
}
@end
Run Code Online (Sandbox Code Playgroud)
接下来,在您的自定义单元格中,覆盖该方法- (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];
}
Run Code Online (Sandbox Code Playgroud)
然后,-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];
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种方法确实有一些缺点.文本没有得到像蓝色选择背景imageTitle.但是,您可以使用NSBezierPath自定义CALayer内部绘制自己的选择背景IKImageBrowserCellSelectionLayer.
希望这足以继续下去.