IKImageBrowserView可以显示多行标题吗?

时间:2011-02-02 22:56:57

标签: cocoa ikimagebrowserview

我希望我的IKImageBrowserView通过包装它们并以多行显示它们来显示长标题,但我无法实现这一点。

我已经尝试更改ImageBrowserCell子类中返回的titleFrame的大小,并在标题上设置段落样式,以便它应该换行(NSLineBreakByWordWrapping)但我只得到一个文本行。

有人试过吗?我可能会尝试其他任何建议吗?

1 个答案:

答案 0 :(得分:6)

不容易,我害怕。一种方法是将imageTitle留空并在CALayer上绘制文字。我能够以相当不错的结果使其工作:

enter image description here

首先要做的事情 - 因为您不打算使用标准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绘制自己的选择背景。

希望这已经足够了。