首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IKImageBrowserView可以显示多行标题吗?

IKImageBrowserView可以显示多行标题吗?
EN

Stack Overflow用户
提问于 2011-02-03 06:56:57
回答 1查看 2.4K关注 0票数 4

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

我曾尝试更改在ImageBrowserCell子类中返回的titleFrame的大小,并在标题上设置段落样式,使其可以换行(NSLineBreakByWordWrapping),但我只能看到一行文本。

有人试过这个吗?还有其他建议我可以试试吗?

EN

回答 1

Stack Overflow用户

发布于 2011-08-28 10:40:33

恐怕不是那么容易。可以这样做的一种方法是将imageTitle留空并在CALayer上绘制文本。我能够让它工作,并获得相当不错的结果:

首先,由于不打算使用标准的imageTitle属性,因此需要在<IKImageBrowserItem>-conforming数据对象中创建一个新的title属性。我简单地把我的命名为title

然后,您想要创建一个IKImageBrowserCell子类。一定要告诉你的IKImageBrowserView你正在使用一个自定义的单元格;我刚刚写了一个简短的分类:

代码语言:javascript
复制
@implementation IKImageBrowserView(CustomCell)
- (IKImageBrowserCell *)newCellForRepresentedItem:(id)cell
{
    return [[MyCustomImageBrowserCell alloc] init];
}
@end

接下来,在您的自定义单元格中,覆盖方法- (CALayer *)layerForType:(NSString *)type。创建并返回特定图层位置类型的CALayer:

代码语言:javascript
复制
- (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:方法来处理图层的绘制:

代码语言:javascript
复制
- (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绘制自己的选择背景。

希望这足以继续下去。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4880916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档