Ich bin nicht sicher, warum das passiert, aber im Grunde habe ich eine statische Zelle, die aus einer UITextField
besteht. Die inputView
ist eine UIPickerView
und ihre ist eine UIToolBar
.UITextField passt die Breite nicht automatisch an den Inhalt an, bis resignFirstResponder aufgerufen wird?
Ich habe es etwa so:
var repeat_ARRAY: [String] = []
override func viewDidLoad()
{
super.viewDidLoad()
repeat_ARRAY.append("No Cycle")
repeat_ARRAY.append("Semi-Monthly")
toolBar.barStyle = UIBarStyle.default
toolBar.isTranslucent = true
toolBar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(ViewController.dismissPicker(_:)))
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
toolBar.setItems([spaceButton, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
createCell()
}
func numberOfComponents(in pickerView: UIPickerView) -> Int
{
return 1
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
{
return repeat_ARRAY[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
textField.text = repeat_ARRAY[row]
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
return repeat_ARRAY.count
}
func dismissPicker(_ sender: UIBarButtonItem)
{
textField.resignFirstResponder()
}
func createCell()
{
textField.text = "No Cycle"
textField.delegate = self
let pickerView: UIPickerView = UIPickerView()
pickerView.delegate = self
pickerView.dataSource = self
textField.inputView = pickerView
textField.inputAccessoryView = toolBar
}
Und das ist, wie es in Storyboard eingerichtet ist:
Wenn die Viewcontroller anfänglich geladen wird, der textField.text
Wert ist Nein Zyklus, der passt gut. Allerdings, wenn ich die UIPickerView
blättern, um die zweite Zeile auszuwählen, dh Halbmonat, wird der Text abgeschnittene etwa so:
Es ist nicht, bis ich die getroffen GeschehenUIBarButtonItem
anrufen textField.resignFirstResponder
, die die Breite des textField
automatisch den Inhalt des Strings Halbmonats wie so passen exands:
ich nicht ganz under Warum passiert das?
Wenn Sie jedoch eine feste Breite einstellen, wird das Textfeld seine Breite nicht automatisch basierend auf dem Inhalt des Textes anpassen. Ich möchte nicht, dass das Textfeld viel Platz in der Breite einnimmt, wenn es nicht nötig ist. Ich dachte, das war der Sinn, eine Breite niedriger als die horizontale Umarmungspriorität zu setzen? Ich versuche dies mit Auto-Layout zu erreichen, weil ich am linken Rand der Zelle 'UILabel' habe, die auch viel Platz einnehmen kann. – Pangu
Sie können auch die minimale Schriftgröße oder -größe festlegen. Wenn der Text also eine große Zeichenfolge ist, wird die Schriftgröße so verkleinert, dass sie in die Bezeichnung passt. Wenn es für Sie angemessen ist! Zweite Sache in Ihrem aktuellen Ansatz, den Sie in Frage gestellt haben, rufen Sie layoutifneeded oder layoutsubviews in Ihrer Didselectrow-Methode des Pickers. – Lion
Meine Anforderung ist es, die Schriftgröße gleich zu halten, nicht skalieren, wenn der Text eine große Zeichenfolge ist. Wie bereits erwähnt, dachte ich, dass dies mit der "Hugging Priority" behoben wurde. – Pangu