2016-12-12 14 views
0

これはかなり単純なものですIBDesignable丸いラベル。これはInterface Builderとシミュレータで実行されたときにうまく描画されます。ビューをUIStackViewに追加すると、IBでうまく描画されますが、コーナーの半径は左上隅にのみ適用されます。UIStackViewに追加するとIBDesignableが機能しない

import UIKit 

@IBDesignable class RoundedLabel: UILabel { 
    @IBInspectable var cornerRadius : CGFloat = 46 { 
     didSet { 
      self.drawTheLabel() 
     } 
    } 

    @IBInspectable var roundRightCorners : Bool = false { 
     didSet { 
      self.drawTheLabel() 
     } 
    } 

    @IBInspectable var roundLeftCorners : Bool = false { 
     didSet { 
      self.drawTheLabel() 
     } 
    } 
    @IBInspectable var borderRadius : CGFloat = 3 { 
     didSet { 
      self.layer.borderWidth = borderRadius 
     } 
    } 
    @IBInspectable var borderColor : UIColor = .black { 
     didSet { 
      self.layer.borderColor = borderColor.cgColor 
     } 
    } 

    private func drawTheLabel() { 
     var tCorners : UIRectCorner = [] 
     if roundRightCorners { 
      tCorners.insert(.topRight) 
      tCorners.insert(.bottomRight) 
     } 
     if roundLeftCorners { 
      tCorners.insert(.bottomLeft) 
      tCorners.insert(.topLeft) 
     } 

     let path = UIBezierPath(roundedRect:self.bounds, 
           byRoundingCorners:tCorners, 
           cornerRadii: CGSize(width: cornerRadius, height: cornerRadius)) 

     let maskLayer = CAShapeLayer() 

     maskLayer.path = path.cgPath 
     self.layer.mask = maskLayer 
     self.layer.masksToBounds = true 
    } 

} 

ないでuistackview

enter image description here

uistackview

enter image description here

答えて

1

問題に加えビューこの行であるビュー:

let path = UIBezierPath(roundedRect:self.bounds, 

実際には、selfにはの正しいboundsがあります。しかし、のときにdrawTheLabelと呼ばれていますが、ではありませんが、正しいboundsです。スタックビューが配置されたサブビューのレイアウトを実行する前に、drawTheLabelが遅すぎるを呼び出すことがあります(おそらく1000x1000などの意味のないサイズですが、簡単にログ/デバッグして見つけることができます)。

したがって、追加するマスクは最終的なサイズのビューでは大きすぎます。マスクの左上隅のみが表示されます。マスクの他のコーナーは、左右にずらしてあり、オーバーラップしないためビューには影響しません。

+0

ありがとうございます!実行時に境界をチェックすることはありませんでした。/ – MjZac

1

あなたはいつでもフレームの変更これは、丸みを帯びた角の効果を適用します、その後drawTheLabel()

layoutSubviewsをオーバーライドし、スーパーを呼び出す必要があります。

+0

私はそれを動作させました。ありがとう。 :) – MjZac

関連する問題