2011-02-02 47 views
4

我想我的IKImageBrowserView通過包裝它們並以多行顯示它們來顯示長標題,但是我一直無法實現。IKImageBrowserView可以顯示多行標題嗎?

我試過改變在ImageBrowserCell子類中返回的titleFrame的大小,並在標題上設置段落樣式以便它應該包裹(NSLineBreakByWordWrapping),但我只能得到一行文本。

有沒有人試過嗎?我可能會嘗試其他建議嗎?

回答

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那樣的藍色選擇背景。但是,您可以在IKImageBrowserCellSelectionLayer的自定義CALayer內使用NSBezierPath來繪製自己的選擇背景。

希望這足以繼續下去。

+0

謝謝你的回覆。實際上,我最終使用CATextLayer來實現您的建議。 (我們已經定製了IKImageBrowserCellSelectionLayer在整個框架周圍繪製邊框來指示選擇,所以這裏沒有問題。) – 2011-08-30 22:19:10

相關問題