Предоставление закругленных углов UIView

В моем браузере есть подкатегория, в которой есть UIActivityView и UILabel, говорящие "Signing In...". В этом подзоне есть углы, которые не закруглены. Как я могу сделать их круглыми?

Есть ли способ сделать это внутри моего xib?

Ответы

Ответ 1

Попробуйте это

#import <QuartzCore/QuartzCore.h> // not necessary for 10 years now  :)

...

view.layer.cornerRadius = 5;
view.layer.masksToBounds = true;

Примечание. Если вы пытаетесь применить закругленные углы к представлению UIViewController, его не следует применять в конструкторе контроллера вида, а скорее в -viewDidLoad, после того, как view фактически создается экземпляр.

Ответ 2

Вы также можете использовать функцию Определяемые пользователем атрибуты Runtime Attributes конструктора интерфейса, чтобы задать путь ключа layer.cornerRadius к значению. Убедитесь, что вы включили библиотеку QuartzCore.

Этот трюк также работает для установки layer.borderWidth, но он не будет работать для layer.borderColor, так как это ожидает CGColor не a UIColor.

Вы не сможете увидеть эффекты в раскадровке, потому что эти параметры оцениваются во время выполнения.

Using Interface builder to set the corner radius

Ответ 3

Теперь вы можете использовать быструю категорию в UIView (код ниже рисунка) с помощью @IBInspectable, чтобы показать результат на раскадровке (если вы используете категорию, используйте только cornerRadius, а не layer.cornerRadius в качестве ключевого пути.

extension UIView {
    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }
}

enter image description here

Ответ 4

Swift

Короткий ответ:

myView.layer.cornerRadius = 8
myView.layer.masksToBounds = true  // optional

Дополнительный ответ

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

Если вы начинаете с обычного UIView, он имеет квадратные углы.

let blueView = UIView()
blueView.frame = CGRect(x: 100, y: 100, width: 100, height: 50)
blueView.backgroundColor = UIColor.blueColor()
view.addSubview(blueView)

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

Вы можете отдать его круглым углам, изменив свойство cornerRadius вида layer.

blueView.layer.cornerRadius = 8

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

Значения большего радиуса дают более закругленные углы

blueView.layer.cornerRadius = 25

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

и меньшие значения дают меньше закругленных углов.

blueView.layer.cornerRadius = 3

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

Этого может быть достаточно, чтобы решить вашу проблему прямо там. Однако иногда представление может иметь subview или подуровень, выходящий за пределы представления. Например, если бы я должен был добавить sub view, как этот

let mySubView = UIView()
mySubView.frame = CGRect(x: 20, y: 20, width: 100, height: 100)
mySubView.backgroundColor = UIColor.redColor()
blueView.addSubview(mySubView)

или если бы я добавил дополнительный слой, как этот

let mySubLayer = CALayer()
mySubLayer.frame = CGRect(x: 20, y: 20, width: 100, height: 100)
mySubLayer.backgroundColor = UIColor.redColor().CGColor
blueView.layer.addSublayer(mySubLayer)

Тогда я бы закончил с

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

Теперь, если мне не нужны вещи, висящие за пределами границ, я могу сделать это

blueView.clipsToBounds = true

или

blueView.layer.masksToBounds = true

который дает этот результат:

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

Оба clipsToBounds и masksToBounds эквивалентны . Просто первый используется с UIView, а второй - с CALayer.

См. также

Ответ 5

Другой подход, чем тот, который сделал Эд Марти:

#import <QuartzCore/QuartzCore.h>

[v.layer setCornerRadius:25.0f];
[v.layer setMasksToBounds:YES];

Вам нужно, чтобы setMasksToBounds загружал все объекты из IB... у меня возникла проблема, когда мой взгляд округлился, но у меня не было объектов из IB:/

это исправлено. = D надеюсь, что это поможет!

Ответ 6

Как описано в этом сообщении в блоге, вот способ округления углов UIView:

+(void)roundView:(UIView *)view onCorner:(UIRectCorner)rectCorner radius:(float)radius
{
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds
                                                   byRoundingCorners:rectCorner
                                                         cornerRadii:CGSizeMake(radius, radius)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = view.bounds;
    maskLayer.path = maskPath.CGPath;
    [view.layer setMask:maskLayer];
    [maskLayer release];
}

Прохладная часть об этом заключается в том, что вы можете выбрать, какие углы вы хотите округлить.

Ответ 7

Вам нужно сначала импортировать файл заголовка <QuartzCore/QuartzCore.h>

 #import QuartzCore/QuartzCore.h>

[yourView.layer setCornerRadius:8.0f];
yourView.layer.borderColor = [UIColor redColor].CGColor;
yourView.layer.borderWidth = 2.0f;
[yourView.layer setMasksToBounds:YES];

Не пропустите использование - setMasksToBounds, иначе эффект может не отображаться.

Ответ 8

Вы можете использовать следующий пользовательский класс UIView который также может изменять цвет и ширину границы. Так как это IBDesignalbe Вы также можете изменить атрибуты в конструкторе интерфейса.

enter image description here

import UIKit

@IBDesignable public class RoundedView: UIView {

    @IBInspectable var borderColor: UIColor = UIColor.white {
        didSet {
            layer.borderColor = borderColor.cgColor
        }
    }

    @IBInspectable var borderWidth: CGFloat = 2.0 {
        didSet {
            layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.0 {
        didSet {
            layer.cornerRadius = cornerRadius
        }
    }

}

Ответ 9

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(20, 50, 200, 200)];

view.layer.backgroundColor = [UIColor whiteColor].CGColor;
view.layer.cornerRadius = 20.0;
view.layer.frame = CGRectInset(v.layer.frame, 20, 20);

view.layer.shadowOffset = CGSizeMake(1, 0);
view.layer.shadowColor = [[UIColor blackColor] CGColor];
view.layer.shadowRadius = 5;
view.layer.shadowOpacity = .25;

[self.view addSubview:view];
[view release];

Ответ 10

Swift 4 - Использование IBDesignable

   @IBDesignable
    class DesignableView: UIView {
    }

    extension UIView
    {

        @IBInspectable
        var cornerRadius: CGFloat {
            get {
                return layer.cornerRadius
            }
            set {
            layer.cornerRadius = newValue
        }
    }
}

Ответ 11

view.layer.cornerRadius = 25
view.layer.masksToBounds = true

Ответ 12

Пожалуйста, импортируйте Quartzcore framework, тогда вы должны установить setMaskToBounds в TRUE эту очень важную строку.

Затем: [[yourView layer] setCornerRadius:5.0f];

Ответ 13

UIView* viewWithRoundedCornersSize(float cornerRadius,UIView * original)
{
    // Create a white border with defined width
    original.layer.borderColor = [UIColor yellowColor].CGColor;
    original.layer.borderWidth = 1.5;

    // Set image corner radius
    original.layer.cornerRadius =cornerRadius;

    // To enable corners to be "clipped"
    [original setClipsToBounds:YES];
    return original;
}

Ответ 14

Сделайте это программно в obj c

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(20, 50,    200, 200)];

view.layer.backgroundColor = [UIColor whiteColor].CGColor;
view.layer.cornerRadius = 20.0;
view.layer.frame = CGRectInset(v.layer.frame, 20, 20);

[view.layer.shadowOffset = CGSizeMake(1, 0);
view.layer.shadowColor = [[UIColor blackColor] CGColor];
view.layer.shadowRadius = 5;
view.layer.shadowOpacity = .25;][1]

[self.view addSubview:view];

Мы также можем сделать это из таблицы.

 layer.cornerRadius  Number  5

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

Ответ 15

если круглый угол не работает в viewDidload(), лучше написать код в viewDidLayoutSubview()

-(void)viewDidLayoutSubviews
{
    viewTextfield.layer.cornerRadius = 10.0 ;                                               
    viewTextfield.layer.borderWidth = 1.0f;
    viewTextfield.layer.masksToBounds =  YES;
    viewTextfield.layer.shadowRadius = 5;
    viewTextfield.layer.shadowOpacity = 0.3;
    viewTextfield.clipsToBounds = NO;
    viewTextfield.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
}

Надеюсь это поможет!

Ответ 16

Вы также можете использовать изображение:

UIImage *maskingImage = [UIImage imageNamed:@"bannerBarBottomMask.png"];
CALayer *maskingLayer = [CALayer layer];
maskingLayer.frame = CGRectMake(-(self.yourView.frame.size.width - self.yourView.frame.size.width) / 2
                                , 0
                                , maskingImage.size.width
                                , maskingImage.size.height);
[maskingLayer setContents:(id)[maskingImage CGImage]];
[self.yourView.layer setMask:maskingLayer];

Ответ 17

set cornerRadious Свойство для круглого просмотра

set masksToBounds Логическое значение для изображения еще не будет выводиться за пределы радиуса угла

view.layer.cornerRadius = 5;

view.layer.masksToBounds = YES;

Ответ 18

Использование расширения UIView:

extension UIView {    

func addRoundedCornerToView(targetView : UIView?)
{
    //UIView Corner Radius
    targetView!.layer.cornerRadius = 5.0;
    targetView!.layer.masksToBounds = true

    //UIView Set up boarder
    targetView!.layer.borderColor = UIColor.yellowColor().CGColor;
    targetView!.layer.borderWidth = 3.0;

    //UIView Drop shadow
    targetView!.layer.shadowColor = UIColor.darkGrayColor().CGColor;
    targetView!.layer.shadowOffset = CGSizeMake(2.0, 2.0)
    targetView!.layer.shadowOpacity = 1.0
}
}

Использование:

override func viewWillAppear(animated: Bool) {

sampleView.addRoundedCornerToView(statusBarView)

}

Ответ 19

В Swift 4.2 и Xcode 10.1

let myView = UIView()
myView.frame = CGRect(x: 200, y: 200, width: 200, height: 200)
myView.myViewCorners()
//myView.myViewCorners(width: myView.frame.width)//Pass View width
view.addSubview(myView)

extension UIView {
    //If you want only round corners
    func myViewCorners() {
        layer.cornerRadius = 10
        layer.borderWidth = 1.0
        layer.borderColor = UIColor.red.cgColor
        layer.masksToBounds = true
    }
    //If you want complete round shape, enable above comment line
    func myViewCorners(width:CGFloat) {
        layer.cornerRadius = width/2
        layer.borderWidth = 1.0
        layer.borderColor = UIColor.red.cgColor
        layer.masksToBounds = true
    }
}

Ответ 20

- SwiftUI

В SwiftUI вы можете использовать модификатор cornerRadius непосредственно на любом View, который вы хотите. Например, этот вопрос:

Text("Signing In…")
    .padding(16)
    .background(Color.red)
    .cornerRadius(50)

Preview

Обратите внимание, что больше нет ромбовидного радиуса, поэтому, даже если вы установите значение углаRadius больше половины высоты, оно будет плавно округляться.

Ответ 21

ВКЛ Xcode 6 Ваша попытка

     self.layer.layer.cornerRadius = 5.0f;

или

    self.layer.layer.cornerRadius = 5.0f;
    self.layer.clipsToBounds = YES;