it-swarm.com.ru

Давать UIView закругленные углы

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

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

535
itsaboutcode

Попробуй это

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

...

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

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

1171
Ed Marty

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

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

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

Using Interface builder to set the corner radius

252
Gujamin

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

60
Guilherme Torres Castro

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

#import <QuartzCore/QuartzCore.h>

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

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

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

43
Kristian Flatheim Jensen

Стриж

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

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

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

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

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

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

Смотрите также

42
Suragch

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

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

26
pabloruiz55

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

19
Samir Jwarchan

Вы можете использовать следующий пользовательский класс 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
Vakas
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];
6
jorik
view.layer.cornerRadius = 25
view.layer.masksToBounds = true
3
Parth Barot

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

Тогда: [[yourView layer] setCornerRadius:5.0f];

2
DeveshM
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;
}
2
Ashish Patel

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

   @IBDesignable
    class DesignableView: UIView {
    }

    extension UIView
    {

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

Сделайте это программно в 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

 enter image description here

1
Vikas Rajput

если круглый угол не работает в 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);
}

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

1
Dharmesh Mansata

set cornerRadious Недвижимость для круглого просмотра

set masksToBounds Boolean Значение для изображения по-прежнему не будет отображаться за пределами границы углового радиуса.

view.layer.cornerRadius = 5;

view.layer.masksToBounds = YES;
0
bhautikmewada191

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

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];
0
richy

В 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
    }
}
0
iOS