Создан пользовательский UIView MyLabelView с двумя элементами, 1x UILabel, 1x UIView, для которого будет установлен цвет фона.
MyLabelView
Вид:
Код:
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:
Код (в 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 он всегда выравнивался рядом с шевроном
Вид:
код (в 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
Ожидаемые результаты
Вид:
Вид:
Я пытался поэкспериментировать с дополнительными внешними UIViews в качестве контейнеров и использовать AutoLayout, но почему-то это не сработало так, как я ожидал. Большое спасибо за вашу помощь.
Swift 4, iOS11
UPDATE
Я попытался установить ограничения в IB, поскольку у меня нет доступа к ячейке (с использованием статических ячеек).
Просмотр содержимого:
Название:
MyLabelView:
![enter image description here](https://i.stack.imgur.com/bpvCF.png)