2016-03-18 10 views
0

私はしばらくこのことに固執していましたが、オンラインでさまざまなソリューションを試しましたが、私が間違っていることを理解することはできません。私が達成しようとしているのは、非常にシンプルなはずです。私はUIViewを持っていますし、左下と右隅を丸めて、クリップされて描画されないようにしたいと思います。私は間違って何をやっているUIViewのカスタム丸めコーナー

var layerTest = CAShapeLayer() 

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

vwView.layer.mask = layerTest; 

これは私が(vwViewは私の口が画面にカスタムビューのためである)、これまで持っているものでしょうか? ALSO:これは私のプロトタイプです。なぜなら、私は本当に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 
    } 

} 

変更RoundedBorderViewからvwViewのクラスと、それは、独自のマスク層を維持します。

+0

ありがとうRob!これは素晴らしく、素晴らしいコードを手に入れました! –

関連する問題