Добавление UITextView и UIImageView в UIStackView

#ios #swift #iphone #user-interface #stackview

#iOS #swift #iPhone #пользовательский интерфейс #stackview

Вопрос:

Итак, я добавил некоторый текст (UITextView) в свой StackView и отцентрировал его вверху. Я также добавил UIImageView, который будет хорошо сидеть под моим UITextView. Ну, это не так. По какой-то причине изображение полностью закрывает текст. Если я удалю изображение, текст снова появится в верхнем центре. Много играл с распределением и выравниванием стека, но безуспешно. Не уверен, чего мне не хватает: (. Любая помощь приветствуется!

Я добавляю как UITextView, так и UIImageView как arrangedSubview в стек.

Вот мой код:

 //stack
let stack: UIStackView = {
        let stack = UIStackView()
        stack.translatesAutoresizingMaskIntoConstraints = false
        stack.axis = .vertical
        stack.spacing = 5
        stack.distribution = .fillProportionally
        stack.alignment = .fill

       return stack
    }()

//text
    fileprivate let title: UITextView = {
        let title = UITextView()
        title.translatesAutoresizingMaskIntoConstraints = false
        title.contentMode = .scaleAspectFit
        title.layer.cornerRadius = 10
        title.backgroundColor = .darkGray
        title.font = UIFont(name: "Megrim-Regular", size: 17)
        title.textColor = .white
        title.textAlignment = .center
        
        return title
    }()

//image
    let image: UIImageView = {
        let image = UIImageView()
        image.image = UIImage(named: "demoPic.jpg")
        image.translatesAutoresizingMaskIntoConstraints = false
        image.frame = CGRect(x: 0, y: 0, width: 50, height: 50)

        return image
    }()
  

Ответ №1:

Надеюсь, что это может помочь,

Я думаю, что ваша проблема связана с ограничениями, применяемыми к stackview и представлению держателя.(См. Ниже)

Ваш код элементов пользовательского интерфейса (TextView и Image), похоже, в порядке (возможно, изображение не будет работать с шириной 50 / высотой 50 внутри этой конкретной конфигурации представления стека. Для этого потребуется другой подход, IMO.

Тем не менее, на моей игровой площадке, чтобы увидеть это, я просто применил 2 ограничения к моему контейнерному представлению, чтобы ваш TextView был намного выше вашего ImageView, как вы хотели.

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

 import UIKit
import PlaygroundSupport

/// DEMO VIEW CLASS 
final class DemoView: UIView {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        backgroundColor = .white
    }
    
    required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented")
    }
}

// YOUR UI CODE
//stack
let stack: UIStackView = {
    let stack = UIStackView()
    stack.translatesAutoresizingMaskIntoConstraints = false
    stack.axis = .vertical
    stack.spacing = 5
    stack.distribution = .fillProportionally
    stack.alignment = .fill
    
    return stack
}()

//text
fileprivate let title: UITextView = {
    let title = UITextView()
    title.translatesAutoresizingMaskIntoConstraints = false
    title.contentMode = .scaleAspectFit
    title.layer.cornerRadius = 10
    title.backgroundColor = .darkGray
    title.font = UIFont(name: "Megrim-Regular", size: 17)
    title.text = "TextView"
    title.textColor = .white
    title.textAlignment = .center
    
    return title
}()

//image
let image: UIImageView = {
    let image = UIImageView()
    image.backgroundColor = .red
    image.translatesAutoresizingMaskIntoConstraints = false
    image.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
    return image
}()


// PLAYGROUND DEMO VIEW TO HOLD YOUR STACK VIEW
let demoView = DemoView(frame: CGRect(x: 0, y: 0, width: 350, height: 150))

stack.addArrangedSubview(title)
stack.addArrangedSubview(image)
demoView.addSubview(stack)

demoView.addConstraints(
    NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[stackView]-0-|",
                                   options: NSLayoutConstraint.FormatOptions(rawValue: 0),
                                   metrics: nil,
                                   views: ["stackView": stack])
)

demoView.addConstraints(
    NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[stackView]-0-|",
                                   options: NSLayoutConstraint.FormatOptions(rawValue: 0),
                                   metrics: nil,
                                   views: ["stackView": stack])
)

PlaygroundPage.current.liveView = demoView

  

Результаты: ваш текстовый вид находится над центром изображения (у ImageView здесь просто КРАСНЫЙ фон).

Демонстрационная игровая площадка