Gesehen und Favorit direkt an der Kachel — und die Pinch-Geste greift wieder

Drei Dinge aus dem Gebrauch.

**Das Kontextmenü einer Kachel trug genau einen Eintrag.** „Abspielen",
sonst nichts; der Kommentar daneben nannte es seit Längerem den
natürlichen Ort für „Als gesehen markieren". Jetzt steht es dort —
zusammen mit Favorit und Sternen, soweit der Server sie kennt. Es sind
dieselben Einträge wie im Menü der Detailseite: `ItemActionEntries` wird
von beiden benutzt, statt sie zweimal zu beschreiben.

Zwei Dinge daran sind nicht offensichtlich. Der Inhalt eines
Kontextmenüs lebt nur, solange das Menü offen ist — ein `@State` darin
könnte nichts anzeigen, was nach dem Tippen passiert. Ausgeführt wird
deshalb von der Kachel, die länger lebt, und dort hängt auch die
Fehlermeldung. Und danach muss die Seite neu laden: eine abgehakte Folge
gehört nicht mehr in „Weiterschauen", und der Fortschrittsbalken stimmte
sonst nicht mehr. Dafür gibt es `flixyItemChanged` in der Umgebung —
sonst müsste der Rückweg durch jede Zwischenebene gereicht werden.

**Die Pinch-Geste griff fast nie.** Sie hing an der Bildfläche, und über
der liegen die Sprungflächen — und sobald man einmal getippt hat, die
ganze Bedienung. Eine Zwei-Finger-Geste bildet sich aber nur, wenn
**beide** Finger auf der Ansicht landen, die sie trägt; in dem schmalen
Streifen dazwischen gelang das kaum. Sie hängt jetzt als
`simultaneousGesture` am ganzen Player: sie erkennt mit, statt
dazwischenzugehen, und Tippen, Doppeltippen und Scrubber bleiben
unberührt.

Gemessen im Simulator, Querformat auf einem Pro Max, mit einer echten
Zwei-Finger-Geste:

    auseinander   956 × 440 pt, Rand 0,0 / 0,0
    zusammen      782 × 440 pt, Rand 87,0 / 87,0

**Der Drehknopf zeigte ein Telefon.** Das las sich als Zustandsanzeige —
„so liegt es" — statt als Knopf. Zwei Pfeile im Kreis sagen, was
passiert.

iOS und tvOS bauen, 463 Tests grün.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-01 08:19:19 +02:00
co-authored by Claude Opus 5
parent 46b0117984
commit 3f680c7426
6 changed files with 172 additions and 62 deletions
+23 -12
View File
@@ -113,17 +113,6 @@ struct PlayerView: View {
surface(for: model)
.contentShape(.rect)
.onTapGesture { primaryTap() }
// **Auseinander füllt, zusammen passt ein.**
//
// Kein stufenloses Zoomen: es gibt genau zwei
// sinnvolle Zustände, und alles dazwischen
// wäre ein Bild, das weder ganz zu sehen ist
// noch den Schirm füllt. Die Geste wählt also
// aus zweien aus, statt einen Faktor zu
// setzen — und der Schwellenwert liegt bewusst
// weit vom Ruhepunkt weg, damit eine wackelige
// Hand nichts umschaltet.
.gesture(zoomGesture(for: model), including: isMac ? .none : .all)
}
}
@@ -233,6 +222,24 @@ struct PlayerView: View {
}
}
}
// **Auseinander füllt, zusammen passt ein.**
//
// Kein stufenloses Zoomen: es gibt genau zwei sinnvolle Zustände, und
// alles dazwischen wäre ein Bild, das weder ganz zu sehen ist noch den
// Schirm füllt. Die Geste wählt aus zweien aus, statt einen Faktor zu
// setzen — und der Schwellenwert liegt weit vom Ruhepunkt weg, damit
// eine wackelige Hand nichts umschaltet.
//
// **Am ganzen Player, nicht an der Bildfläche.** Dort hing sie bisher
// und griff deshalb fast nie: über dem Bild liegen die Sprungflächen,
// und sobald man einmal getippt hat, die ganze Bedienung. Eine
// Zwei-Finger-Geste bildet sich aber nur, wenn **beide** Finger auf
// der Ansicht landen, die sie trägt — in dem schmalen Streifen
// dazwischen gelang das kaum.
//
// `simultaneousGesture`, damit Tippen, Doppeltippen und der Scrubber
// unberührt bleiben: die Geste erkennt mit, statt dazwischenzugehen.
.simultaneousGesture(zoomGesture(for: model), including: isMac ? .none : .all)
// Immer aus, nicht nur wenn die Bedienelemente ausgeblendet sind.
// Die Uhrzeit über einem laufenden Film hat dort nichts zu suchen —
// und im Querformat erst recht nicht.
@@ -476,7 +483,11 @@ struct PlayerView: View {
OrientationLock.shared.rotate(to: isLandscape ? .portrait : .landscape)
revealControls()
} label: {
Image(systemName: isLandscape ? "iphone" : "iphone.landscape")
// **Ein Symbol für beide Richtungen, nicht zwei.** Das
// Telefon-Symbol zeigte die Lage, in die es ginge — und
// las sich damit als Zustandsanzeige statt als Knopf.
// Zwei Pfeile im Kreis sagen, was passiert: es dreht.
Image(systemName: "arrow.triangle.2.circlepath")
.font(.title3)
.padding(FlixySpacing.snug)
}