4 Stimmen

Kann IKImageBrowserView mehrzeilige Titel anzeigen?

Ich möchte meine IKImageBrowserView lange Titel anzuzeigen, indem man sie umbricht und in mehreren Zeilen anzeigt, aber das ist mir nicht gelungen.

Ich habe versucht, die Größe des titleFrame zu ändern, der in der ImageBrowserCell Unterklasse und auch die Einstellung des Absatzstils für den Titel, so dass er umbrochen wird ( NSLineBreakByWordWrapping ), aber ich erhalte immer nur eine einzige Textzeile.

Hat das schon jemand ausprobiert? Gibt es einen anderen Vorschlag, den ich ausprobieren könnte?

5voto

dvs Punkte 12194

Ich fürchte, das ist nicht einfach. Eine Möglichkeit ist, dass Sie die imageTitle Leerzeichen und Zeichnen von Text auf einem CALayer . Ich konnte es mit recht anständigen Ergebnissen zum Laufen bringen:

enter image description here

Das Wichtigste zuerst - da Sie nicht den Standard verwenden werden imageTitle Eigenschaft, möchten Sie eine neue Titeleigenschaft in Ihrer <IKImageBrowserItem> -konformes Datenobjekt. Ich nannte meins einfach title .

Dann möchten Sie eine IKImageBrowserCell Unterklasse. Stellen Sie sicher, dass Sie Ihre IKImageBrowserView Sie verwenden eine benutzerdefinierte Zelle; ich habe gerade eine Schnellkategorie für diese geschrieben:

@implementation IKImageBrowserView(CustomCell)
- (IKImageBrowserCell *)newCellForRepresentedItem:(id)cell
{
    return [[MyCustomImageBrowserCell alloc] init];
}
@end

Als nächstes überschreiben Sie in Ihrer benutzerdefinierten Zelle die Methode - (CALayer *)layerForType:(NSString *)type . Erstellung und Rückgabe eines CALayers für einen bestimmten Ebenenstandorttyp:

- (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];
}

Dann implementieren Sie die -drawLayer:inContext: Methode in Ihrer benutzerdefinierten Zelle, um die Zeichnung der Ebene zu handhaben:

- (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];
}

Leider hat dieser Ansatz auch einige Nachteile. Der Text erhält keinen blauen Auswahlhintergrund wie imageTitle tut. Sie können jedoch Ihren eigenen Auswahlhintergrund mit einer NSBezierPath innerhalb eines benutzerdefinierten CALayers für die IKImageBrowserCellSelectionLayer .

Ich hoffe, das ist genug, um weiterzumachen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X