Установить другое горизонтальное выравнивание пользовательского UIView - PullRequest
2 голосов
/ 03 апреля 2019

Создан пользовательский UIView MyLabelView с двумя элементами, 1x UILabel, 1x UIView, для которого будет установлен цвет фона.

MyLabelView

Вид:
enter image description here
Код:

import UIKit

@IBDesignable
class MyLabelView: UIView {
@IBOutlet var contentView: UIView!
@IBOutlet weak var imageView: UIView!
@IBOutlet weak var titleLabel: UILabel!

override init(frame: CGRect) {
    super.init(frame: frame)
    commonInit()
}

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

override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()
    commonInit()
    contentView?.prepareForInterfaceBuilder()
}

private func commonInit() {
    let bundle = Bundle(for: type(of: self))
    bundle.loadNibNamed(String(describing: type(of: self)), owner: self, options: nil)

    addSubview(contentView)
}

}

Я использую MyLabelView в двух случаях:
- MasterViewController (TableViewController с динамическими прототипами)
- DetailViewController (TableViewController со статическими ячейками и сгруппированным стилем)

MasterViewController
Показывает MyLabelView правильный как часть пользовательского UITableViewCell

View:
enter image description here
Код (в cellForRowAt):

let cell: MyTableViewCell = tableView.dequeueReusableCell(withIdentifier: "MyTableViewCell") as! MyTableViewCell
cell.myLabelView.titleLabel.text = "Label"
cell.myLabelView.imageView.backgroundColor = UIColor.red

// Dynamic width to fit label texts of various sizes
var frm: CGRect = cell.myLabelView.titleLabel.frame
frm.size.width = cell.myLabelView.titleLabel.intrinsicContentSize.width
cell.myLabelView.titleLabel.frame = frm


DetailViewController
Здесь я хотел бы визуализировать MyLabelView с увеличенным размером шрифта (работающим) и выровненным по правому краю, чтобы независимо от длины текста Label он всегда выравнивался рядом с шевроном

Вид:
enter image description here
код (в viewDidLoad):

myLabelView.titleLabel.text = "Label"
myLabelView.titleLabel.font = myLabelView.titleLabel.font.withSize(17)
myLabelView.imageView.backgroundColor = UIColor.red

// Dynamic width to fit label texts of various sizes
var frm: CGRect = myLabelView.titleLabel.frame
frm.size.width = myLabelView.titleLabel.intrinsicContentSize.width
myLabelView.titleLabel.frame = frm

Ожидаемые результаты
Вид:
enter image description here
Вид:
enter image description here
Я пытался поэкспериментировать с дополнительными внешними UIViews в качестве контейнеров и использовать AutoLayout, но почему-то это не сработало так, как я ожидал. Большое спасибо за вашу помощь.
Swift 4, iOS11

UPDATE
Я попытался установить ограничения в IB, поскольку у меня нет доступа к ячейке (с использованием статических ячеек).

Просмотр содержимого:
enter image description here

Название:
enter image description here

MyLabelView:
enter image description here

1 Ответ

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

Просто добавьте функцию в подкласс UITableViewCell и вызывайте ее, когда вам нужно установить представление рядом с правой стороной:

func setTrailingAnchorForView() {
        contentView.translatesAutoresizingMaskIntoConstraints = false
        contentView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
        contentView.trailingAnchor.constraint(equalTo: imageView.leadingAnchor, constant: 0).isActive = true
    }

Назовите это так:

cell.setTrailingAnchorForView()
...