swift - titulo - Cambiar el tamaño del encabezado de la tabla al usar tipos dinámicos
repetir filas de titulo en word 2010 no funciona (3)
Tengo un TableViewController
con un encabezado. Este encabezado es un contenedor, que se vincula a otro guión gráfico llamado Header.storyboard
Header.storyboard
contiene una vista de pila con algunas etiquetas, que se escriben de forma dinámica.
El texto de las etiquetas proviene de DB.
No importa la dimensión o el tamaño del texto, quiero visualizarlo correctamente.
He usado algunas respuestas de SO para obtener el tamaño correcto del encabezado, pero sin suerte:
import UIKit
class TableViewController: UITableViewController {
@IBOutlet weak var tableHeaderView: UIView!
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Dynamic sizing for the header view
if let headerView = tableHeaderView {
headerView.setNeedsLayout()
headerView.layoutIfNeeded()
let height = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
var headerFrame = headerView.frame
// If we don''t have this check, viewDidLayoutSubviews() will get
// repeatedly, causing the app to hang.
if height != headerFrame.size.height {
headerFrame.size.height = height
headerView.frame = headerFrame
tableHeaderView = headerView
}
}
}
}
intenta implementar
tableView(_ tableView: UITableView, heightForHeaderInSection section: Int)
y
tableView(_ tableView: UITableView, viewForHeaderInSection section: Int)
tu código debería verse así:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return tableHeaderView.bounds.size.height
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
return tableHeaderView
}
El encabezado de la vista de tabla puede redimensionarse automáticamente
pero con contenedores es probable que no funcione
use vista personalizada en su lugar para viewForHeaderInSection
class ViewController: UITableViewController {
override func viewDidLoad() {
tableView.estimatedSectionHeaderHeight = 10
tableView.sectionHeaderHeight = UITableViewAutomaticDimension
}
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let lab = UILabel()
lab.text = "text /(section)"
lab.font = UIFont.systemFont(ofSize: 10 * CGFloat(section) + 1)
return lab
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 5
}
//this method overriding is not necessary
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return UITableViewAutomaticDimension
}
}
Primero, en lugar de darle la altura a la vista, debe darle a la etiqueta una altura
class ViewController : UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 40
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 4
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.backgroundColor = UIColor.yellow
cell.textLabel?.text = "Baran"
return cell
}
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
return heightForView()
}
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerView : UIView = UIView(frame: CGRect(x: 0, y: 20, width: self.view.frame.width, height: self.heightForView()))
headerView.backgroundColor = UIColor.black
let label : UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.heightForView()))
label.numberOfLines = 0
label.textAlignment = NSTextAlignment.center
label.text = "Size To Fit Tutorial"
label.font = UIFont(name: "Helvetica", size: 50)
label.textColor = UIColor.white
headerView.addSubview(label)
return headerView
}
//Self Sizing height ....
func heightForLabel(text:String, font:UIFont, width:CGFloat) -> CGFloat{
let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byCharWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
func heightForView() -> CGFloat{
let screenSize = UIScreen.main.bounds
let screenWidth = screenSize.width
let text = "Size To Fit Tutorial"
let font : UIFont!
switch UIDevice.current.userInterfaceIdiom {
case .pad:
font = UIFont(name: "Helvetica", size: 35)
case .phone:
font = UIFont(name: "Helvetica", size: 50)
default:
font = UIFont(name: "Helvetica", size: 24)
}
let height = heightForLabel(text: text, font: font, width: screenWidth)
return height
}
}
Espero que esto ayude