2016-03-18 4 views
0

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

Это то, что я до сих пор (vwView мой выход для настраиваемого представления на экране):

var layerTest = CAShapeLayer() 

var bzPath = UIBezierPath(roundedRect: vwView.bounds, byRoundingCorners: [.BottomLeft, .BottomRight], cornerRadii: CGSizeMake(10, 10)) 
layerTest.path = bzPath.CGPath 

vwView.layer.mask = layerTest; 

Что я делаю неправильно? ТАКЖЕ: Это всего лишь мой прототип, потому что я действительно хочу сделать это на UITableViewCell, поэтому, если есть другой подход, который мне нужно принять для этого, это также может быть полезно.

Благодаря

Джеймс

+0

Кажется, работает на меня. Какой результат вы получаете? – beyowulf

+0

Вы пытались установить рамку своего слоя? 'layerTest.frame = vwView.bounds'? – Losiowaty

ответ

1

Проблема заключается в том, что vwView получает изменен позже по размеру экрана, но не обновлять путь для своего нового размера. Для этого нет особо тривиального решения. Вам в основном нужно сделать vwView пользовательский класс (если его еще нет) и обновить маску в layoutSubviews. Пример:

public class RoundedBorderView: UIView { 

    public var roundedCorners: UIRectCorner = [ .BottomLeft, .BottomRight ] { 
     didSet { self.setNeedsLayout() } 
    } 

    public var cornerRadii: CGSize = CGSizeMake(10, 10) { 
     didSet { self.setNeedsLayout() } 
    } 

    public override func layoutSubviews() { 
     super.layoutSubviews() 
     updateMask() 
    } 

    private func updateMask() { 
     let mask = maskShapeLayer() 
     mask.path = UIBezierPath(roundedRect: bounds, byRoundingCorners: roundedCorners, cornerRadii: cornerRadii).CGPath 
    } 

    private func maskShapeLayer() -> CAShapeLayer { 
     if let mask = layer.mask as? CAShapeLayer { 
      return mask 
     } 
     let mask = CAShapeLayer() 
     layer.mask = mask 
     return mask 
    } 

} 

Изменить класс vwView к RoundedBorderView и он будет поддерживать свой собственный слой маски.

+0

Спасибо, Роб! Это отлично поработало, и у вас отличный код! –

Смежные вопросы