2017-01-24 4 views
1

私はカスタムセルを持つtableViewを持っています。各セルは、プロパティ "name"と "image"を持っています。私がしようとしているのは、画像の周りに境界線を追加することです。この部分は動作します。しかし、私がCALayerにbackgroundColorを追加しようとすると、私がtableViewで見ることができるのはUALmageなしのCALayerです。UIImageにサブレイヤとしてCALayerを追加すると予期しない動作が発生する

ここでは、理解を深めるためのコードと背景色の設定例を示します。背景色なし

@IBOutlet weak var channelImage: UIImageView! { 
     didSet { 
      let borderLayer = CALayer() 
      let borderFrame = CGRect(x: -4, y: -4, width: channelImage.frame.size.width+8, height: channelImage.frame.size.width+8) 
      borderLayer.frame = borderFrame 
      borderLayer.cornerRadius = 4 
      borderLayer.borderWidth = 0.5 
      borderLayer.borderColor = UIColor.lightGray.cgColor 
      channelImage.layer.insertSublayer(borderLayer, at: 0) 
      channelImage.layer.masksToBounds = false 
      borderLayer.backgroundColor = UIColor.lightGray.cgColor 
      self.channelImage.layoutIfNeeded() 
      self.channelImage.layoutSubviews() 
     } 
    } 

:ここ

@IBOutlet weak var channelImage: UIImageView! { 
    didSet { 
     let borderLayer = CALayer() 
     let borderFrame = CGRect(x: -4, y: -4, width: channelImage.frame.size.width+8, height: channelImage.frame.size.width+8) 
     borderLayer.frame = borderFrame 
     borderLayer.cornerRadius = 4 
     borderLayer.borderWidth = 0.5 
     borderLayer.borderColor = UIColor.lightGray.cgColor 
     channelImage.layer.insertSublayer(borderLayer, at: 0) 
     channelImage.layer.masksToBounds = false 
     self.channelImage.layoutIfNeeded() 
     self.channelImage.layoutSubviews() 
    } 
} 

はまた、第1および第2の例に参照されるイメージです。

enter image description here

enter image description here

私は検索の多くをしましたが、私は答えが見つからなかった私の状況。あなたは、余分な層にを気にする必要はありません

channelImage.layer.borderWidth = 0.5 
channelImage.layer.borderColor = UIColor.lightGray.cgColor 

:ここ

は、あなたがそのようにUIImageViewの層に直接国境を追加することができ

class ChannelCell: UITableViewCell, ChannelSettable { 

    static let reusableID = "channelCell" 

    var channel: Channel? = nil { 
     didSet { 
      self.channelName.text = channel?.channelName ?? "" 
      self.channelImage.image = UIImage(named: channel?.channel ?? "") ?? UIImage(named: "TV") 
      self.channelCategory.text = channel?.chCategory ?? "" 
     } 
    } 

    @IBOutlet weak var channelName: UILabel! 
    @IBOutlet weak var channelCategory: UILabel! 
    @IBOutlet weak var channelImage: UIImageView! { 
     didSet { 
      let borderLayer = CALayer() 
      let borderFrame = CGRect(x: -4, y: -4, width: channelImage.frame.size.width+8, height: channelImage.frame.size.width+8) 
      borderLayer.frame = borderFrame 
      borderLayer.cornerRadius = 4 
      borderLayer.borderWidth = 0.5 
      borderLayer.borderColor = UIColor.lightGray.cgColor 
      borderLayer.backgroundColor = UIColor.lightGray.cgColor 
      channelImage.layer.insertSublayer(borderLayer, at: 0) 
      channelImage.layer.masksToBounds = false 
     } 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     self.channelName.font = DesignHelper.channelNameFont 
     self.channelCategory.font = DesignHelper.channelCategoryFont 
     self.layoutIfNeeded() 
    } 

    override func setSelected(_ selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 
    } 
} 

答えて

1

このセルの完全なコードですそれを行う。しかし

あなたはまだこれらのメソッドを使用してみてくださいそこに余分のCALayerを追加する必要がある場合:

func insertSublayer(CALayer, above: CALayer?) 
func insertSublayer(CALayer, below: CALayer?) 
+0

私は追加する方法を知っています私の状況では、ボーダーフレームのサイズはイメージのフレームサイズよりも大きくなければならないので、私はボーダーを別のレイヤーにしたいと思っています。私もあなたが言及した2つの方法を試してみましたが、結果は同じです。 – Excalibur

+0

ImageViewより大きなボーダーを追加したい場合は、UIKitを使用して、より大きなimageViewの下にサブビューを挿入することができます。次に、背景色を設定します。あなたが好きなら、あなたはCALayerプロパティでコーナーを丸めることができます。あなたはそれを行うためにUIViewクラスからinsertSubview(_:aboveSubview :)またはinsertSubview(_:belowSubview :)を使用することができます。 – Radek

+0

これは可能ですが、UALmageフレームサイズと比較してCALayerフレームサイズのオフセットを変更したい場合は、制約などを変更する必要があります。これは達成しようとしているものではありません。 – Excalibur

0

サブ層は、あなたのイメージビュー時に挿入されています。

あなたは(あなたがイメージの背後にある層をしたい場合)は、使用して、層内の画像を追加することができます

channelImage.backgroundColor = UIColor.lightGray.cgColor 

を使用し、その後ImageViewのの背景を設定したい場合は

borderLayer.contents = channelImage.cgImage 
+0

私はこのステップ/可能な解決法も知っていますが、CALayerは画像フレームよりも大きいので、画像レイヤーだけが背景色を変更するので、そして、あなたが選手とイメージフレームの間に白いボーダーを持っているよりも。本当の問題は、サブレイヤとして挿入していてもレイヤが画像ビューの上に挿入されている理由です。 – Excalibur

+0

CALayerの中にあなたのUIImageを追加するだけです(更新された答えを見てください) –

関連する問題