Я создаю приложение, которое имитирует общение с реальным пользователем, для макета журнала чата, который я использую UITableView
, потому что я очень новичок в Swift, но раньше я программировал на других языках, я создаю весь макет программно.
В настоящее время мой ViewController
выглядит следующим образом
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var navigationBar: UINavigationBar!
@IBOutlet weak var tableView: UITableView!
let rows: [String] = [
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam euismod nunc id nulla ultricies tempus. Mauris a euismod nunc."
]
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return rows.count;
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "AiMessageCell") as! AiMessageCell
// cell.textLabel?.text = rows[indexPath.row]
// cell.textLabel?.numberOfLines = 0;
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
// tableView.beginUpdates()
// tableView.endUpdates()
return UITableViewAutomaticDimension;
}
override func viewDidLoad() {
super.viewDidLoad()
// tableView.estimatedRowHeight = 140
// tableView.rowHeight = UITableViewAutomaticDimension;
tableView.register(AiMessageCell.self, forCellReuseIdentifier: "AiMessageCell")
tableView.register(UserMessageCell.self, forCellReuseIdentifier: "UserMessageCell")
tableView.register(UserSelectionCell.self, forCellReuseIdentifier: "UserSelectionCell")
}
}
он просто занимает одну строку и на основе этого (в настоящее время не передает текст в ячейку) выводит одну единственную строку в мой UITableView
и у меня есть AiMessageCell
логика
class AiMessageCell: UITableViewCell, NSLayoutManagerDelegate {
// @IBOutlet weak var wrapper: UIView!
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
let wrapper = UIView(
frame: CGRect(
x: 10, y: 10,
width: UIScreen.main.bounds.width - 10 - 10,
height: 45
)
)
let balloon = UIView(
frame: CGRect(
x: 40, y: 0,
width: 80,
height: 45.5
)
)
balloon.layer.cornerRadius = 10;
balloon.backgroundColor = UIColor.init(
red: CGFloat(240/255.0),
green: CGFloat(240/255.0),
blue: CGFloat(240/255.0),
alpha: CGFloat(1.0)
);
let message = UITextView(
frame: CGRect(
x: 10, y: 5,
width: balloon.layer.bounds.width - 10,
height: balloon.layer.bounds.height - 10
)
);
message.text = "What is shown in the scrollable content area of a scroll view is determined by its subviews. ?";
message.font = UIFont.systemFont(ofSize: 16);
message.isEditable = false;
message.isScrollEnabled = false;
message.isSelectable = false;
message.backgroundColor = UIColor.clear;
message.layoutManager.delegate = self;
let avatar = UIImageView(
image: UIImage(named: "avatar")
);
avatar.clipsToBounds = true;
avatar.layer.cornerRadius = 15;
let calculated = message.sizeThatFits(
CGSize(width: wrapper.bounds.width - 50, height: CGFloat.greatestFiniteMagnitude)
)
avatar.frame = CGRect(x: 0, y: calculated.height - 25, width: 30, height: 30)
message.frame.size = CGSize(width: calculated.width, height: calculated.height)
balloon.frame.size = CGSize(width: calculated.width + 20, height: calculated.height + 5);
wrapper.frame.size = CGSize(width: wrapper.bounds.width, height: balloon.bounds.height);
balloon.addSubview(message)
wrapper.addSubview(balloon)
wrapper.addSubview(avatar)
wrapper.backgroundColor = UIColor.purple
contentView.backgroundColor = UIColor.green
contentView.addSubview(wrapper)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setTimeout(_ delay:TimeInterval, block:@escaping ()->Void) -> Void {
Timer.scheduledTimer(timeInterval: delay, target: BlockOperation(block: block), selector: #selector(Operation.main), userInfo: nil, repeats: false)
}
func layoutManager(_ layoutManager: NSLayoutManager, lineSpacingAfterGlyphAt glyphIndex: Int, withProposedLineFragmentRect rect: CGRect) -> CGFloat {
return 5;
}
}
здесь я создаю целую строку сообщения с аватаром пользователя и пузырем сообщения (UITextView
), который автоматически изменяет размер на текст.
И тут возникает проблема, несмотря на то, что пузырь сообщения автоматически масштабируется по тексту, высота строки таблицы фиксирована.
Вот как это выглядит, я честно попробовал по крайней мере 5разные ответы от SO, но не повезло.В настоящее время я думаю, что проблема в том, что у меня нет ограничений между моим wrapper
(фиолетовым блоком) и ячейками content view
(зеленым блоком)