Как поместить слой градиента на UIImageView, у которого нет рамки - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь поместить серый прозрачный градиент поверх изображения в моем приложении 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, программа выдаст ноль, несмотря на то, что фактическая высота и ширина представления не равны нулю.Поэтому определение любого вида рамки для градиента или установка рамки градиента для рамки вида не будет работать.Должен ли я изменить структуру моих представлений, чтобы иметь возможность разместить градиент над изображением?Или я все еще могу надеяться на спасение от этого вопроса?Спасибо!

Ответы [ 3 ]

0 голосов
/ 06 мая 2019

Может быть, вы попытаетесь получить доступ к UIImageView в sizeForItem, затем вы измените размер подслоя градиента в этом методе?

0 голосов
/ 06 мая 2019

Вы можете: - создать файл Swift с приведенным ниже кодом - установить для imageView этот класс - поместить этот imageView или UIView (в этом случае поверните класс соответствующим образом) над UIImageView, содержащим ваше изображение.И это должно работать (см. Пример скриншотов).Измените параметры, как вы хотите с вашими настройками цвета / альфа.Надеюсь, что это поможет.

import Foundation
import UIKit

class AddGradientsToImageView: UIImageView {

// For item created programmatically
override init(frame: CGRect) {
    super.init(frame: frame)

    addGradientsToImageView()
}

// For items created in the storyboard
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    addGradientsToImageView()
}

func addGradientsToImageView() {

// Set background gradient colors
let lightBlue = UIColor(red: 112/255, green: 117/255, blue: 239/255, alpha: 1)
let darkBlue = UIColor(red: 70/255, green: 84/255, blue: 201/255, alpha: 1)

// Set gradients
let gradientLayer = CAGradientLayer()
gradientLayer.frame = bounds
gradientLayer.colors = [darkBlue.cgColor, lightBlue.cgColor]
gradientLayer.locations = [0.0,1.0]
gradientLayer.startPoint = CGPoint(x: 1.0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0)

// Clip gradients to background bounds
clipsToBounds = true

// Set transparency level
alpha = 0.50

// insert gradients to button
layer.insertSublayer(gradientLayer, at: 0)
}
}

результат кода для этого изображения Просмотр результат кода с изображением позади

0 голосов
/ 06 мая 2019

Вы можете создать пользовательский класс, который наследует от UIImageView, добавить слой при его создании и переопределить layoutsubviews ()

override func layoutSubviews() {
   super.layoutSubviews()
   customlayer.frame = self.bounds     
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...