Я пытаюсь поместить серый прозрачный градиент поверх изображения в моем приложении ios, но это не работает из-за проблем с фреймом.Так как мой UIImageView
настроен программно и с translatesAutoresizingMaskIntoConstraints = false
, градиентный слой не виден, когда я устанавливаю его кадр в кадр изображения.Я не хочу устанавливать ни один из фреймов в константу, потому что изображение находится в ячейке представления коллекции, которая использует функцию sizeForItemAt
, чтобы определить размер каждой из моих ячеек, и поэтому размер изображения изменяется с размеромячейка и мне нужно, чтобы мой градиент был такого же размера, как изображение.
Я попытался установить градиент, создав UIView
, который я помещаю в качестве подпредставления UIImageView
, но мне не повезлос этим из-за проблем с рамой снова.Я видел другие посты о добавлении градиентных слоев, но все они требуют, чтобы я определил рамку для градиента.
//This is the imageview and the gradient that I want to apply to it
let profileImageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.translatesAutoresizingMaskIntoConstraints = false
return imageView
} ()
var gradient: CAGradientLayer = {
let gradientLayer = CAGradientLayer()
gradientLayer.colors = [UIColor.clear.cgColor, UIColor.gray.cgColor]
gradientLayer.opacity = 0.7
return gradientLayer
}()
//This is the setupviews() function where I apply the gradient to the imageview
func setupViews() {
self.contentView.addSubview(profileImageView)
profileImageView.layer.addSublayer(gradient)
//constraints for profileImageView
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[v0]-0-|", options: NSLayoutConstraint.FormatOptions(), metrics: nil, views: ["v0": profileImageView]))
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[v0]-0-|", options: NSLayoutConstraint.FormatOptions(), metrics: nil, views: ["v0": profileImageView]))
}
В настоящее время, чтобы появился градиент, мне нужно определить рамку дляградиентный слой в setupViews()
, но, как я описал ранее, я бы предпочел не делать этого.Есть ли способ создать слой градиента без определения конкретного кадра, или есть другой лучший способ применить слой градиента в моем случае?Спасибо!
РЕДАКТИРОВАТЬ: Я хотел бы уточнить, что все представления в моем UICollectionViewCell
классе не имеют рамок.Все они настроены с ограничениями программно, поэтому, если я попытаюсь напечатать view.frame.height
или view.frame.width
, программа выдаст ноль, несмотря на то, что фактическая высота и ширина представления не равны нулю.Поэтому определение любого вида рамки для градиента или установка рамки градиента для рамки вида не будет работать.Должен ли я изменить структуру моих представлений, чтобы иметь возможность разместить градиент над изображением?Или я все еще могу надеяться на спасение от этого вопроса?Спасибо!