Swift Custom UIView с параметрами инициализации - PullRequest
0 голосов
/ 14 марта 2020

Я был свидетелем пользовательского класса UIView, который принимает несколько параметров и переопределяет пустой раскадровку UIView (подкласс класса MultiPositionTarget вместо UIview), как показано ниже. Представления ниже связаны как выход для просмотра контроллера, как это видно из кода ниже (всего 9 просмотров).

enter image description here

// Initialize the targets
target1 = MultiPositionTarget(.zero,"targetTemp.png","David","Target")
target1.parentVC = self
targetList.append(target1)

Однако параметры не принимаются. И только загружает вид. Вот мой класс ниже:

class MultiPositionTarget: UIView{

    var targetName: String!
    var bottomLabelName: String!
    var imageName: String!
    var isSelected: Bool!
    var labelTop: UILabel!
    var labelBottom: UILabel!
    var parentVC: SelectTargetViewController!

    init(_ frame: CGRect,_ imagName: String,_ targetname: String,_ targetlabel: String){

        self.imageName = imagName
        self.targetName = targetname
        self.bottomLabelName = targetlabel
        super.init(frame: frame)
        setUp()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setUp()
    }

    func setUp(){

        let viewWidth = self.bounds.width
        let viewHeight = self.bounds.height
        // Add top label
        labelTop = UILabel(frame: CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight/5))

        //labelTop.center = CGPoint(x: 160, y: 285)
        labelTop.textAlignment = .center
        labelTop.font = UIFont(name:"System",size:6)
        labelTop.text = self.imageName
        labelTop.textColor = UIColor.white
        labelTop.backgroundColor = hexStringToUIColor(hex: "#770B2C")
        //labelTop.alpha = 0.5
        self.addSubview(labelTop)

        let image = UIImage(named: "targetTemp.png")
        let imageView = UIImageView(image: image!)
        imageView.frame = CGRect(x: 0, y: (viewHeight-viewHeight * 4/5), width: viewWidth, height: (viewHeight * 4/5))
        self.addSubview(imageView)

        // Add bottom Label
        labelBottom = UILabel(frame: CGRect(x: 0, y: (viewHeight * 4/5), width: viewWidth, height: viewHeight/5))

        //labelBottom.center = CGPoint(x: 160, y: 285)

        labelBottom.textAlignment = .center
        labelBottom.text = self.bottomLabelName
        labelBottom.font = UIFont(name:"System",size:10)
        labelBottom.textColor = UIColor.white
        labelBottom.backgroundColor = hexStringToUIColor(hex: "770B2C")
        labelBottom.alpha = 0.95
        self.addSubview(labelBottom)

        self.isUserInteractionEnabled = true
        let viewTap = UITapGestureRecognizer(target: self, action: #selector(singleTap))
        self.addGestureRecognizer(viewTap)

    }

}

Любая помощь или подсказка приветствуется. Заранее спасибо семейство переполнения стека.

1 Ответ

2 голосов
/ 14 марта 2020

Эта строка создает новый вид:

target1 = MultiPositionTarget(.zero,"targetTemp.png","David","Target")

Новый вид не связан с видом, показанным на экране. Новое представление на самом деле вообще не отображается на экране, потому что вы не добавили его в иерархию представлений. Даже если вы это сделали, он невидим, потому что имеет нулевую рамку.

Короче говоря, вы не можете вызвать свой пользовательский инициализатор , а также создать свой вид в раскадровке. Вы можете инициализировать нужные свойства либо в раскадровке, либо в коде.

Если вы хотите инициализировать свойства также в раскадровке, вы можете изменить imageName, bottomLabelName и * 1014. * with @IBInsepctable:

@IBInsepctable var targetName: String!
@IBInsepctable var bottomLabelName: String!
@IBInsepctable var imageName: String!
// or, if you want to directly select an image from the storyboard:
// @IBInsepctable var image: UIImage!

Таким образом, эти свойства будут отображаться в инспекторе свойств в раскадровке.

Если вы хотите инициализировать его в коде, вы должны установить его с помощью операторы присваивания, а не с инициализатором:

target1.targetName = "David"
target1.bottomLabelName = "Target"
target1.imageName = "targetTemp.png"
target1.parentVC = self
targetList.append(target1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...