Miniplayer: antippen vergrößert wieder
Die Kachel ließ sich nicht mehr öffnen, und das war kein Zufall: das Antippen zeigte erst die Bedienelemente, und die zweite Berührung sollte vergrößern — traf dabei aber den Abspielknopf, der genau in der Mitte lag. Jede weitere Berührung landete wieder dort. Vergrößern war damit überhaupt nicht möglich. Jetzt gehört die Mitte dem Vergrößern, und zwar beim ersten Antippen. Die zwei Knöpfe — Pause und Schließen — sitzen dauerhaft sichtbar in den oberen Ecken, auf einer dunklen Scheibe, damit sie auf hellen Filmbildern nicht verschwinden. Unten bleibt der Fortschrittsbalken. Dass die Kachel „einfach weg" war, konnte ich nicht nachstellen; der eine Fall, den ich reproduziert habe, war mein eigener Attrappenserver mit einer Fortsetzungsstelle jenseits des Dateiendes. Zwei Dinge machen es trotzdem unwahrscheinlicher: die Knöpfe sind auch dann zu sehen, wenn das Bild schwarz bliebe — vorher war eine schwarze Kachel in einer fast schwarzen Oberfläche praktisch unsichtbar —, und die Bildfläche hängt jetzt in einer eigenen Hülle je Ansicht. Beim Wechsel zwischen Kachel und Vollbild gibt es beide kurz gleichzeitig, und eine `UIView` hat nur einen Vorgesetzten: wer sie zuletzt bekommt, gewinnt. Gab SwiftUI sie unmittelbar heraus, konnte das Abräumen der einen der anderen die Bildfläche wegnehmen. Dazu etwas, das mir beim Ausprobieren selbst passiert ist: der Aufmacher wanderte weiter, während ich nach „Abspielen" griff, und ich startete den falschen Film. Er hört jetzt bei der ersten Berührung auf zu wandern. Wer die Hand darauf hat, fährt selbst. Nachgesehen auf iPhone und iPad: verkleinern, antippen, wieder im Vollbild. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
fb418c842d
commit
5763d866bf
@@ -22,6 +22,14 @@ struct HeroCarousel: View {
|
||||
private static let dwell: Duration = .seconds(7)
|
||||
|
||||
@State private var index = 0
|
||||
/// Ob noch von selbst weitergewandert wird.
|
||||
///
|
||||
/// Sobald jemand die Fläche berührt, hört es auf — und zwar für gut. Wer
|
||||
/// hier die Hand hat, fährt selbst. Andernfalls rutscht der Aufmacher
|
||||
/// genau in der Sekunde weiter, in der man nach „Abspielen" greift, und
|
||||
/// man startet den falschen Film. Das ist mir beim Ausprobieren selbst
|
||||
/// passiert.
|
||||
@State private var isAdvancing = true
|
||||
/// Bewegung, die von selbst losgeht, ist für manche Menschen unangenehm
|
||||
/// bis unbrauchbar. Wer sie abgestellt hat, blättert von Hand.
|
||||
@Environment(\.accessibilityReduceMotion) private var reduceMotion
|
||||
@@ -40,6 +48,12 @@ struct HeroCarousel: View {
|
||||
// den Knöpfen. Die Höhe kommt aus dem Seitenverhältnis, weil ein
|
||||
// TabView sonst nimmt, was es kriegen kann.
|
||||
.aspectRatio(FlixyAspectRatio.hero, contentMode: .fit)
|
||||
// Gleichzeitig und ohne Mindestweg: fängt jede Berührung ab, ohne
|
||||
// dem Blättern des TabView oder den Knöpfen darin etwas
|
||||
// wegzunehmen.
|
||||
.simultaneousGesture(
|
||||
DragGesture(minimumDistance: 0).onChanged { _ in isAdvancing = false }
|
||||
)
|
||||
|
||||
if items.count > 1 { indicator }
|
||||
}
|
||||
@@ -64,7 +78,7 @@ struct HeroCarousel: View {
|
||||
}
|
||||
|
||||
private func advance() async {
|
||||
guard items.count > 1, !reduceMotion else { return }
|
||||
guard items.count > 1, !reduceMotion, isAdvancing else { return }
|
||||
try? await Task.sleep(for: Self.dwell)
|
||||
guard !Task.isCancelled else { return }
|
||||
withAnimation(.easeInOut(duration: 0.5)) {
|
||||
|
||||
Reference in New Issue
Block a user