Frage

Ich habe ein kleines Problem mit NstableView. Wenn ich die Höhe einer Reihe in der Tabelle erhöhe, ist der in ihm in der Reihe ausgerichtete Text jedoch in der Reihe ausgerichtet, aber ich möchte ihn vertikal zentriert ausrichten!

Kann mir jemand eine Möglichkeit vorschlagen, es zu tun?

Vielen Dank,

Miraaj

War es hilfreich?

Lösung

Dies ist eine einfache Codelösung, die eine Unterklasse anzeigt, mit der Sie eine TextFieldCell ausrichten können.

der Kopfball

#import <Cocoa/Cocoa.h>


@interface MiddleAlignedTextFieldCell : NSTextFieldCell {

}

@end

der Code

@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

Dieser Blogeintrag Zeigt eine alternative Lösung, die auch gut funktioniert.

Andere Tipps

Hier ist die schnelle Version des Codeaufbaus auf der obigen Antwort:

import Foundation
import Cocoa

class VerticallyCenteredTextField : NSTextFieldCell
{

    override func titleRectForBounds(theRect: NSRect) -> NSRect
    {
        var titleFrame = super.titleRectForBounds(theRect)
        var titleSize = self.attributedStringValue.size
        titleFrame.origin.y = theRect.origin.y - 1.0 + (theRect.size.height - titleSize.height) / 2.0
        return titleFrame
    }

    override func drawInteriorWithFrame(cellFrame: NSRect, inView controlView: NSView)
    {
        var titleRect = self.titleRectForBounds(cellFrame)

        self.attributedStringValue.drawInRect(titleRect)
    }
}

Dann stelle ich die Höhe der TabelleView -Höhe im NstableView fest:

func tableView(tableView: NSTableView, heightOfRow row: Int) -> CGFloat
{
    return 30
}

Legen Sie die Klasse der nStextfieldcell so, dass sie vertikalzentriertesTextfield ist:

enter image description here

und die Höhe des TableViewCell

enter image description here

enter image description here

Danke Bryan für deine Hilfe.

@Iphaaws Antwort für Swift 4 aktualisiert (Hinweis Ich habe auch "Zelle" am Ende des Klassennamens für Clarity hinzugefügt, der auch mit dem Klassennamen im Schnittstellenbuilder übereinstimmt):

import Foundation
import Cocoa

class VerticallyCenteredTextFieldCell : NSTextFieldCell {
    override func titleRect(forBounds theRect: NSRect) -> NSRect {
        var titleFrame = super.titleRect(forBounds: theRect)
        let titleSize = self.attributedStringValue.size
        titleFrame.origin.y = theRect.origin.y - 1.0 + (theRect.size.height - titleSize().height) / 2.0
        return titleFrame
    }

    override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) {
        let titleRect = self.titleRect(forBounds: cellFrame)
        self.attributedStringValue.draw(in: titleRect)
    }
}

Auch wenn dies eine sehr alte Frage mit einer akzeptierten Antwort ist, finden Sie hier eine alternative Lösung:

Gehen Sie in den IB, wählen Sie Ihr nStextfield in einer NStableCellView aus und fügen Sie eine neue "Zentrum vertikal in Container" -Erbeschränkung hinzu. Sie sollten auch horizontale Einschränkungen hinzufügen (die wahrscheinlich auf 0 oder was auch immer zu Ihren Bedürfnissen geführt werden sollte).

Verwendete dies in einem NSoutlineView und arbeitete wie ein Zauber. Die Leistung war in meinem Fall kein Problem, da ich nicht viele Zellen hatte, aber ich würde erwarten, dass es nicht schlechter ist, als die Größen manuell zu berechnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top