2009-11-18 8 views
9

Ich habe eine NSTextFieldCell, die ich mit mittlerer vertikaler Ausrichtung anzeigen möchte. Dank einer älteren Frage hier und einem Blogeintrag habe ich zwei funktionierende Lösungen.NSTextFieldCell vertikale Ausrichtung, Lösungen scheinen die horizontale Ausrichtung zu quetschen

Beide Lösungen scheinen jedoch meine Fähigkeit zu quetschen, die Zelle als rechtsbündig auszurichten. Kann mir jemand helfen, dass beide Lösungen beide Formen der Ausrichtung unterstützen? Hier

ist der Code für eine Lösung:

@implementation MiddleAlignedTextFieldCell 

- (NSRect)titleRectForBounds:(NSRect)theRect { 
    NSRect titleFrame = [super titleRectForBounds:theRect]; 
    NSSize titleSize = [[self attributedStringValue] size]; 
    titleFrame.origin.y = theRect.origin.y - .5 + (theRect.size.height - titleSize.height)/2.0; 
    return titleFrame; 
} 

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { 
    NSRect titleRect = [self titleRectForBounds:cellFrame]; 
    [[self attributedStringValue] drawInRect:titleRect]; 
} 

@end 

Die alternative Lösung ist (von this blog erhalten):

@implementation RSVerticallyCenteredTextFieldCell 

- (NSRect)drawingRectForBounds:(NSRect)theRect 
{ 
    NSRect newRect = [super drawingRectForBounds:theRect]; 

    if (mIsEditingOrSelecting == NO) 
    { 
     // Get our ideal size for current text 
     NSSize textSize = [self cellSizeForBounds:theRect]; 

     // Center that in the proposed rect 
     float heightDelta = newRect.size.height - textSize.height; 
     if (heightDelta > 0) 
     { 
      newRect.size.height -= heightDelta; 
      newRect.origin.y += (heightDelta/2); 
     } 
    } 

    return newRect; 
} 

- (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(int)selStart length:(int)selLength 
{ 
    aRect = [self drawingRectForBounds:aRect]; 
    mIsEditingOrSelecting = YES;  
    [super selectWithFrame:aRect inView:controlView editor:textObj delegate:anObject start:selStart length:selLength]; 
    mIsEditingOrSelecting = NO; 
} 

- (void)editWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject event:(NSEvent *)theEvent 
{ 
    aRect = [self drawingRectForBounds:aRect]; 
    mIsEditingOrSelecting = YES; 
    [super editWithFrame:aRect inView:controlView editor:textObj delegate:anObject event:theEvent]; 
    mIsEditingOrSelecting = NO; 
} 

@end 

Antwort

5

Ich schreibe diese Antwort auf die Frage, da es funktioniert, aber ich finde die Tatsache, dass ich nicht finden konnte, eine andere Möglichkeit, die Ausrichtung Einstellung von IB zu überprüfen ist sehr ärgerlich. Der Zugriff auf _cFlags scheint nur ein wenig dreckig zu sein, und ich würde gerne eine sauberere Methode finden.

Basierend auf dem Code von this blog entry früher veröffentlicht.

3

Sie können NSParagraphStyle/NSMutableParagraphStyle verwenden, um die Ausrichtung (und andere Attribute zu setzen). Fügen Sie dem gesamten Bereich Ihrer attributierten Zeichenfolge ein entsprechend konfiguriertes NSParagraphStyle-Objekt hinzu.

+0

Das erfordert, dass ich in diesem Teil der Präsentation mit meiner Datenschicht koppeln, und ehrlich gesagt bin ich mir nicht sicher, dass ich das mag. Dies sollte die in IB vorgestellten Optionen respektieren, aber aus einigen Gründen nicht (in diesem Sinne sollte die vertikale Ausrichtung auch eine Option in IB sein). –

+0

Ich bin mir nicht sicher, wie es das Ganze mischt, anstatt die Zeichenfolge von NSTextFieldCell auf etwas aus Ihrer Model-Ebene zu setzen.:-) Ausrichtung (und Schriftart, und Farbe und Größe, ...) ist ein Teil von allem. Ich stimme jedoch zu, dass die vertikale Ausrichtung eine Option sein sollte - einen Erweiterungsbericht einreichen. Da es nicht verfügbar ist, müssen Sie es im Zeichencode berücksichtigen. –

+0

Äh, das ist "Verbesserungsanfrage". Link: http://bugreporter.apple.com –

2

Es gibt ein paar mögliche Lösungen in einer similar question, die ich vor einer Weile gefragt habe.

In aller Ehrlichkeit, ich benutze immer noch den undokumentierte _cFlags.vCentered boolean (tsktsk, schlechte Programmierer!) Getan, um den Job zu bekommen. Es ist einfach und es funktioniert. Ich werde das Rad später neu erfinden, wenn es sein muss.

Update:

OK, ich glaube, ich habe es herausgefunden. Beide Lösungen verlassen sich auf einen Aufruf an super, um das Standard-Rect zu erhalten, und ändern dann origin.y und size.height, um die vertikale Zentrierung durchzuführen. Die Aufrufe an super geben jedoch ein Rechteck zurück, dessen Breite bereits angepasst wurde, um den Text horizontal anzupassen.

Die Lösung ist origin.x und size.width von den Grenzen zu verwenden rect dass in das Verfahren geführt wird:

In Lösung 1:

- (NSRect)titleRectForBounds:(NSRect)theRect { 
    NSRect titleFrame = [super titleRectForBounds:theRect]; 
    NSSize titleSize = [[self attributedStringValue] size]; 

    // modified: 
    theRect.origin.y += (theRect.size.height - titleSize.height)/2.0 - 0.5; 
    return theRect; 
} 

In Lösung 2 :

- (NSRect)drawingRectForBounds:(NSRect)theRect 
{ 
    NSRect newRect = [super drawingRectForBounds:theRect]; 

    // modified: 
    newRect.origin.x = theRect.origin.x; 
    newRect.size.width = theRect.size.width; 

    if (mIsEditingOrSelecting == NO) 
    { 
     // Get our ideal size for current text 
     NSSize textSize = [self cellSizeForBounds:theRect]; 

     // Center that in the proposed rect 
     float heightDelta = newRect.size.height - textSize.height; 
     if (heightDelta > 0) 
     { 
      newRect.size.height -= heightDelta; 
      newRect.origin.y += (heightDelta/2); 
     } 
    } 

    return newRect; 
} 
+0

Es war eigentlich die Lösung für diese Frage, dass ich eine meiner Lösungen gefunden habe. –

+0

Ich versuche nur herauszufinden, wie man die horizontale Ausrichtung mit dieser Lösung aufrecht erhalten kann. Aber ich muss vielleicht runter gehen und eine andere Route versuchen, wenn ich nicht kann. –

+0

Ich bin überrascht, dass die horizontale Ausrichtung von einer dieser Lösungen überhaupt betroffen ist, da keiner von ihnen mit der x-Dimension verwechselt. Wie stellen Sie die Ausrichtung ein? –