Динамический угловой радиус для пейзажа и портрета

Я создаю расширение UIView с @IBInspectable, чтобы установить угловой радиус, но когда я просто поворачиваю свое устройство, оно не работает должным образом.

import UIKit
import Foundation

extension UIView {

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

Я взял изображение со следующими ограничениями: введите здесь описание изображения

когда я запускаю приложение в портретном режиме, вывод будет введите здесь описание изображения

но это не работает, когда я поворачиваю свое устройство введите здесь описание изображения


person Nirav Hathi    schedule 02.08.2018    source источник
comment
Пожалуйста, проверьте мой ответ и примите его, если он будет полезен. Так что это может быть полезно кому-то еще в будущем.   -  person Lal Krishna    schedule 13.08.2018


Ответы (4)


При вращении размер вашего вида меняется, и ранее примененный angleRadius становится слишком большим. Вы должны обновить радиус угла в layoutSubviews. Попробуйте этот небольшой класс:

open class CircularView: UIView {
    @IBInspectable open var hasSquareCornerRadius: Bool = false {
        didSet {
            update()
        }
    }

    @IBInspectable open var cornerRadius: CGFloat = 0 {
        didSet {
            update()
        }
    }

    public var normalizedCornerRadius: CGFloat {
        return hasSquareCornerRadius ? bounds.height / 2 : cornerRadius
    }

    fileprivate func update() {
        layer.cornerRadius = cornerRadius
    }

    override open func layoutSubviews() {
        super.layoutSubviews()
        update()
    }
}

Установите этот класс для вашего представления в построителе интерфейса. Если ваш вид квадратный, установите для hasSquareCornerRadius значение true в построителе интерфейса.

person shota    schedule 02.08.2018

Установите радиус угла в методе layoutSubviews.

Если вам нужен вид в круглой форме, установите угловой радиус как половину ширины/высоты.

view.layer.cornerRadius = view.frame.width / 2.0
person Lal Krishna    schedule 02.08.2018

Я вижу на вашем экране Shot, вы предоставляете фиксированный угловой радиус

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

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

вам нужно сбросить угловой радиус вида при изменении ориентации в методе self.layoutSubviews().

person Simran Kour    schedule 02.08.2018

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

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

if ( ([[UIDevice currentDevice] orientation] ==  UIDeviceOrientationPortrait) )
{
view.layer.cornerRadius = view.frame.width / 2.0
}
else if(([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight) || ([[UIDevice currentDevice] orientation] == UIInterfaceOrientationLandscapeLeft))
{
view.layer.cornerRadius = view.frame.width / 2.0
}
person Uddiptta Ujjawal    schedule 02.08.2018