UIPickerView und merkwürdiges Scrollverhalten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • UIPickerView und merkwürdiges Scrollverhalten

    Hi,
    seit neuestem (siehe Bild) verhält sich die UIPickerView meiner App beim Scrollen merkwürdig. Der Text des ausgewähltes Objekts ist eindeutig zu weit rechts dargestellt. Ich benutze Big Sur beta 8 und Xcode 12. Vielleicht liegt es ja auch an der Beta von Big Sur.
    Am Code habe ich nichts geändert und vor iOS 14 hat alles funktioniert. Allerdings tritt dieser verschobene Text auch bei iOS 12 und 13 auf.

    Hat jemand eine Idee?
    Bilder
    • NhYjR.jpg

      16,67 kB, 540×417, 21 mal angesehen
  • Nein, der komplette Picker ist in einer UIView. Trailing und Leading zur Superview = 0 und Align Y. Die UIView selbst hat auch Trailing und Leading zur SuperView (View) = 0.

    So ist der Picker im im Code implementiert:

    Quellcode

    1. // MARK: - PICKER
    2. func numberOfComponents(in pickerView: UIPickerView) -> Int { return 2 }
    3. func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    4. return component == 0 ? test1.count : test2.count
    5. }
    6. func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    7. return component == 0 ? test1[row] : test2[row]
    8. }
    9. func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
    10. let pickerLabel = UILabel()
    11. switch component {
    12. case 0 : pickerLabel.text = test1[row]
    13. case 1 : pickerLabel.text = test2[row]
    14. default: break
    15. }
    16. if UIDevice.current.userInterfaceIdiom == .phone {
    17. if UIScreen.main.bounds.height < UIScreen.main.bounds.width {
    18. pickerLabel.font = UIFont(name: "AvenirNext-Medium", size: 21.0)
    19. } else {
    20. pickerLabel.font = UIFont(name: "AvenirNext-Medium", size: 22.0)
    21. }
    22. } else {
    23. pickerLabel.font = UIFont(name: "AvenirNext-Medium", size: 24.0)
    24. }
    25. pickerLabel.adjustsFontSizeToFitWidth = true
    26. pickerLabel.baselineAdjustment = .alignCenters
    27. pickerLabel.textAlignment = .center
    28. pickerLabel.textColor = traitCollection.userInterfaceStyle == .light ? UIColor(named: uiFarbe) : UIColor(named: "black")
    29. return pickerLabel
    30. }
    Alles anzeigen
  • Das "viewForRow" dient ja nur dazu den Text aus dem Array zu lesen und wird nicht gestylt, außer dass ich "AvenirNext-Medium" statt dem System Font benutzte.
    Daran liegt das fehlerhaft Scrollverhalten aber nicht, das habe ich schon gecheckt. Mit "AvenirNext-Medium" ist der Text nur etwas größer als mit dem System Text.

    "width for component" benutze ich nicht. Ich habe 2 Spalten und die sind ja standardmäßig zu 50% verteilt.
  • Das scheint ein Problem mit iOS 14 zu sein. in der Bahn App "DB Navigator" passiert dies nämlich auch.
    Reiseauskunft - Auf Abfahrt tippen - dann ist da eine UIPicker mit der Auswahl: Abfahrt und Ankunft.
    Beim Scrollen verhält sich diese Reihe genauso wie in meiner App - der Texte verschiebt sich nach links.
    Wenn man allerdings die Minuten oder Stunden Reihen scrollt ist alles in Ordnung...sehr merkwürdig-.
  • lololarumpel schrieb:

    in der Bahn App "DB Navigator" passiert dies nämlich auch. Reiseauskunft - Auf Abfahrt tippen - dann ist da eine UIPicker mit der Auswahl: Abfahrt und Ankunft. Beim Scrollen verhält sich diese Reihe genauso wie in meiner App - der Texte verschiebt sich nach links.
    Also zumindest bei der Bahn-App sehe ich da keinen Fehler: Der ausgewählte Text wird grösser angezeigt als die anderen Werte auf dem Wheel. Und mit Apple‘s Versuch, dem Ganze eine Dreidimensionalität zu verleihen, wird Text links vom Fluchtpunkt eben noch weiter nach links verschoben. Vielleicht hat man diesen Effekt mit iOS 14 noch verstärkt, das kann ich gerade nicht prüfen...

    Muss man nicht mögen, aber erscheint mir angesichts der Designsprache korrekt. Kann es sein, dass Deine Picker-Räder weit rechts liegen?

    Mattes

    Edit: Ich konnte das Verhalten auch bei einer meiner Apps zwischen iOS 13 und 14 verifizieren: Ich habe den Eindruck, Apple hat an der Vergrösserung des selektierten Elementes geschraubt, der Effekt wird durch zunehmende Entfernung vom Fluchtpunkt verstärkt. Wohl eher kein Bug ... meines Erachtens aber definitiv kein Feature.
    Diese Seite bleibt aus technischen Gründen unbedruckt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MyMattes () aus folgendem Grund: Effekt bestätigt

  • Definitiv kein Feature.
    wenn ich meine App erneut aus dem App Store lade und unter iOS 14 ausführe hab ich keinerlei Probleme. Der Picker sieht aus und verhält sich wie immer.

    Ich glaube das hat was mit XCode 12 zu tun. Wenn ich die App mit xCode 12 zu TestFlight hochlade macht der Picker komische Sachen und auch eine Animation geht auf einmal nicht mehr. In beiden Fällen ist der Code unverändert.
    Mit Version 11.7 geht alles.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von lololarumpel ()

  • Das fehlerhafte Scrollen ist auch nur ein Teil des Picker Problems. Denn mit iOS 14 gibt es jetzt ja auch einen grauen Balken, der als Hintergrund für das gerade ausgewählte Element fungiert. Durch die Vergrößerung und Verschiebung des Textes wird dieser jetzt aber bei langem Text abgeschnitten angezeigt.

    Quellcode

    1. pickerLabel.adjustsFontSizeToFitWidth
    ... bringt da auch nichts.


    Das war vorher nicht so.

    Ich habe die App erneut mit Xcode 11.7 zu TestFlight geladen und das Problem mit dem abgeschnittenen Text ist behoben und es verhält sich so wie vorher. Das Scrollverhalten ist allerdings immer noch fehlerhaft.
    Übrigens ist dies auch so in der Uhren App - Timer - und jetzt am Stunden oder Sekunden Rädchen drehen. Am Minuten Rädchen ist komischerweise alles in Ordnung.