Question

J'ai un petit problème avec NSTableView. Quand j'augmente la hauteur d'une ligne dans le tableau, le texte est aligné en haut de la ligne, mais je veux aligner centré verticalement!

Quelqu'un peut-il me suggérer une façon de le faire ??

Merci,

Miraaj

Était-ce utile?

La solution

Ceci est une solution simple de code qui montre une sous-classe vous pouvez utiliser pour aligner un milieu TextFieldCell.

l'en-tête

#import <Cocoa/Cocoa.h>


@interface MiddleAlignedTextFieldCell : NSTextFieldCell {

}

@end

le 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

montre Cette entrée blog une solution alternative qui fonctionne aussi bien.

Autres conseils

Voici la version Swift du bâtiment de code sur la réponse ci-dessus:

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

Alors je mets la hauteur du tableView heightOfRow dans le NSTableView:

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

Définir la classe du NSTextFieldCell à VerticallyCenteredTextField:

entrer image description ici

et la hauteur de la TableViewCell

entrer image description ici

entrer image description ici

Merci Bryan pour votre aide.

@ réponse de iphaaw mise à jour pour Swift 4 (qui doit également correspondre au nom de la classe dans Interface Builder, je constate également ajouté « Cell » à la fin du nom de la classe pour plus de clarté,):

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

Même si cela est une question très ancienne avec une réponse acceptée, voici une solution de rechange:

Allez dans l'IB, sélectionnez votre NSTextField assis dans un NSTableCellView et ajouter une nouvelle contrainte « Centre Verticalement dans le conteneur ». Vous devez également ajouter des contraintes horizontales (qui devrait probablement être antérieure / postérieure ensemble de l'espace à 0 ou tout adapté à vos besoins).

Utilisé ceci dans un NSOutlineView et a travaillé comme un charme. Performance n'a pas été un problème dans mon cas, comme je l'ai pas eu beaucoup de cellules, mais je pense que c'est pas pire que les tailles de calcul manuellement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top