Я сейчас борюсь с странным поведением с UIView в Swift3. Я просто пытаюсь добавить UIView в центре экрана, с цветными и закругленными границами.Странное поведение при попытке округления углов по UIView
Для того, чтобы закруглить границы легко, я использую следующее расширение:
extension UIView {
/**
Rounds the given set of corners to the specified radius
- parameter corners: Corners to round
- parameter radius: Radius to round to
*/
func round(corners: UIRectCorner, radius: CGFloat) {
_round(corners: corners, radius: radius)
}
/**
Rounds the given set of corners to the specified radius with a border
- parameter corners: Corners to round
- parameter radius: Radius to round to
- parameter borderColor: The border color
- parameter borderWidth: The border width
*/
func round(corners: UIRectCorner, radius: CGFloat, borderColor: UIColor, borderWidth: CGFloat) {
let mask = _round(corners: corners, radius: radius)
addBorder(mask: mask, borderColor: borderColor, borderWidth: borderWidth)
}
/**
Fully rounds an autolayout view (e.g. one with no known frame) with the given diameter and border
- parameter diameter: The view's diameter
- parameter borderColor: The border color
- parameter borderWidth: The border width
*/
func fullyRound(diameter: CGFloat, borderColor: UIColor, borderWidth: CGFloat) {
layer.masksToBounds = true
layer.cornerRadius = diameter/2
layer.borderWidth = borderWidth
layer.borderColor = borderColor.cgColor;
}
}
private extension UIView {
@discardableResult func _round(corners: UIRectCorner, radius: CGFloat) -> CAShapeLayer {
let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
self.layer.mask = mask
return mask
}
func addBorder(mask: CAShapeLayer, borderColor: UIColor, borderWidth: CGFloat) {
let borderLayer = CAShapeLayer()
borderLayer.path = mask.path
borderLayer.fillColor = UIColor.clear.cgColor
borderLayer.strokeColor = borderColor.cgColor
borderLayer.lineWidth = borderWidth
borderLayer.frame = bounds
layer.addSublayer(borderLayer)
}
}
class GameViewController: UIViewController {
@IBOutlet weak var cardView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
cardView.round(corners: UIRectCorner.allCorners, radius: 5.0, borderColor: DesignHelper.defaultColor, borderWidth: 1)
}
}
Я просто называю myView.round() с нужными параметрами, но она не работает, как ожидалось.
Во-первых, когда я просто добавляю UIView в свою раскадровку, не пытаясь добавить границы и цвет, у меня есть правильное поведение. Другими словами, my UIView is correctly centered inside the screen
Однако, когда я пытаюсь использовать расширение UIView и добавить цветные границы, the view is not correctly centered anymore. Кажется, что пространство справа обрезано чем-то.
Я предполагаю, что существует проблема с границами или рамкой маски/слоя, используемой для рисования границ. Но я ничего не нашел, чтобы исправить это.
Любые предложения?
В какой момент жизненного цикла просмотра вы вызываете 'addBorder'? Вероятно, в какой-то момент, когда информация о макете еще не указана – luk2302
Метод addBorder вызывается методом round. Обычно, когда вызывается addBorder, маска уже создана, как вы можете видеть в коде, который я опубликовал –
проверить границы вашего вида, когда метод round называется –