NSTextField с закругленными углами? - PullRequest
4 голосов
/ 29 марта 2012

Я пытаюсь нарисовать закругленные углы вокруг NSTextField.

Я разделил на подклассы NSTextField, пробовал приведенный ниже код, но безрезультатно ...

Есть идеи?

- (void)drawRect:(NSRect)dirtyRect
{

    // black outline
    NSRect blackOutlineFrame = NSMakeRect(0.0, 0.0, [self bounds].size.width, [self bounds].size.height-1.0);
    NSGradient *gradient = nil;
    if ([NSApp isActive]) {
        gradient = [[NSGradient alloc] initWithStartingColor:[NSColor colorWithCalibratedWhite:0.24 alpha:1.0] endingColor:[NSColor colorWithCalibratedWhite:0.374 alpha:1.0]];
    }
    else {
        gradient = [[NSGradient alloc] initWithStartingColor:[NSColor colorWithCalibratedWhite:0.55 alpha:1.0] endingColor:[NSColor colorWithCalibratedWhite:0.558 alpha:1.0]];
    }
    [gradient drawInBezierPath:[NSBezierPath bezierPathWithRoundedRect:blackOutlineFrame xRadius:5 yRadius:5] angle:90];

}

Ответы [ 5 ]

6 голосов
/ 06 августа 2012

Лучше создать подкласс NSTextFieldCell, чтобы рисовать закругленные углы, чтобы сохранить функциональность NSTextField, например:

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
    NSBezierPath *betterBounds = [NSBezierPath bezierPathWithRoundedRect:cellFrame xRadius:CORNER_RADIUS yRadius:CORNER_RADIUS];
    [betterBounds addClip];
    [super drawWithFrame:cellFrame inView:controlView];
    if (self.isBezeled) {
        [betterBounds setLineWidth:2];
        [[NSColor colorWithCalibratedRed:0.510 green:0.643 blue:0.804 alpha:1] setStroke];
        [betterBounds stroke];
    }
}

Получает хорошее округленное текстовое поле, которое отлично работает (если вы настроили его для рисованияпрямоугольная рамка в первую очередь, как минимум):

enter image description here

4 голосов
/ 29 марта 2012

Вы делаете почти все правильно.Вам просто нужно изменить ячейку и радиус textField, которые совпадают.Взгляните на это:

-(void)awakeFromNib {

    [[self cell] setBezelStyle: NSTextFieldRoundedBezel];
}


- (void)drawRect:(NSRect)dirtyRect
{

    NSRect blackOutlineFrame = NSMakeRect(0.0, 0.0, [self bounds].size.width, [self bounds].size.height-1.0);
    NSGradient *gradient = nil;
    if ([NSApp isActive]) {
        gradient = [[NSGradient alloc] initWithStartingColor:[NSColor colorWithCalibratedWhite:0.24 alpha:1.0] endingColor:[NSColor colorWithCalibratedWhite:0.374 alpha:1.0]];
    }
    else {
        gradient = [[NSGradient alloc] initWithStartingColor:[NSColor colorWithCalibratedWhite:0.55 alpha:1.0] endingColor:[NSColor colorWithCalibratedWhite:0.558 alpha:1.0]];
    }

    [gradient drawInBezierPath:[NSBezierPath bezierPathWithRoundedRect:blackOutlineFrame xRadius:10 yRadius:10] angle:90];

}

Это хорошо работает для меня.

3 голосов
/ 16 октября 2016

Swift 3 версия @Verious кодов со свойствами, редактируемыми в Interface Builder:

class RoundedTextFieldCell: NSTextFieldCell {

    @IBInspectable var borderColor: NSColor = .clear
    @IBInspectable var cornerRadius: CGFloat = 3

    override func draw(withFrame cellFrame: NSRect, in controlView: NSView) {
        let bounds = NSBezierPath(roundedRect: cellFrame, xRadius: cornerRadius, yRadius: cornerRadius)
        bounds.addClip()
        super.draw(withFrame: cellFrame, in: controlView)
        if borderColor != .clear {
            bounds.lineWidth = 2
            borderColor.setStroke()
            bounds.stroke()
        }
    }
}
2 голосов
/ 29 марта 2012

Включите платформу QuartzCore в свой проект.Импортируйте <QuartzCore/QuartzCore.h> и используйте что-то вроде следующего кода (чуть выше моей головы):

UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 20.0f)];
textField.layer.cornerRadius = 5.0f;
textField.layer.masksToBounds = YES;

Вуаля, текстовое поле с закругленными углами:)

Редактировать: только что понял, что этот вопрос относится к Mac OS X. Пожалуйста, проверьте следующую ссылку: http://cocoatricks.com/2010/06/a-better-looking-text-field/

Редактировать 2: создал пример проекта с полем с закругленным текстом: http://dl.dropbox.com/u/6487838/RoundedTextField.zip

1 голос
/ 09 сентября 2014

Самый простой способ сделать с помощью построителя интерфейса, если только вы не хотите, чтобы углы были округлены на несколько единиц:

Просто выберите границу как округленную:

enter image description here

...