Давать UIView закругленные углы - PullRequest
556 голосов
/ 02 октября 2009

У моего входа в систему есть подпредставление, которое имеет UIActivityView и UILabel с надписью "Вход в систему ...". У этого подпредставления есть углы, которые не округлены. Как я могу сделать их круглыми?

Есть ли какой-нибудь способ сделать это внутри моей хибы?

Ответы [ 20 ]

1190 голосов
/ 02 октября 2009

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

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

...

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

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

256 голосов
/ 16 июля 2012

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

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

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

Using Interface builder to set the corner radius

60 голосов
/ 16 января 2014

Теперь вы можете использовать быструю категорию в 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

52 голосов
/ 25 января 2016

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)

enter image description here

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

blueView.layer.cornerRadius = 8

enter image description here

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

blueView.layer.cornerRadius = 25

enter image description here

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

blueView.layer.cornerRadius = 3

enter image description here

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

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)

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

enter image description here

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

blueView.clipsToBounds = true

или это

blueView.layer.masksToBounds = true

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

enter image description here

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

Смотри также

43 голосов
/ 09 декабря 2010

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

#import <QuartzCore/QuartzCore.h>

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

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

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

26 голосов
/ 10 сентября 2012

Как описано в этом сообщении в блоге , вот способ округления углов 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];
}

Самое интересное в этом то, что вы можете выбрать, какие углы вы хотите округлить.

19 голосов
/ 01 августа 2012

Вам необходимо сначала импортировать заголовочный файл <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, иначе эффект может не отображаться.

9 голосов
/ 26 октября 2016

Вы можете использовать следующий пользовательский класс 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
        }
    }

}
6 голосов
/ 23 мая 2012
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];
3 голосов
/ 16 апреля 2018
view.layer.cornerRadius = 25
view.layer.masksToBounds = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...