Domanda

Ho un piccolo problema con NSTableView. Quando sto aumentando l'altezza di una riga nella tabella, il testo in esso è allineato in cima alla fila ma voglio di allineare verticalmente centrato!

Qualcuno mi può suggerire un modo per farlo ??

Grazie,

Miraaj

È stato utile?

Soluzione

Questa è una soluzione semplice codice che mostra una sottoclasse è possibile utilizzare per allineare un mezzo TextFieldCell.

l'intestazione

#import <Cocoa/Cocoa.h>


@interface MiddleAlignedTextFieldCell : NSTextFieldCell {

}

@end

il codice

@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

spettacoli questo blog una soluzione alternativa che funziona anche bene.

Altri suggerimenti

Ecco la versione Swift dell'edificio codice a risposta di cui sopra:

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)
    }
}

Poi ho impostato l'altezza della tableView heightOfRow nella NSTableView:

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

Impostare la classe del NSTextFieldCell da VerticallyCenteredTextField:

entrare descrizione dell'immagine qui

e l'altezza della TableViewCell

entrare descrizione dell'immagine qui

entrare descrizione dell'immagine qui

Grazie Bryan per il vostro aiuto.

@ di iphaaw risposta aggiornata per Swift 4 (nota che ho anche aggiunto "cella" a fine del nome della classe per chiarezza, che deve anche corrispondere al nome della classe in Interface Builder):

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)
    }
}

Anche se questa è una domanda molto vecchio con una risposta accettata, ecco una soluzione alternativa:

Vai al IB, selezionare il NSTextField seduto in una NSTableCellView e aggiungere un nuovo vincolo "Centro verticalmente in Container". Si dovrebbe anche aggiungere vincoli orizzontali (che dovrebbe probabilmente essere in testa / finali set spazio per 0 o qualsiasi altra cosa si adatta alle vostre esigenze).

Utilizzato questo in un NSOutlineView e ha lavorato come un fascino. Prestazioni non era un problema nel mio caso, come non ho avuto molte cellule, ma mi aspetterei che non è peggio di dimensioni calcolo manuale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top