2016-05-02 7 views
0

私はMaterialViewをサブクラス化し、drawRectをオーバーライドしてカスタムビューを作成し、それをtableViewFooterとして追加します。タイトルによれば、私は深く働くことはできません。私はclipsToBoundsmasksToBoundsをさまざまなレイヤー/ビューで成功させずに使いこなしました。私のコードを明確にするために、UIViewControllerの中のtableViewです。サブクラス化されたMaterialViewはMaterialDepthを表示していません

サブクラス ReceiptEdgeのための私のコード

override func prepareView() { 
    super.prepareView() 

    let rect = self.frame 
    let path = UIBezierPath() 
    let receiptEdgeSize = CGFloat(rect.width/75) 
    var x = CGFloat(-receiptEdgeSize/2) 
    let y = rect.size.height/2 
    path.moveToPoint(CGPoint(x: x, y: y)) 

    while x < rect.width { 
     x += receiptEdgeSize 
     path.addLineToPoint(CGPoint(x: x, y: y)) 
     x += receiptEdgeSize 
     path.addArcWithCenter(CGPoint(x: x, y: y), radius: receiptEdgeSize, startAngle: CGFloat(M_PI), endAngle: CGFloat(0), clockwise: true) 
     x += receiptEdgeSize 
    } 

    path.addLineToPoint(CGPoint(x: x, y: CGFloat(0))) 
    path.addLineToPoint(CGPoint(x: 0, y: 0)) 
    path.addLineToPoint(CGPoint(x: 0, y: y)) 

    let layer = CAShapeLayer() 
    layer.path = path.CGPath 

    self.layer.mask = layer 
    self.visualLayer.mask = layer 
    self.visualLayer.backgroundColor = UIColor.blueColor().CGColor 

    self.layer.shadowColor = UIColor.redColor().CGColor 
} 

何の深さに私よりも多くの層について知っている誰かのために事前に

No depth being shown

感謝を示さないスクリーンショット

let receiptEdge = ReceiptEdge(frame: CGRect(x: 0, y: 0, width: self.view.w, height: 30)) 
    receiptEdge.backgroundColor = .whiteColor() 
    receiptEdge.depth = MaterialDepth.Depth5 

    //What I've tried messing with for an hour 
    receiptEdge.clipsToBounds = false 
    receiptEdge.layer.masksToBounds = true 
    self.tableView.clipsToBounds = false 
    self.view.clipsToBounds = false 
    self.view.layer.masksToBounds = true 
    self.tableView.layer.masksToBounds = true 

    self.tableView.tableFooterView = receiptEdge 

!ここ 私はここMaterialDepth.Depth2

enter image description here

を用いMaterialTableViewCellのサブクラスで動作する深さを得ている図の一例であり、ここに私が設定visualLayer enter image description here

の同一の経路を有するlayerでありますself.layerへのレイヤーまたはパスはありません。影がありますが、ビジュアルレイヤーにクリッピングしないビューまたはシャドウがあります。違いを見ることができるようにshadowColorを赤に設定します。

enter image description here

+0

「MaterialLayer」クラスが何であるか疑問に思っている人にとって、私は[this](https://github.com/CosmicMind/Material)フレームワークを使用しており、プロジェクト全体を通して様々なビューで作業するための深みを持っています。 – NSGangster

答えて

0

したがって、深さの仕組みが動作します。

MaterialViewは2つのレイヤーを使用して境界線をクリップし、シャドーイングを実現する複合オブジェクトです。 visualLayerというCAShapLayerが、ビューのバッキングレイヤにサブレイヤとして追加されます。したがって、イメージが追加されると、それは実際にmasksToBoundsプロパティがtrueに設定されているvisualLayerに追加され、layerプロパティのmasksToBoundsプロパティはfalseに設定されます。これにより、深さプロパティがlayerプロパティに表示され、クリッピングの認識が得られます。

このラインで

receiptEdge.layer.masksToBounds = true 

あなたが実際に深さをクリッピングしています。だから私が試してやることは、これが設定されています

let layer = CAShapeLayer() 
    layer.path = path.CGPath 
    self.layer.mask = layer 

visualLayerプロパティに。

あなたが正しい道に辿り着かなければ、それはあなたを助けるはずです。

+0

パスを描画した後、私は 'override drawRect:'関数の最後にそれを行います。私はそこにそれを使わないべきですか?私は境界にマスクを設定しようとしたと思います。私は自分のパソコンでそのレポにアクセスすることができないので、明日それを試してみるとあなたに戻ってきます。 drawRectではなく、インスタンス化した後にレイヤーを描画して適用することができます。 – NSGangster

+0

一般的にdrawRectは使用しません。上書きするのは高価な関数であり、正しく使用されないと奇妙な結果が得られます。私は 'prepareView'を使ってサブクラスにパスを描画します。これは、MaterialViewで利用可能なメソッドであり、サブクラスとしてそれらの種類のものを実行します。 – CosmicMind

+0

今私は境界を示す 'visualLayer'を持っていますが、私の' layer'はまだrect全体をカバーしています。私は影が私の描かれた道を越えて伸びるので、これを知っている'self.layer.mask = layer'を設定した場合、同じ形状をとりますが、ビューは境界にクリップしません。影は描画されません。私は私の答えにいくつかのスクリーンショットを載せます。 – NSGangster

関連する問題