aligner verticalement le texte dans la ligne NSTableView
-
21-09-2019 - |
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
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:
et la hauteur de la TableViewCell
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.