Stillstand ohne Absicht ist kein Pausieren
`timeControlStatus` meldet zwei verschiedene Dinge als `.paused`: das Anhalten durch den Nutzer und den Fall, dass `play()` gerufen wurde, der Player aber nicht losläuft — weil die Quelle nicht bereit ist oder weil nichts ankommt. Die Engine hat beides als „pausiert" weitergegeben. Sichtbar war das als Player mit Abspieldreieck und Scrubber auf 0:00, während in Wahrheit auf Daten gewartet wurde. Wer dann tippte, drückte auf Play bei etwas, das längst laufen sollte. Die Engine führt jetzt mit, ob überhaupt jemand spielen wollte. Stillstand mit Absicht ist Pause, Stillstand ohne Absicht ist Warten. Dazu die Anzeigeregel, wie gewünscht: **der Kreisel gilt immer**, mit oder ohne eingeblendete Bedienung. Er ist keine Verzierung der Knöpfe, sondern die Auskunft „es kommt gleich weiter" — und die braucht man gerade dann, wenn nichts eingeblendet ist und man vor einem stehenden Bild sitzt. Das Play-Pause-Symbol erscheint dagegen nur mit der übrigen Bedienung, und an seiner Stelle bleibt beim Laden eine Lücke, damit der Kreisel hindurchscheint statt zwei Anzeigen übereinanderzulegen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
baa542690c
commit
ab597ee2f0
@@ -86,14 +86,17 @@ struct PlayerView: View {
|
||||
failure(message: message)
|
||||
|
||||
case .playing:
|
||||
// Wartet auf Daten: ohne Anzeige sieht das aus wie ein
|
||||
// Standbild, und man weiß nicht, ob noch etwas kommt.
|
||||
// **Der Kreisel gilt immer**, mit oder ohne
|
||||
// Bedienelemente.
|
||||
//
|
||||
// Nur, solange die Bedienelemente aus sind. Sind sie
|
||||
// an, steht der Kreisel **im** Abspielknopf — dort, wo
|
||||
// sonst das Symbol ist. Vorher lag er dahinter und das
|
||||
// Dreieck davor: es sah pausiert aus, war es nicht.
|
||||
if model.isBuffering && !showsControls {
|
||||
// Er ist keine Verzierung der Bedienung, sondern die
|
||||
// Auskunft „es kommt gleich weiter" — und die braucht
|
||||
// man gerade dann, wenn man nichts eingeblendet hat
|
||||
// und vor einem stehenden Bild sitzt. Die Knöpfe
|
||||
// darüber lassen an seiner Stelle Platz, damit er
|
||||
// hindurchscheint und nicht zwei Anzeigen
|
||||
// übereinanderliegen.
|
||||
if model.isBuffering {
|
||||
ProgressView()
|
||||
.tint(.white)
|
||||
.scaleEffect(1.4)
|
||||
@@ -368,19 +371,21 @@ struct PlayerView: View {
|
||||
scheduleControlsHide()
|
||||
} label: {
|
||||
ZStack {
|
||||
// Solange auf Daten gewartet wird, steht hier der Kreisel
|
||||
// — kein Dreieck. Ein Dreieck heißt „angehalten, tipp
|
||||
// mich", und beides stimmte nicht: es lief bereits, und
|
||||
// der Tipp bewirkte nichts.
|
||||
// Solange auf Daten gewartet wird, steht hier **nichts**.
|
||||
//
|
||||
// Kein Dreieck: das hieße „angehalten, tipp mich", und
|
||||
// beides stimmt nicht. Aber auch kein zweiter Kreisel —
|
||||
// der eine liegt schon darunter und scheint durch diese
|
||||
// Lücke hindurch. Die Fläche bleibt tippbar, damit man
|
||||
// ein endloses Laden auch anhalten kann.
|
||||
if model.isBuffering {
|
||||
ProgressView()
|
||||
.tint(.white)
|
||||
.scaleEffect(1.4)
|
||||
Color.clear
|
||||
} else {
|
||||
Image(systemName: model.isPlaying ? "pause.fill" : "play.fill")
|
||||
.font(.system(size: 52))
|
||||
}
|
||||
}
|
||||
.contentShape(.rect)
|
||||
// Feste Größe, damit die beiden Knöpfe daneben stehen
|
||||
// bleiben. Sie wanderten bisher bei jedem Wechsel ein Stück,
|
||||
// weil Dreieck und Doppelbalken verschieden breit sind.
|
||||
|
||||
Reference in New Issue
Block a user