Сдвиг рамки просмотра изображения соответствует оригинальному размеру изображения - PullRequest
0 голосов
/ 30 декабря 2018

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

Я пробовал разные изображения, и все они делают одно и то же.

Класс с проблемами: SuggestionCloud;Я объясню проблему в трех частях:

FIRST: суперкласс, который устанавливает все элементы пользовательского интерфейса и вызывает «неисправный» пользовательский класс UIImage (SuggestionCloud).

ВТОРОЙ: Класс предположенияCloud

UIScaleControllerVew

Class UIScaleControllerView: UIViewController: {


 let suggestionCloud : SuggenstionCloud = {        
    let cloud =  SuggenstionCloud(image: UIImage(named: "suggestionCloud.png"))
    cloud.translatesAutoresizingMaskIntoConstraints = false;
    return cloud;
}();



override func viewDidLoad() {
    super.viewDidLoad()
    print("UIScaleController_DidLoad")
    view.backgroundColor = UIColor(hexString: "8ED7F5")
    view.addSubview(weigtImageView)
    view.addSubview(textView)
    view.addSubview(bottomMenu);
    view.addSubview(suggestionCloud)
    setUpLayout()
    suggestionCloud.setLabels(weightedTags: stuff, selectedTags: selected)
}
extension UIScaleControllerVew {

func setUpLayout() {

    // SuggestionCloud
    suggestionCloud.setConstraints(
        topAnchor: textView.bottomAnchor, topConstant: 0,
        bottomAnchor: bottomMenu.topAnchor, bottomConstant: 0,
        trailingAnchor: view.trailingAnchor, trailingConstant: 10,
        leadingAnchor: view.leadingAnchor, leadingConstant: 10 
//all UI elements are setup underneath..took those out for th

Класс предположенияCloud:

импорт UIKit

класс SuggenstionCloud: UIImageView {

override init(image: UIImage?) {
    super.init(image: image)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}


public func setConstraints(
    topAnchor : NSLayoutAnchor<NSLayoutYAxisAnchor>, topConstant: CGFloat,
    bottomAnchor: NSLayoutAnchor<NSLayoutYAxisAnchor>, bottomConstant: CGFloat,
    trailingAnchor: NSLayoutAnchor<NSLayoutXAxisAnchor>, trailingConstant: CGFloat,
    leadingAnchor: NSLayoutAnchor<NSLayoutXAxisAnchor>, leadingConstant: CGFloat)
{
    self.contentMode = .scaleToFill
    self.topAnchor.constraint(equalTo: topAnchor, constant: topConstant).isActive = true;
    self.bottomAnchor.constraint(equalTo: bottomAnchor, constant: bottomConstant).isActive = true;
    self.trailingAnchor.constraint(equalTo: trailingAnchor, constant: trailingConstant).isActive = true;
    self.leadingAnchor.constraint(equalTo:  leadingAnchor, constant: leadingConstant).isActive = true;

}

public func setLabels(weightedTags: [String: Int], selectedTags: [String]) {
    let buttons : [UIButton] = createButtons(weightedTags: weightedTags);
    createLayout(buttons: buttons)
}

private func createButton(buttonText: String) -> UIButton {
    let button = UIButton()
    button.setTitle(buttonText, for: .normal)
    button.titleLabel?.font = UIFont(name: "Avenir-Light", size: 20.0)
    button.translatesAutoresizingMaskIntoConstraints = false;
    button.backgroundColor = .blue
    self.addSubview(button)
    return button;
}

private func createButtons(weightedTags: [String: Int]) -> [UIButton] {
    var buttons : [UIButton] = [];
    for tag in weightedTags {
        buttons.append(createButton(buttonText: tag.key))
    }
   return buttons;
}


private func createLayout(buttons : [UIButton]) {
    if buttons.count == 0 { return }
    let leftEdgePadding : CGFloat = 30;
    let rightEdgePadding : CGFloat = 30;
    let topPadding : CGFloat = 30;

    let padding : CGFloat = 10;
    let availableHeight : CGFloat = self.frame.height + (-2 * topPadding)
    let availableWidth : CGFloat = self.frame.width + (-2 * padding)
    var i = 0;

    var totalHeight : CGFloat = 0;
    var rowLength : CGFloat = 0;
    var rowCount : Int = 0;
    var lastButton : UIButton!


    for button in buttons {
        if totalHeight > availableHeight {print("Cloud out of space"); return}

        if rowLength == 0 && rowCount == 0
        {
            setFirstConstraints(button: button, padding: topPadding)
            totalHeight = button.intrinsicContentSize.height + topPadding;
            rowLength += button.intrinsicContentSize.width + padding
            lastButton = button;

        }
        else if rowLength + button.intrinsicContentSize.width < availableWidth
        {
            setConstraints(button, padding, topPadding, lastButton, rowCount)
            rowLength += button.intrinsicContentSize.width + padding;
            lastButton = button;
        }
        else
        {
            totalHeight += button.intrinsicContentSize.height + padding
            setNewRowConstraint(button: button, padding: padding, totalHeight: totalHeight)
            rowLength = 0;
            rowCount += 1
            lastButton = button
        }
        i += 1;
    }

}
private func setNewRowConstraint(
    button: UIButton,
    padding: CGFloat,
    totalHeight: CGFloat)
{
    let totalPadding = button.intrinsicContentSize.height + padding + totalHeight
    button.topAnchor.constraint(equalTo: self.topAnchor, constant: totalHeight).isActive = true
    button.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: padding).isActive = true
}
private func setConstraints (
        _ button : UIButton,
        _ leftPadding: CGFloat,
        _ topPadding: CGFloat ,
        _ lastButton: UIButton,
        _ rows: Int)
{
    button.leadingAnchor.constraint(equalTo: lastButton.trailingAnchor, constant: leftPadding).isActive = true
    button.topAnchor.constraint(equalTo: self.topAnchor, constant: topPadding).isActive = true
}
private func setFirstConstraints(button: UIButton, padding: CGFloat)
{
    button.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: padding).isActive = true
    button.topAnchor.constraint(equalTo: self.topAnchor, constant: padding ).isActive = true
}

}

ТРЕТЬЕ: наконец, проблема: я создаю кнопки динамически, чтобы они соответствовали представлению. Я должен программно устанавливать якоря каждой кнопки, чтобы динамически соответствовать размерам их суперкласса.

Однако: Внутри моего алгоритма сам.frame.size: 800 800: исходный размер изображения при init ().

    let availableHeight : CGFloat = self.frame.height // = 800
    let availableWidth : CGFloat = self.frame.width // 800 no bueno

Странно, что фактический размер UIView корректен в симуляторе. Таким образом, ограничения работают, ноИзображение не знает о его реальных размерах

Может ли кто-нибудь помочь мне разобраться с этим? Что я делаю не так?

1 Ответ

0 голосов
/ 30 декабря 2018

Набор ярлыков вызывается слишком рано.Кадр не устанавливается к моменту вызова viewDidLoad.Вам нужно подождать, пока после viewDidLayoutSubviews / layoutSubviews.Использование флага и настройка в didLayoutSubviews должны позволить вам правильно прочитать кадр.

var didSetUpSuggestionCloud = false

override func viewDidLoad() {
   super.viewDidLoad()
   print("UIScaleController_DidLoad")
   view.backgroundColor = UIColor(hexString: "8ED7F5")
   view.addSubview(weigtImageView)
   view.addSubview(textView)
   view.addSubview(bottomMenu);
   view.addSubview(suggestionCloud)
   setUpLayout()
   //make sure suggestionClouds setConstraints is called here
}

override func viewDidLayoutSubviews() {
   guard !self.didSetUpSuggestionCloud else {
      return
   }
   suggestionCloud.setLabels(weightedTags: stuff, selectedTags: selected)
   self.didSetUpSuggestionCloud = true
}

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

...