Подтвердить что ты не робот

NSButton с круглыми углами и цветом фона

Мне нужна простая кнопка (одна с круглыми углами) и добавление к ней фона. Я пробовал 2 вещи:

1 - используя круглое изображение кнопки: это работает хорошо, пока мне не нужно масштабировать кнопку, из-за которой круглые части выглядят уродливо.

2 - расширение кнопки и добавление цвета к ней - но тогда у меня возникают проблемы, когда я нажимаю кнопку - я хочу, чтобы состояние "нажатие" было того же цвета, что и "обычное" состояние, но это не так.

это код, который я использую для продления кнопки:

 override func drawRect(dirtyRect: NSRect)
    {
        if let bgColor = bgColor {
            self.layer?.cornerRadius = 4
            self.layer?.masksToBounds = true
            self.layer?.backgroundColor = bgColor.CGColor
            bgColor.setFill()

            NSRectFill(dirtyRect)
        }

        super.drawRect(dirtyRect)
    }

Во всяком случае, ни подход 1, ни 2 не работал, так как я могу это достичь? Просто простая кнопка.: (

EDIT: Я спрашиваю о OSX

4b9b3361

Ответ 1

Переопределить метод NSWuttonCell drawWithFrame:

func drawWithFrame(cellFrame: NSRect, inView controlView: NSView) {
    var border = NSBezierPath(roundedRect: NSInsetRect(cellFrame, 0.5, 0.5), xRadius: 3, yRadius: 3)
    NSColor.greenColor().set()
    border.fill()

    var style = NSParagraphStyle.defaultParagraphStyle()
    style.alignment = NSCenterTextAlignment
    var attr = [NSParagraphStyleAttributeName : style, NSForegroundColorAttributeName : NSColor.whiteColor()]

    self.title.drawInRect(cellFrame, withAttributes: attr)
}

Ответ 2

Вам нужно переопределить функцию layoutSubviews, т.е.

override func layoutSubviews() {
        self.layer.cornerRadius = self.frame.height/2
        self.layer.borderColor = UIColor.blue.cgColor
        self.layer.borderWidth = 2
    } 

Я выполнил образец проекта здесь. Весь ваш связанный код был написан в button.swift, и он находится в быстрой 3. Кроме того, я не задал фоновое изображение для кнопки, я оставляю эту задачу до вас.

P.S.: Ответ ниже для UIButton, а не NSButton. Вероятно, некоторые из них будут действительны, возможно, не все...

Ответ 3

Я сделал кнопку и добился успеха. Это выглядит так:

код:

override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)
    // Drawing code here.
    if let bgColor = bgColor {
        self.layer?.cornerRadius = 4
        self.layer?.masksToBounds = true
        self.layer?.backgroundColor = bgColor.cgColor
        bgColor.setFill()
        NSRectFill(dirtyRect)
    }
}

drawRect заменяется на draw, а CGColor заменяется на cgColor. Разница между твоей и моей - это порядок. Вы назвали super.draw(dirtyRect) последним, и я назвал его первым. Возможно, ваша кнопка выглядит так:

Я надеюсь, что это может решить вашу проблему.

Ответ 4

введите описание изображения здесь Если вы хотите, чтобы кнопка была закруглена, откройте свою основную страницу, нажмите кнопку и нажмите "Показать инспектор по идентификации". В разделе "Пользовательские атрибуты времени выполнения дважды щелкните значок" + "и измените код таким образом: введите описание изображения здесь

Ответ 5

OBJECTIVE-C (может помочь некоторым парням наткнуться на этот поток)

Эта подслоя расширяет IB - так что вы можете управлять IB:

  • Цвет фона
  • Цвет фона при наведении курсора
  • Цвет заголовка
  • Цвет заголовка при наведении указателя мыши
  • Угловой радиус

Он также включает небольшую альфа-анимацию при зависании.

Новые элементы управления в IB (щелкните, чтобы увидеть скриншот)

//
//  SHFlatButton.h
//
//  Created by SH on 03.12.16.
//  Copyright © 2016 SH. All rights reserved.
//

#import <Cocoa/Cocoa.h>

@interface SHFlatButton : NSButton

@property (nonatomic, strong) IBInspectable NSColor *BGColor;
@property (nonatomic, strong) IBInspectable NSColor *TextColor;
@property (nonatomic, strong) IBInspectable NSColor *BGColorHover;
@property (nonatomic, strong) IBInspectable NSColor *TextColorHover;
@property (nonatomic) IBInspectable CGFloat CornerRadius;
@property (strong) NSCursor *cursor;

@end

И реализация...

//
//  SHFlatButton.m
//
//  Created by SH on 03.12.16.
//  Copyright © 2016 SH. All rights reserved.
//

#import "SHFlatButton.h"

@implementation SHFlatButton

- (void)awakeFromNib
{
    if (self.TextColor)
        [self setAttributedTitle:[self textColor:self.TextColor]];

    if (self.CornerRadius)
    {
        [self setWantsLayer:YES];
        self.layer.masksToBounds = TRUE;
        self.layer.cornerRadius = self.CornerRadius;
    }
}


- (void)drawRect:(NSRect)dirtyRect
{
    if (self.BGColor)
    {
        [self.BGColor setFill];
        NSRectFill(dirtyRect);
    }

    [super drawRect:dirtyRect];
}


- (void)resetCursorRects
{
    if (self.cursor) {
        [self addCursorRect:[self bounds] cursor: self.cursor];
    } else {
        [super resetCursorRects];
    }
}


- (void)updateTrackingAreas {

    NSTrackingArea* trackingArea = [[NSTrackingArea alloc]
                                    initWithRect:[self bounds]
                                    options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways
                                    owner:self userInfo:nil];
    [self addTrackingArea:trackingArea];
}


- (void)mouseEntered:(NSEvent *)theEvent{
    if ([self isEnabled]) {

        [[self animator]setAlphaValue:0.9];
        if (self.BGColorHover)
            [[self cell] setBackgroundColor:self.BGColorHover];
        if (self.TextColorHover)
            [self setAttributedTitle:[self textColor:self.TextColorHover]];
    }


}

- (void)mouseExited:(NSEvent *)theEvent{
    if ([self isEnabled]) {
        [[self animator]setAlphaValue:1];
        if (self.BGColor)
            [[self cell] setBackgroundColor:self.BGColor];
        if (self.TextColor)
            [self setAttributedTitle:[self textColor:self.TextColor]];
    }
}

- (NSAttributedString*)textColor:(NSColor*)color
{
    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
    [style setAlignment:NSCenterTextAlignment];
    NSDictionary *attrsDictionary  = [NSDictionary dictionaryWithObjectsAndKeys:
                                      color, NSForegroundColorAttributeName,
                                      self.font, NSFontAttributeName,
                                      style, NSParagraphStyleAttributeName, nil];
    NSAttributedString *attrString = [[NSAttributedString alloc]initWithString:self.title attributes:attrsDictionary];
    return attrString;
}

EDIT: кнопка ДОЛЖНА отключить границу!

Ответ 6

Простая 3-строчная функция.

@IBOutlet weak var button: UIButton!

func setButton(color: UIColor, title: String)  {
    button.backgroundColor = color
    button.setTitle(title, forState: .Normal)
    button.layer.cornerRadius = 8.0
}

и назовите его таким образом

 setButton(UIColor.redColor(), title: "Hello")

Ответ 7

просто попробуйте добавить эти две строки кода в свою функцию. Я думаю, что вы получаете проблемы с шириной границы.

переопределить func drawRect (dirtyRect: NSRect)

{
    if let bgColor = bgColor {
        self.layer?.cornerRadius = 4
        self.layer?.masksToBounds = true
        self.layer?.backgroundColor = bgColor.CGColor
        self.layer?.borderColor = UIColor.blackcolor()
        self.layer?.borderWidth = 2.0

        bgColor.setFill()

        NSRectFill(dirtyRect)
    }

    super.drawRect(dirtyRect)
}