Автоматически установите угловой радиус UIView на половину ширины представления.

У меня есть несколько представлений, размер которых не жестко запрограммирован, а определяется с помощью ограничений, и мне нужно, чтобы эти представления были круглыми.
Есть ли способ установить свойство angleRadius «динамически», например. в зависимости от фактического размера объекта?
Я знаю, что если это представление находится внутри UIViewController, я могу получить ширину через roundView.frame.width и установить там свойство layer.cornerRadius, но круглые представления не содержатся в viewController , но управляется другим простым UIView.
Заранее спасибо!
Дэйв


person unixb0y    schedule 22.01.2019    source источник


Ответы (3)


Вы можете переопределить метод layoutSubviews класса View и установить там значение angleRadius. Допустим, вы хотите, чтобы угол угла составлял половину ширины представления:

override func layoutSubviews() {
    super.layoutSubviews()
    self.layer.cornerRadius = self.bounds.width * 0.5
}
person emrepun    schedule 23.01.2019
comment
И обычно хорошей идеей является добавление super.layoutSubviews() imo. - person Travis Griggs; 23.01.2019
comment
@TravisGriggs а, определенно, спасибо за комментарий. Я обновил ответ :)) - person emrepun; 23.01.2019
comment
Я на самом деле сделал это, не задумываясь, почти как стандартная процедура имхо: D Но спасибо за подсказку и обновленный ответ, ребята ???? - person unixb0y; 25.01.2019

Этого легко добиться с помощью RxSwift, соблюдая Key Path.

extension UIView{

    func cornerHalf(){
        clipsToBounds = true
        rx.observe(CGRect.self, #keyPath(UIView.bounds))
            .subscribe(onNext: { _ in
                self.layer.cornerRadius = self.bounds.width * 0.5
            }).disposed(by: rx.disposeBag)
    }
}

Просто вызовите метод init, код кажется проще с помощью объявления, вместо того, чтобы распределяться по двум местам. В частности, логика обычно присутствует в вашем проекте.

Звоните так:

 let update: UIButton = {
     let btn = UIButton()
     // more config
     btn.cornerHalf()
     return btn
 }()
person dengApro    schedule 05.01.2020

Просто получите к ним доступ через простое представление, которое их содержит. Если в вашем простом представлении-контейнере нет этого круглого представления в качестве экземпляров, вы можете получить к ним доступ, перебирая его массив подпредставлений. Когда вы получите доступ к представлению, вы можете получить доступ к их frame.size.width и установить для свойства layer.corner radius это значение.

person andrija    schedule 23.01.2019
comment
Вопрос в том, когда представление контейнера узнает фактический размер подпредставления? Потому что в методе init() он говорит мне 512 пикселей, хотя на самом деле это 60. - person unixb0y; 23.01.2019
comment
хорошо, я думаю, что он не может знать фактический размер в методе инициализации, потому что его кадр устанавливается контроллером, который его представляет. Вы можете установить кадр в инициализации, но он может быть изменен контроллером. Таким образом, вы можете попробовать получить доступ к нему в контроллере и добавить угловой радиус, а не в метод инициализации. - person andrija; 23.01.2019