Как расположить представление изображения профиля так, чтобы оно было закреплено рядом с именем пользователя вверху в организованном представлении стека?

Итак, у меня есть представление стека, и изображение профиля должно идти рядом с именем пользователя и оставаться там. Как мне сделать это в этом упорядоченном представлении стека без конфликтов, потому что я пытался привязать его к вершине. Вроде так, но без результатов:

Изображение того, чего я пытаюсь достичь

Но в настоящее время он продолжает делать это: Что сейчас происходит

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    contentView.addSubview(profileImageView)
    contentView.addSubview(profileNameLabel)
    contentView.addSubview(userHandel)

    profileImageView.setContentHuggingPriority(.defaultHigh, for: .horizontal)
    let innerPostStackView = UIStackView(arrangedSubviews: [profileNameLabel, userHandel, postTextLabel])
    innerPostStackView.axis = .vertical

    let postStackView = UIStackView(arrangedSubviews: [profileImageView, innerPostStackView])
    postStackView.translatesAutoresizingMaskIntoConstraints =  false
    postStackView.alignment =  .center
    postStackView.spacing = 10
    contentView.addSubview(postStackView)

    NSLayoutConstraint.activate([
        
        postStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10),
        postStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -15),
        postStackView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10),
        postTextLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -15)
    ])

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

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не уверен, что это поможет вам. Вы можете игнорировать UIStackView и использовать авто-макет следующим образом:

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    
    contentView.addSubview(profileImageView)
    contentView.addSubview(profileNameLabel)
    contentView.addSubview(userHandel)
    contentView.addSubview(postTextLabel)
    
    // activate autolayout constraints:
    NSLayoutConstraint.activate([
        // profileImageView:
        profileImageView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 16),
        profileImageView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 16),
        profileImageView.heightAnchor.constraint(equalToConstant: 52),
        profileImageView.widthAnchor.constraint(equalToConstant: 52),
        
        // profileNameLabel:
        profileNameLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 16),
        profileNameLabel.leftAnchor.constraint(equalTo: profileImageView.rightAnchor, constant: 8),
        profileNameLabel.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: -16),
        
        // userHandel:
        userHandel.topAnchor.constraint(equalTo: profileNameLabel.bottomAnchor, constant: 8),
        userHandel.leftAnchor.constraint(equalTo: profileNameLabel.leftAnchor),
        userHandel.rightAnchor.constraint(equalTo: profileNameLabel.rightAnchor),
        
        // postTextLabel:
        postTextLabel.topAnchor.constraint(equalTo: userHandel.bottomAnchor, constant: 8),
        postTextLabel.leftAnchor.constraint(equalTo: userHandel.leftAnchor),
        postTextLabel.rightAnchor.constraint(equalTo: userHandel.rightAnchor),
        postTextLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -16)
    ])
}
Ответ принят как подходящий

Вот как выглядит ваша ячейка:

class MyCell: UITableViewCell {

let profileNameLabel: UILabel = {
    let label = UILabel()
    label.numberOfLines = 0
    label.textColor = .black
    label.backgroundColor = .clear
    label.font = .systemFont(ofSize: 20, weight: .bold)
    label.text = "Minions"
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()

let userHandel: UILabel = {
    let label = UILabel()
    label.numberOfLines = 0
    label.textColor = .systemBlue
    label.backgroundColor = .clear
    label.font = .systemFont(ofSize: 14, weight: .semibold)
    label.text = "@Minions"
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()

let postTextLabel: UILabel = {
    let label = UILabel()
    label.numberOfLines = 0
    label.textColor = .black
    label.backgroundColor = .clear
    label.text = "Every Mac comes with a one-year limited warranty(opens in a new window) and up to 90 days of complimentary technical support(opens in a new window). AppleCare+ for Mac extends your coverage from your AppleCare+ purchase date and adds unlimited incidents of accidental damage protection, each subject to a service fee of $99 for screen damage or external enclosure damage, or $299 for other accidental damage, plus applicable tax. In addition, you’ll get 24/7 priority access to Apple experts via chat or phone. For complete details, see the terms(opens in a new window)."
    return label
}()

let costant: CGFloat = 60

let profileImageView: UIImageView = {
    let iv = UIImageView()
    iv.backgroundColor = .darkGray.withAlphaComponent(0.2)
    iv.contentMode = .scaleAspectFill
    iv.clipsToBounds = true
    iv.translatesAutoresizingMaskIntoConstraints = false
    return iv
}()

let containerView: UIView = {
    let v = UIView()
    v.backgroundColor = .clear
    return v
}()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    backgroundColor = .white
    let image = UIImage(named: "minions")?.withRenderingMode(.alwaysOriginal)
    profileImageView.image = image
    profileImageView.widthAnchor.constraint(equalToConstant: costant).isActive = true // set here profileImageView wudth
    profileImageView.layer.cornerRadius = costant / 2
    
    contentView.backgroundColor = .white
    
    containerView.addSubview(profileNameLabel)
    profileNameLabel.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
    profileNameLabel.leadingAnchor.constraint(equalTo: containerView.leadingAnchor).isActive = true
    profileNameLabel.trailingAnchor.constraint(equalTo: containerView.trailingAnchor).isActive = true
    profileNameLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true
    
    containerView.addSubview(userHandel)
    userHandel.topAnchor.constraint(equalTo: profileNameLabel.bottomAnchor).isActive = true
    userHandel.leadingAnchor.constraint(equalTo: containerView.leadingAnchor).isActive = true
    userHandel.trailingAnchor.constraint(equalTo: containerView.trailingAnchor).isActive = true
    userHandel.heightAnchor.constraint(equalToConstant: 20).isActive = true
    
    let totalUpStack = UIStackView(arrangedSubviews: [profileImageView, containerView])
    totalUpStack.axis = .horizontal
    totalUpStack.spacing = 6
    totalUpStack.distribution = .fill
    totalUpStack.translatesAutoresizingMaskIntoConstraints = false
    totalUpStack.heightAnchor.constraint(equalToConstant: costant).isActive = true
    
    let completeStack = UIStackView(arrangedSubviews: [totalUpStack, postTextLabel])
    completeStack.axis = .vertical
    completeStack.spacing = 6
    completeStack.distribution = .fill
    completeStack.translatesAutoresizingMaskIntoConstraints = false
    
    contentView.addSubview(completeStack)
    completeStack.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
    completeStack.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
    completeStack.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
    completeStack.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -10).isActive = true
}

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

Вот результат:

UITableView высота строки по умолчанию равна .automaticDimension. Реализация этого в heightForRowAt не только не нужна, но и увеличивает нагрузку на обработку, и ее НЕ следует использовать.
DonMag 21.11.2022 16:01

@DonMag, ты прав, я удаляю это из своего ответа ...

Fabio 21.11.2022 16:22

Другие вопросы по теме