2016-12-28 4 views
0

Я сейчас борюсь с странным поведением с 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() с нужными параметрами, но она не работает, как ожидалось.

  1. Во-первых, когда я просто добавляю UIView в свою раскадровку, не пытаясь добавить границы и цвет, у меня есть правильное поведение. Другими словами, my UIView is correctly centered inside the screen

  2. Однако, когда я пытаюсь использовать расширение UIView и добавить цветные границы, the view is not correctly centered anymore. Кажется, что пространство справа обрезано чем-то.

Я предполагаю, что существует проблема с границами или рамкой маски/слоя, используемой для рисования границ. Но я ничего не нашел, чтобы исправить это.

Любые предложения?

+0

В какой момент жизненного цикла просмотра вы вызываете 'addBorder'? Вероятно, в какой-то момент, когда информация о макете еще не указана – luk2302

+0

Метод addBorder вызывается методом round. Обычно, когда вызывается addBorder, маска уже создана, как вы можете видеть в коде, который я опубликовал –

+0

проверить границы вашего вида, когда метод round называется –

ответ

0

Фактически, я вызывал круглый метод в viewDidLoad моего UIViewController. Тем не менее, как заметил @ luk2302, это не подходящее место для работы с границами, кадрами и т. Д., Потому что в данный момент представления не полностью загружены.

Поэтому я перевел вызов на круглый метод внутри метода viewDidLayoutSubviews моего UIViewController. Это нормально!