Search code examples
cocoaosx-elcapitannsbuttonxcode8

NSButton Toggle : OnClick title get removed on OSX 10.11


I am using a Toggle button in XIB,

in AwakeFromNib :I set title and BG image of the button. Code works very well till OSX 10.10.5 and below but on higher versions when I click on button the text gets removed.

Set attributed Title

    [self.deleteButton setWantsLayer:YES];
    self.deleteButton.layer.backgroundColor = [self setButtonBGColor];
    [self setButtonTitleFor:self.deleteButton
                   toString:@"Delete"];
    [self.deleteButton setLayerContentsRedrawPolicy:NSViewLayerContentsRedrawOnSetNeedsDisplay];



- (void)setButtonTitleFor:(NSButton*)button toString:(NSString*)title
{
    NSAttributedString *attrString = [self getAttributedStringForString:title];
    [button setAttributedTitle:attrString];
}

enter image description here enter image description here

Any idea hat should be done.

enter image description here


Solution

  • So finally got it right

    Subclassing NSButtonCell helped me out

    RPButtonTextTopCell.h

    @interface RPButtonTextTopCell : NSButtonCell

    @end

    RPButtonTextTopCell.m

    @implementation RPButtonTextTopCell

    -(id) init
    {
        self = [super init];
        if (self) {
        }
        return self;
    }
    
    -(id) initWithCoder:(NSCoder *)decoder
    {
        return [super initWithCoder:decoder];
    }
    
    -(id) initTextCell:(NSString *)string
    {
        return [super initTextCell:string];
    }
    
    -(NSRect)titleRectForBounds:(NSRect)theRect
    {
        NSRect titleFrame = [super titleRectForBounds:theRect];
        NSSize titleSize = [[self attributedStringValue] size];
    
        titleFrame.origin.y = (theRect.origin.y - (theRect.size.height-titleSize.height)*0.5) + 5;
    
        return titleFrame;
    }
    

    @end

    Utilizing This Custom Class

    RPButtonTextTopCell *deleteCell = [[RPButtonTextTopCell alloc] init];
    deleteCell.backgroundColor      = [self setNSButtonBGColor];
    
    [self.deleteButton setCell:deleteCell];
    [self setButtonTitleFor:self.deleteButton
                   toString:@"Delete"];
    [self.deleteButton setAction:@selector(deleteButtonClicked:)];
    [self.deleteButton setTarget:self];
    

    and its solved....