Как добавить ограничение для подпредставления экземпляра UIView без сбоев моего приложения? - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть экземпляр UIView в Swift, к которому я добавляю подпредставление экземпляра UIImageView, но не могу добавить ограничение к экземпляру UIImageView без сбоя моего приложения.

Я попытался написать SwiftКод 5.0 в Xcode 10.2 и iOS 12.2 для установки ограничения на то, чтобы передний край экземпляра UIImageView находился на расстоянии 50 от левого края экземпляра UIView.

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let sectionHeaderView : UIView = UIView()

    let sectionHeaderImage: UIImage = UIImage(named: "Flag - ENGLAND.png")!
    let sectionHeaderImageView : UIImageView = UIImageView(image: sectionHeaderImage)
    sectionHeaderImageView.translatesAutoresizingMaskIntoConstraints = false

    let imageViewWidthConstraint : NSLayoutConstraint = NSLayoutConstraint(item: sectionHeaderImageView, attribute: .width, relatedBy: .equal, toItem: sectionHeaderImageView, attribute: .width, multiplier: 0.0, constant: 40)
    imageViewWidthConstraint.isActive = true
    sectionHeaderImageView.addConstraint(imageViewWidthConstraint)

    let imageViewHeightConstraint : NSLayoutConstraint = NSLayoutConstraint(item: sectionHeaderImageView, attribute: .height, relatedBy: .equal, toItem: sectionHeaderImageView, attribute: .height, multiplier: 0.0, constant: 40)
    imageViewHeightConstraint.isActive = true
    sectionHeaderImageView.addConstraint(imageViewHeightConstraint)

    let imageViewLeadingConstraint : NSLayoutConstraint = NSLayoutConstraint(item: sectionHeaderImageView, attribute: .leading, relatedBy: .equal, toItem: sectionHeaderView, attribute: .left, multiplier: 1.0, constant: 50)
    imageViewLeadingConstraint.isActive = true
    sectionHeaderImageView.addConstraint(imageViewLeadingConstraint)

    return sectionHeaderView
}

Я ожидаю, что экземпляр UIView содержит экземплярUIImageView должен быть расположен 50 справа от экземпляра UIView.Вместо этого приложение вылетает в XCode с сообщением об ошибке «Thread 1: signal SIGABRT» в файле AppDelegate.swift.

Ответы [ 3 ]

0 голосов
/ 04 апреля 2019

Этот код должен работать:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let sectionHeaderView = UIView()
    let sectionHeaderImage = UIImage(named: "Flag - ENGLAND.png")!
    let sectionHeaderImageView = UIImageView(image: sectionHeaderImage)
    sectionHeaderImageView.translatesAutoresizingMaskIntoConstraints = false
    sectionHeaderView.addSubview(sectionHeaderImageView)

    NSLayoutConstraint.activate([
        sectionHeaderImageView.widthAnchor.constraint(equalToConstant: 40),
        sectionHeaderImageView.heightAnchor.constraint(equalToConstant: 40),
        sectionHeaderImageView.leadingAnchor.constraint(equalTo: sectionHeaderView.leadingAnchor, constant: 50),
        sectionHeaderImageView.topAnchor.constraint(equalTo: sectionHeaderView.topAnchor, constant: 50)
    ])
    return sectionHeaderView
}
0 голосов
/ 04 апреля 2019

Сначала вы должны добавить изображение в родительский вид

 override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let sectionHeaderView: UIView = UIView()

    let sectionHeaderImage: UIImage = UIImage(named: "Flag - ENGLAND.png")!
    let sectionHeaderImageView: UIImageView = UIImageView(image: sectionHeaderImage)

        sectionHeaderImageView.translatesAutoresizingMaskIntoConstraints = false

        sectionHeaderView.addSubview(sectionHeaderImageView)

        let imageViewHeightConstraint = NSLayoutConstraint(
            item: sectionHeaderImageView,
            attribute: .height,
            relatedBy: .equal,
            toItem: nil,
            attribute: .notAnAttribute,
            multiplier: 1.0,
            constant: 40
        )
        let imageViewWidthConstraint = NSLayoutConstraint(
            item: sectionHeaderImageView,
            attribute: .width,
            relatedBy: .equal,
            toItem: nil,
            attribute: .notAnAttribute,
            multiplier: 1.0,
            constant: 40
        )
        let imageViewLeadingConstraint = NSLayoutConstraint(
            item: sectionHeaderImageView,
            attribute: .left,
            relatedBy: .equal,
            toItem: sectionHeaderView,
            attribute: .left,
            multiplier: 1.0,
            constant: 50
        )
        sectionHeaderView.addConstraints([
            imageViewHeightConstraint,
            imageViewWidthConstraint,
            imageViewLeadingConstraint
            ])
    }
    return sectionHeaderView
}
0 голосов
/ 04 апреля 2019

Это работает?

 override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let sectionHeaderView : UIView = UIView()

    let sectionHeaderImage: UIImage = UIImage(named: "Flag - ENGLAND.png")!
    let sectionHeaderImageView : UIImageView = UIImageView(image: sectionHeaderImage)
    sectionHeaderImageView.translatesAutoresizingMaskIntoConstraints = false

    let imageViewWidthConstraint : NSLayoutConstraint = NSLayoutConstraint(item: sectionHeaderImageView, attribute: .width, relatedBy: .equal, toItem: sectionHeaderImageView, attribute: .width, multiplier: 0.0, constant: 40)
    imageViewWidthConstraint.isActive = true
    sectionHeaderImageView.addConstraint(imageViewWidthConstraint)

    let imageViewHeightConstraint : NSLayoutConstraint = NSLayoutConstraint(item: sectionHeaderImageView, attribute: .height, relatedBy: .equal, toItem: sectionHeaderImageView, attribute: .height, multiplier: 0.0, constant: 40)
    imageViewHeightConstraint.isActive = true
    sectionHeaderImageView.addConstraint(imageViewHeightConstraint)

    let imageViewLeadingConstraint : NSLayoutConstraint = NSLayoutConstraint(item: sectionHeaderImageView, attribute: .leading, relatedBy: .equal, toItem: sectionHeaderView, attribute: .left, multiplier: 1.0, constant: 50)
    imageViewLeadingConstraint.isActive = true

    sectionHeaderView.addSubview(sectionHeaderImageView) // add subview first
    sectionHeaderImageView.addConstraint(imageViewLeadingConstraint)
    return sectionHeaderView
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...