我想我的IKImageBrowserView
通過包裝它們並以多行顯示它們來顯示長標題,但是我一直無法實現。IKImageBrowserView可以顯示多行標題嗎?
我試過改變在ImageBrowserCell
子類中返回的titleFrame的大小,並在標題上設置段落樣式以便它應該包裹(NSLineBreakByWordWrapping
),但我只能得到一行文本。
有沒有人試過嗎?我可能會嘗試其他建議嗎?
我想我的IKImageBrowserView
通過包裝它們並以多行顯示它們來顯示長標題,但是我一直無法實現。IKImageBrowserView可以顯示多行標題嗎?
我試過改變在ImageBrowserCell
子類中返回的titleFrame的大小,並在標題上設置段落樣式以便它應該包裹(NSLineBreakByWordWrapping
),但我只能得到一行文本。
有沒有人試過嗎?我可能會嘗試其他建議嗎?
不容易,我很害怕。一種方法是將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
那樣的藍色選擇背景。但是,您可以在IKImageBrowserCellSelectionLayer
的自定義CALayer內使用NSBezierPath
來繪製自己的選擇背景。
希望這足以繼續下去。
謝謝你的回覆。實際上,我最終使用CATextLayer來實現您的建議。 (我們已經定製了IKImageBrowserCellSelectionLayer在整個框架周圍繪製邊框來指示選擇,所以這裏沒有問題。) – 2011-08-30 22:19:10