2017-01-24 5 views
1

У меня есть таблицаView с пользовательскими ячейками. Каждая ячейка имеет свойство «имя» и «изображение». Я пытаюсь добавить границу вокруг изображения. Эта часть работает. Но когда я пытаюсь добавить backgroundColor в CALayer, все, что я вижу в tableView, это CALayer без UIImage.Неожиданное поведение при добавлении CALayer в качестве подуровня в UIImage

Вот код для лучшего понимания и примера с настройкой цвета фона.

@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() 
    } 
} 

Здесь также изображения, упомянутые в первом и втором примере:

enter image description here

enter image description here

Я сделал много поиска, но Я не нашел ответа для моя ситуация.

Вот полный код этой ячейки

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

Вы можете добавить границу непосредственно слоя UIImageView как что:

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

вам не придется возиться с дополнительным слоем на сделай это.

Однако, если вам все еще нужно добавить дополнительный CALayer там попробуйте использовать следующие методы:

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

Я знаю, как добавить непосредственно в UIImageView, но в моей ситуации я хочу, чтобы граница была в отдельном слое, так как размер рамки рамки должен быть больше, чем размер кадра изображения. Я также попробовал оба метода, которые вы упомянули, и результат все тот же. – Excalibur

+0

Если вы просто хотите добавить более крупную рамку, чем ImageView, вы можете сделать это, используя UIKit, чтобы вставить подвью под изображением, которое больше. Затем установите его цвет фона. Чем больше вы можете обойти свои углы с помощью свойства CALayer, если хотите. Для этого вы можете использовать insertSubview (_: aboveSubview :) или insertSubview (_: belowSubview :) из класса UIView. – Radek

+0

Это может произойти, но когда я хотел бы изменить смещение размера кадра CALayer по сравнению с размером кадра UIImage, мне пришлось бы менять ограничения и т. Д., И это не то, чего я пытаюсь достичь. – Excalibur

0

промежуточный слой вставляется на ваш взгляд изображения.

, если вы хотите установить фон ImageView затем использовать

channelImage.backgroundColor = UIColor.lightGray.cgColor 

вы можете добавить изображение внутри слоя с помощью (если вы хотите, слой за изображение)

borderLayer.contents = channelImage.cgImage 
+0

Я также знаю этот шаг/возможное решение, но поскольку мой CALayer больше, чем кадр изображения, это не работает для меня, потому что только слой с изображением меняет цвет фона.И чем у вас есть белая граница между калейсером и рамкой изображения. Реальный вопрос в том, почему слой вставлен над представлением изображения, даже если я вставляю его в качестве подуровня. – Excalibur

+0

, то просто добавьте свой UIImage внутри CALayer (посмотрите на обновленный ответ) –

Смежные вопросы