Tip: ‘bezeled’ sur NSTextField et decalage de texte

Si vous essayez de changer la propriété booléenne ‘bezeled’ sur un NSTextField pendant l’exécution, vous vous apercevrez qu’il se passe un décalage des marges intérieures.

Voici une classe héritant de NSTextFieldCell qui permet de contourner ce décalage.

#import <Foundation/Foundation.h>

@interface JDTextFieldCell : NSTextFieldCell {
	NSRect cellRectOffset;
}
- (NSRect)ajustedFrame:(NSRect)cellFrame;

@end
#import "JDTextFieldCell.h"

@implementation JDTextFieldCell

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (void)dealloc
{
    [super dealloc];
}

#pragma mark - 

- (void)awakeFromNib
{
	if([self isBezeled])
	{
		cellRectOffset = [self titleRectForBounds:NSMakeRect(0.0, 0.0, 0.0, 0.0)];
	}
}

- (void)setBordered:(BOOL)flag
{
	[super setBordered:flag];
	if (flag) {
		cellRectOffset = [self titleRectForBounds:NSMakeRect(0.0, 0.0, 0.0, 0.0)];
	}
}

- (void)setBezeled:(BOOL)flag
{
	[super setBezeled:flag];
	if (flag) {
		cellRectOffset = [self titleRectForBounds:NSMakeRect(0.0, 0.0, 0.0, 0.0)];
	}
}

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
	[super drawInteriorWithFrame:[self ajustedFrame:cellFrame] inView:controlView];
}

- (void)editWithFrame:(NSRect)cellFrame inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject event:(NSEvent *)theEvent
{
	[super editWithFrame:[self ajustedFrame:cellFrame] inView:controlView editor:textObj delegate:anObject event:theEvent];

}
- (void)selectWithFrame:(NSRect)cellFrame inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(NSInteger)selStart length:(NSInteger)selLength
{
	[super selectWithFrame:[self ajustedFrame:cellFrame] inView:controlView editor:textObj delegate:anObject start:selStart length:selLength];
}

- (NSRect)ajustedFrame:(NSRect)cellFrame
{
	if (([self isBordered] == NO) && ([self isBezeled] == NO))
	{
		cellFrame.origin.x += cellRectOffset.origin.x;
		cellFrame.origin.y += cellRectOffset.origin.y;
		cellFrame.size.width += cellRectOffset.size.width;
		cellFrame.size.height += cellRectOffset.size.height;
	}
	return cellFrame;
}

@end

Téléchargez le projet exemple

Cette entrée a été publiée dans Tip, avec comme mot(s)-clef(s) , . Vous pouvez la mettre en favoris avec ce permalien.