Создать кнопку круга в iOS7 без изображений

Я хотел бы воссоздать круговые кнопки, найденные в приложении Clock в iOS7. Кнопки в основном представляют собой круги с различным внешним видом в зависимости от состояния кнопок (зеленая рамка, красная рамка, серая заливка).

Я мог бы, конечно, достичь этого, используя простой UIButton с изображениями для разных состояний.

Однако я ищу решение, которое рисует круг программно, поэтому я могу легко изменить радиус, ширину штриха и т.д.

Насколько я вижу, UIButton позволяет мне определять UIImage для каждого состояния, поэтому я не могу напрямую изменять уровни для каждого состояния (например, предоставить слой с помощью cornerRadius). Есть ли другой способ?

Ответы

Ответ 1

Создание настраиваемой кнопки может быть полезно.

в .h файле;

#import <UIKit/UIKit.h>
@interface CircleLineButton : UIButton

- (void)drawCircleButton:(UIColor *)color;

@end

в .m файле;

    #import "CircleLineButton.h"

    @interface CircleLineButton ()

    @property (nonatomic, strong) CAShapeLayer *circleLayer;
    @property (nonatomic, strong) UIColor *color;
    @end

    @implementation CircleLineButton



    - (void)drawCircleButton:(UIColor *)color
    {
        self.color = color;

        [self setTitleColor:color forState:UIControlStateNormal];

        self.circleLayer = [CAShapeLayer layer];

        [self.circleLayer setBounds:CGRectMake(0.0f, 0.0f, [self bounds].size.width,
                                      [self bounds].size.height)];
        [self.circleLayer setPosition:CGPointMake(CGRectGetMidX([self bounds]),CGRectGetMidY([self bounds]))];

        UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame))];

        [self.circleLayer setPath:[path CGPath]];

        [self.circleLayer setStrokeColor:[color CGColor]];

        [self.circleLayer setLineWidth:2.0f];
        [self.circleLayer setFillColor:[[UIColor clearColor] CGColor]];

        [[self layer] addSublayer:self.circleLayer];
    }

    - (void)setHighlighted:(BOOL)highlighted
    {
        if (highlighted)
        {
            self.titleLabel.textColor = [UIColor whiteColor];
            [self.circleLayer setFillColor:self.color.CGColor];
        }
        else
        {
            [self.circleLayer setFillColor:[UIColor clearColor].CGColor];
            self.titleLabel.textColor = self.color;
        }
    }

@end

И в контроллере представления вызовите [self.myCircleButton drawCircleButton:[UIColor myColor]]

Ответ 2

Существует много способов сделать это, например:

  • Используйте CAShapedLayer

  • Подкласс UIView и используйте метод drawRect: для рисования круга

  • Просто используйте квадратный UIView и используйте layer.cornerRadius свойство.

В зависимости от ваших потребностей, что-то простое, как создание обычного UIButton и вызов

myButton.layer.cornerRadius = myButton.bounds.size.width / 2.0;

может работать (вам нужно включить Кварц)

Ответ 3

Образец, который я использовал для достижения такого рода вещей:

Подкласс UIButton и реализуем drawRect, чтобы нарисовать кнопку, как вы хотите, настраивая цвета на основе свойств selected и highlighted кнопки.

Затем переопределите setSelected и setHighlighted, чтобы принудительно выполнить перерисовку:

-(void)setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];
    [self setNeedsDisplay];
}

Ответ 4

Добавьте этот код

imagePreview.layer.cornerRadius = (imagePreview.bounds.size.height/2);

где imagePreview - это UIview/UIimageview/UIButton

не забудьте добавить

#import <QuartzCore/QuartzCore.h>

Ответ 5

Решение с быстрым расширением:

extension UIView{
    func asCircle(){
        self.layer.cornerRadius = self.frame.size.width / 2;
        self.layer.masksToBounds = true
    }
}

Просто позвоните

myView.asCircle()

Может работать с любым типом просмотра, а не только с кнопкой

Ответ 7

Я думаю, что он работает хорошо.

override func viewDidLoad() {
    super.viewDidLoad()

    var button = UIButton.buttonWithType(.Custom) as UIButton
    button.frame = CGRectMake(160, 100, 50, 50)
    button.layer.cornerRadius = 0.5 * button.bounds.size.width
    button.setImage(UIImage(named:"thumbsUp.png"), forState: .Normal)
    button.addTarget(self, action: "thumbsUpButtonPressed", forControlEvents: .TouchUpInside)
    view.addSubview(button)
}

func thumbsUpButtonPressed() {
    println("thumbs up button pressed")
}

Ответ 8

  • В раскадровке сделайте квадратный UIButton (например, 100 * 100)

  • Вывод ссылки (например, @property (сильный, неатомный) UIButton IBOutlet * myButton;)

  • В коде написано: self.myButton.layer.cornerRadius = 50; // 50 - половина квадратной длины одной стороны.