2017-02-14 16 views
0

以下のコードを使用してビューの選択された角を丸くしましたが、レイヤーとしてサイズ変更可能なビューでこれを達成するのに問題がありますか?ビューがサイズ変更されるたびに更新されません。サイズ変更可能なビューの丸みのあるコーナー

extension UIView { 
    func roundCorners(corners:UIRectCorner, radius: CGFloat) { 
     let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) 
     let mask = CAShapeLayer() 
     mask.path = path.cgPath 
     self.layer.mask = mask 
    } 
} 

titleLabelView.roundCorners(corners: [.topLeft, .topRight], radius: 10) 

同様の質問hereが、そのかなり古いとすべてがにObjCで行わがあります。

サイズ変更可能なビューを迅速に選択したコーナーを丸める方法はありますか?

----- ----- EDIT

だから基本的に私が持っている私は、テキストのサイズに基づいてサイズを変更するように設定されているテキストテーブルです。

私はちょうど使用することができ、多くの場合

myTextLabel.layer.cornerRadius = 10 

しかし、これはすべての4つのコーナーを行います。だから、もし私がトップ2を丸くしたいのであれば、上記のエクステンションを使う必要があります。今私はviewDidLayoutSubViewsは動作しません使用して(私はcollectionViewの中心にセルのindexPathを取得する必要がありますので、私は、テキストラベルを設定することができます)ラベルの内容を設定する

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 

    GeneralFunctions.getIndexOfCell(sender: self) { (index) in 
     self.titleLabel.text = self.partArray[index].title 
     self.titleLabel.roundCorners(corners: [.topLeft, .topRight], radius: 10) 
     self.descriptionLabel.text = self.partArray[index].description 
     self.descriptionLabel.roundCorners(corners: [.bottomLeft, .bottomRight], radius: 10) 
     self.backgroundLabelView.layer.cornerRadius = 16 
     self.backgroundLabelView.layoutIfNeeded() 
     self.backgroundLabelView.layoutSubviews() 
    } 

} 

をscrollViewDidEndDeceleratingを使用していますので、この場合、加速終了とレイアウトの間には時間差があるためです。私はviewDidLayoutSubViews内側(中央インデックスのチェックせずに)同じコードを使用して試みたが、結果は同じです。

enter image description here

と私は角の丸みのいずれかを使用していないとき、ラベルが正しくサイズを変更しません。

enter image description here

+0

リンク質問(と私は答えを期待)チェックせずに、あなたは正確に問題を説明することができますか? Obj-CからSwiftへの変換はかなり簡単です。何を試しましたか?あなたは疑問がむしろ曖昧です。特に – dfd

+0

は、あなたが参照する質問に、viewDidLayoutSubviews' –

答えて

0

私は同様の問題を抱えていた、私はUITableViewCellのために、この機能をたくさん使用していますし、私の全体のコードは

のように見えます

DispatchQueue.main.async(execute: { 
    self.roundCorners(.allCorners, radius: 6, borderColor: nil, borderWidth: nil) 
}) 

のように、この機能を使用することによってそれを解決してきました

private var didLayoutSubview = false { 
    didSet { 
     DispatchQueue.main.async(execute: { 
      self.roundCorners(.allCorners, radius: 6, borderColor: nil, borderWidth: nil) 
     }) 
    } 
} 

override func layoutSubviews() { 
    if !self.didLayoutSubview { 
     self.didLayoutSubview = true 
    } 
    super.layoutSubviews() 
} 

だから基本的には、メインスレッドでこの関数を呼び出して助けた、と私はそれが場所だと思うので、私はlayoutSubivewsの内側にそれを呼び出しています。

My機能

func roundCorners(_ corners: UIRectCorner, radius: CGFloat, borderColor: UIColor?, borderWidth: CGFloat?) { 
    let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) 

    let mask = CAShapeLayer() 
    mask.frame = self.bounds 
    mask.path = path.cgPath 
    self.layer.mask = mask 

    if borderWidth != nil { 
     addBorder(mask, borderWidth: borderWidth!, borderColor: borderColor!) 
    } 
} 
+0

'でサイズ変更を行うことに特に注意を払って、あなたはこれを達成するためのUIViewをサブクラス化しているか、あなたはそれのUIViewを供給していますか? – DuckMan

+0

私は私の機能を追加しました、それはあなたのような 'UIView'の拡張です。また、私はちょうど私のビューに設定するのではなく、mask.frame' '設定します。 – JuicyFruit