はじめに
iOS14では機能していたコードがiOS15で突然挙動がおかしくなるバグに遭遇しました。
解決方法が分かる方はコメントください。
条件
- iOS15
- スタイルが
wheel
仕様?バグ?
まず前提として、なぜかPicker
スタイルがwheel
だとframe
だけでサイズ変更する事ができません。
clipped()
を追加する必要があります。
import SwiftUI
struct ContentView: View {
@State var index: Int = 0
var body: some View {
Picker("", selection: $index) {
ForEach(0..<5) { i in
Text("選択肢\(i + 1)")
}
}
.labelsHidden()
.pickerStyle(.wheel)
.frame(width: 150, height: 60)
+ .clipped()
}
}
このようになりました。
「ちゃんとサイズ変更できてるじゃん。」と思うかも知れませんが、これには問題があります
「えぇ、Pickerじゃない所をスクロールしても反応してる!!」
そうなんです。なぜかPickerがリサイズ出来てないんです。
見た目だけ変わっていて機能は元の範囲まであるっていう落とし穴なんですね
解決に向けて試した事
このツイートを発見した時、「おぉ!」と思いました。
clipped()
は見た目だけ変更される仕様だったっぽいです。
じゃあ.contentShape(Rectangle())
を付けたらなおる?と思い試してみました。
気づいたのだけど、.clipped()だと見えていないだけで .onTapGesture() に反応してしまう様です。
— shohe@iOS developer (@ShoheOhtani) July 1, 2022
.contentShape(Rectangle()) を最後につけることでタップもできない様になりました。
Gridで表示する時に隣のセルをタップしてたりしてハマってしまいましたよと。#SwiftUI pic.twitter.com/DR4XQ0TzQX
import SwiftUI
struct ContentView: View {
@State var index: Int = 0
var body: some View {
Picker("", selection: $index) {
ForEach(0..<5) { i in
Text("選択肢\(i + 1)")
}
}
.labelsHidden()
.pickerStyle(.wheel)
.frame(width: 150, height: 60)
.clipped()
+ .contentShape(Rectangle())
}
}
結果は、、、解決せず、、、
先ほどと同じ結果となりました。
似たような内容の記事
おわり
解決方法が分かる方はコメントください。