Как создать круглый угол UILabel на iPhone?

Есть ли встроенный способ создания UILabels с округлыми углами? Если ответ отрицательный, как можно было бы создать такой объект?

Ответ 1

До 3.0

Один из способов сделать это, который я использовал недавно, - создать подкласс UIView, который просто рисует округленный прямоугольник, а затем делает UILabel или, в моем случае, UITextView, подвью внутри. В частности:

  • Создайте подкласс UIView и назовите его что-то вроде RoundRectView.
  • В методе RoundRectView drawRect: нарисуйте путь вокруг границ представления, используя вызовы Core Graphics, такие как CGContextAddLineToPoint() для ребер и CGContextAddArcToPoint() для закругленных углов.
  • Создайте экземпляр UILabel и сделайте его подчиненным для RoundRectView.
  • Установите рамку метки в виде нескольких пикселов в границах RoundRectView. (Например, label.frame = CGRectInset(roundRectView.bounds, 8, 8);)

Вы можете поместить RoundRectView в представление с помощью Interface Builder, если вы создадите общий UIView, а затем измените его класс с помощью инспектора. Вы не увидите прямоугольник, пока не будете компилировать и запускать приложение, но по крайней мере вы сможете разместить подвью и подключить его к выходам или действиям, если это необходимо.

3.0 и более поздние версии

iPhone OS 3.0 и более поздние версии поддерживает свойство cornerRadius в классе CALayer. В каждом представлении есть экземпляр CALayer, с которым вы можете манипулировать. Это означает, что теперь вы можете получить закругленные углы в одной строке:

view.layer.cornerRadius = 8;

Вам нужно будет #import <QuartzCore/QuartzCore.h> и ссылку на структуру QuartzCore, чтобы получить доступ к заголовкам и свойствам CALayer.

Ответ 2

Для устройств с iOS 7.1 или более поздней версией вам необходимо добавить:

yourUILabel.layer.masksToBounds = YES;
yourUILabel.layer.cornerRadius = 8.0;

Ответ 3

Для Swift IOS8 далее на основе ответа OScarsWyck:

yourUILabel.layer.masksToBounds = true
yourUILabel.layer.cornerRadius = 8.0

Ответ 4

  • у вас есть UILabel: myLabel.
  • в вашем файле "m" или "h": #import <QuartzCore/QuartzCore.h>
  • в viewDidLoad напишите эту строку: self.myLabel.layer.cornerRadius = 8;

    • зависит от того, как вы хотите, вы можете изменить значение cornerRadius с 8 на другой номер:)

Удачи.

Ответ 5

Вы можете сделать округлую границу с шириной границы любого элемента управления таким образом: -

CALayer * l1 = [lblName layer];
[l1 setMasksToBounds:YES];
[l1 setCornerRadius:5.0];

// You can even add a border
[l1 setBorderWidth:5.0];
[l1 setBorderColor:[[UIColor darkGrayColor] CGColor]];


Просто замените lblName на UILabel.

Примечание. - Не забудьте импортировать <QuartzCore/QuartzCore.h>

Ответ 6

Другой метод - разместить png позади UILabel. У меня есть представления с несколькими надписями, которые накладывают один фон png, который имеет все иллюстрации отдельных ярлыков.

Ответ 7

xCode 7.3.1 iOS 9.3.2

 _siteLabel.layer.masksToBounds = true;
  _siteLabel.layer.cornerRadius = 8;

Ответ 8

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
    label.text = @"Your String.";
    label.layer.cornerRadius = 8.0;
    [self.view addSubview:label];

Ответ 9

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

Результат

colors-rounded-border

Используемые SO-сообщения:

площадка

Просто вставьте это в игровую площадку iOS:

//: Playground - noun: a place where people can play

import UIKit

class PillLabel : UILabel{

    @IBInspectable var color = UIColor.lightGrayColor()
    @IBInspectable var cornerRadius: CGFloat = 8
    @IBInspectable var labelText: String = "None"
    @IBInspectable var fontSize: CGFloat = 10.5

    // This has to be balanced with the number of spaces prefixed to the text
    let borderWidth: CGFloat = 3

    init(text: String, color: UIColor = UIColor.lightGrayColor()) {
        super.init(frame: CGRectMake(0, 0, 1, 1))
        labelText = text
        self.color = color
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    func setup(){
        // This has to be balanced with the borderWidth property
        text = "  \(labelText)".uppercaseString

        // Credits to /questions/9954/how-to-draw-border-around-a-uilabel/67003#67003
        layer.borderWidth = borderWidth
        layer.cornerRadius = cornerRadius
        backgroundColor = color
        layer.borderColor = color.CGColor
        layer.masksToBounds = true
        font = UIFont.boldSystemFontOfSize(fontSize)
        textColor = color.contrastColor
        sizeToFit()

        // Credits to /questions/9955/add-a-border-outside-of-a-uiview-instead-of-inside/67006#67006
        frame = CGRectInset(self.frame, -borderWidth, -borderWidth)
    }
}


extension UIColor {
    // Credits to /questions/9956/check-if-uicolor-is-dark-or-bright/67016#67016
    func isLight() -> Bool{
        var green: CGFloat = 0.0, red: CGFloat = 0.0, blue: CGFloat = 0.0, alpha: CGFloat = 0.0
        self.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
        let brightness = ((red * 299) + (green * 587) + (blue * 114) ) / 1000

        return brightness < 0.5 ? false : true
    }

    var contrastColor: UIColor{
        return self.isLight() ? UIColor.blackColor() : UIColor.whiteColor()
    }
}

var label = PillLabel(text: "yellow", color: .yellowColor())

label = PillLabel(text: "green", color: .greenColor())

label = PillLabel(text: "white", color: .whiteColor())

label = PillLabel(text: "black", color: .blackColor())

Ответ 10

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

Ответ 11

В Monotouch/Xamarin.iOS я решил ту же проблему:

UILabel exampleLabel = new UILabel(new CGRect(0, 0, 100, 50))
        {
            Text = "Hello Monotouch red label"
        };
        exampleLabel.Layer.MasksToBounds = true;
        exampleLabel.Layer.CornerRadius = 8;
        exampleLabel.Layer.BorderColor = UIColor.Red.CGColor;
        exampleLabel.Layer.BorderWidth = 2;

Ответ 12

Работает отлично в Swift 2.0

    @IBOutlet var theImage: UIImageView! //you can replace this with any UIObject eg: label etc


    override func viewDidLoad() {
        super.viewDidLoad()
//Make sure the width and height are same
        self.theImage.layer.cornerRadius = self.theImage.frame.size.width / 2
        self.theImage.layer.borderWidth = 2.0
        self.theImage.layer.borderColor = UIColor.whiteColor().CGColor
        self.theImage.clipsToBounds = true

    }

Ответ 13

Swift 3

Если вы хотите использовать закругленную метку с цветом фона, в дополнение к большинству других ответов вам необходимо установить цвет фона layer. Он не работает при настройке фона фона view.

label.layer.cornerRadius = 8
label.layer.masksToBounds = true
label.layer.backgroundColor = UIColor.lightGray.cgColor

Если вы используете автоматическую компоновку, хотите немного заполнить этикетку и не хотите вручную устанавливать размер метки, вы можете создать подкласс UILabel и переопределить свойство intrinsincContentSize:

class LabelWithPadding: UILabel {
    override var intrinsicContentSize: CGSize {
        let defaultSize = super.intrinsicContentSize
        return CGSize(width: defaultSize.width + 12, height: defaultSize.height + 8)
    }
}

Чтобы объединить эти два, вам также необходимо установить label.textAlignment = center, иначе текст будет выровнен по левому краю.

Ответ 14

Если вам нужен округленный угол объектов пользовательского интерфейса, например (UILabel, UIView, UIButton, UIImageView) с помощью раскадровки, тогда установите clip to bounds true и установите User Defined Runtime Attributes путь ключа как layer.cornerRadius, type = Number и value = 9 (как ваше требование)

Установить клип в рамки как Установить атрибуты Runtime User Defined as as

Ответ 15

Прекрасно работает в Xcode 8.1.2 с Swift 3, протестирован в АВГУСТЕ 2017 г.

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

Код:

 // extension Class
extension UILabel {

    // extension user defined Method
    func setRoundEdge() {
        let myGreenColor = (UIColor(red: -0.108958, green: 0.714926, blue: 0.758113, alpha: 1.0))
        //Width of border
        self.layer.borderWidth = 1.0
        //How much the edge to be rounded
        self.layer.cornerRadius = 5.0

        // following properties are optional
        //color for border
        self.layer.borderColor = myGreenColor.cgColor
        //color for text
        self.textColor = UIColor.red
        // Mask the bound
        self.layer.masksToBounds = true
        //clip the pixel contents
        self.clipsToBounds = true
    }
}

Вывод:

введите описание изображения здесь

Почему метод расширения?

Создайте файл Swift и добавьте следующий код, который имеет метод Extention для класса "UILabel", где этот метод определен пользователем, но будет работать для всех ярлыков в вашем приложении и поможет поддерживать согласованность и чистый код, если вы измените какой-либо стиль в будущем, требуется только в методе расширения.

Ответ 16

В зависимости от того, что именно вы делаете, вы можете сделать изображение и установить его в качестве фона программно.