gpt4 book ai didi

cocoa - IKImageBrowserView可以显示多行标题吗?

转载 作者:行者123 更新时间:2023-12-03 16:13:38 24 4
gpt4 key购买 nike

我希望我的 IKImageBrowserView 通过将其换行并在多行中显示来显示长标题,但我无法实现此目的。

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

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

最佳答案

恐怕不容易。一种方法是离开 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 绘制自己的选择背景。在 IKImageBrowserCellSelectionLayer 的自定义 CALayer 内.

希望这足以继续下去。

关于cocoa - IKImageBrowserView可以显示多行标题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4880916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com