2012-03-29 5 views
3

Я пытаюсь нарисовать округлые углы вокруг NSTextField.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]; 

} 

ответ

4

Вы делаете почти все правильно. Вам просто нужно изменить ячейку 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]; 

} 

Это работает для меня красиво.

+0

Хммм ... Это не работает для меня ... –

+0

Ну, я только что узнал, что не так ... Я устанавливал 'setBackgroundColor:', а затем 'setDrawsBackground: YES' при создании экземпляра текстового поля. Теперь, когда я удалил его, он работает! НО: если добавление фона ПОСЛЕ 'setBezelStyle:', фон остается белым ... Любые предложения? –

+0

@ Dr.Kameleon Вы хотите изменить цвет фона, когда пользователь нажал на textField? в то время как firstResponder? И не показывать этот цвет, если это не так? –

1

Включите рамки 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; 

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

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

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

+0

Нет, это не работает ... –

+0

Хм .. просто понял, что речь идет о Mac OS X, приведенный выше код должен работать на приложениях iOS, но не уверен, что он будет работать для Mac OS X. Обновлено сообщение. –

+0

@WoldgandSchreurs Ну, я адаптировал ваш пример кода для Mac OS X ... с 'NSTextField' вместо' UITextField' и несколько небольших изменений (например, '[textField layer] setCornerRadius: 5.0f]' и т. Д.), Но, к сожалению, нам не повезло ... Спасибо в любом случае! :-) –

6

Лучше подкласс 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

+0

Это работало лучше для меня, поскольку решение, предложенное Юстоном Бу текст заполнителя невидим, когда вы не редактируете поле. – IndrekV

1

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

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

enter image description here

+0

Это изменит TextField, чтобы иметь белый фон – Borzh

3

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() 
     } 
    } 
} 
Смежные вопросы