2017-04-07 1 views
1

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:

enter image description here

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:

enter image description here

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: enter image description here

ich nicht ganz under Warum passiert das?

Antwort

0

Legen Sie 'Beschränkung für führende, abschließende, obere und feste Höhe' in Ihrem Textfeld fest und Ihr Problem wird gelöst! Wenn Sie beide Werte nicht festlegen können, sollten Sie eine feste Breite festlegen.

+0

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

+0

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

+0

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

Verwandte Themen