Open tas5521 opened 4 months ago
書きかけのPRです。 このPRを書いている途中に別の問題に気がつきました。 また、別の解決法にも気がつきました。 しかし、消すのも勿体無いので、残しておきます。
close #123
UIView.appearance().isExclusiveTouchをtrueもしくはfalseに切り替えるタイミングを管理して、StudyViewでのみ、複数のViewを同時に操作できなくします。
UIView.appearance().isExclusiveTouch
true
false
学習中画面で、最後の問題の結果を指定する際(まるボタン、もしくは、ばつボタンを押す際)、両方のボタンを同時に押して結果画面に移行すると、右上の「終了ボタン」を押した後に、想定しない画面が表示されてしまうため。
UIView.appearance().isExclusiveTouchの使用方法に若干クセがあります。 UIView.appearance().isExclusiveTouch = falseになっている時に生成したViewは複数のViewPartsを同時にタップすることが可能であり、UIView.appearance().isExclusiveTouch = trueになっている時に生成したViewは複数のViewPartsを同時にタップすることが不可能です。 つまり、UIView.appearance().isExclusiveTouch = falseになっている時に生成したViewは複数のViewPartsを同時にタップすることが可能ですが、そのView内で後からUIView.appearance().isExclusiveTouch = trueに変更しても、そのViewの生成の瞬間はUIView.appearance().isExclusiveTouch = falseであったため、後から複数のViewPartsを同時にタップすることが不可能にはなりません。 今回、これらを.onAppearと.onDisappearで処理しています。そのため、.onAppearのタイミングと.onDisappearの発火のタイミングに気をつけ、次のViewが生成するときにUIView.appearance().isExclusiveTouchがtrueとfalseのどちらになっているかになければいけません。
UIView.appearance().isExclusiveTouch = false
UIView.appearance().isExclusiveTouch = true
.onAppear
.onDisappear
複数のViewを同時にタッチすることを可能にするメソッドwillAllowViewsToBeTouchedAtTheSameTimeを作成しました。メソッドにする必要はなかったかもしれませんが、UIView.appearance().isExclusiveTouch = falseと書くよりは何をしたいのかがメソッド名から伝わるのではないかと思い、メソッドにして名前をつけています。 https://github.com/CodeCandySchool/MedicineNameQuiz_Sagae/blob/33ef4c085ff1c5a5c173dfd26570ffbff62d0ee9/MedicineNameQuiz_Sagae/View/Study/ModeSelectionView.swift#L169-L174 .onDisappearで、発火します。これは、ModeSelectionViewが次のView(StudyView)に遷移した後に発火し、その次に生成するView(ModeSelectionViewもしくはResultView)で複数のViewPartsを同時にタッチすることを可能にするための準備をするためです。 https://github.com/CodeCandySchool/MedicineNameQuiz_Sagae/blob/33ef4c085ff1c5a5c173dfd26570ffbff62d0ee9/MedicineNameQuiz_Sagae/View/Study/ModeSelectionView.swift#L155-L161
willAllowViewsToBeTouchedAtTheSameTime
複数のViewを同時にタッチすることを不可能にするメソッドwillPreventTouchingViewsAtTheSameTimeを作成しました。 https://github.com/CodeCandySchool/MedicineNameQuiz_Sagae/blob/33ef4c085ff1c5a5c173dfd26570ffbff62d0ee9/MedicineNameQuiz_Sagae/View/Study/StudyView.swift#L316-L322 .onAppearで発火し、StudyViewの生成の瞬間に複数のViewを同時にタッチすることを不可能にします。 https://github.com/CodeCandySchool/MedicineNameQuiz_Sagae/blob/33ef4c085ff1c5a5c173dfd26570ffbff62d0ee9/MedicineNameQuiz_Sagae/View/Study/StudyView.swift#L119-L124 .onDisappearでも発火し、StudyViewの次のView(ModeSelectionViewもしくはResultView)に遷移した後に、その次に生成するViewの複数のViewPartsを同時にタッチすることを不可能にします。 https://github.com/CodeCandySchool/MedicineNameQuiz_Sagae/blob/33ef4c085ff1c5a5c173dfd26570ffbff62d0ee9/MedicineNameQuiz_Sagae/View/Study/StudyView.swift#L125-L133
willPreventTouchingViewsAtTheSameTime
指2本で同時にタップするため、実機でテストしてください。
まず、モード選択画面の複数のViewが同時に操作できることを確認してください。(動画では、二つのPickerを同時に操作して確認しています。)
スタートボタンで学習を開始し、まるボタンとばつボタンが同時に押せなくなっていることを確認してください。(動画では、まるボタンをホールドしながら、ばつボタンをタップしていますが、ばつボタンの方は反応していません。)
Backボタンでモード選択画面に戻って、モード選択画面の複数のViewが同時に操作できることを確認してください。これは、学習中画面に移動した際に、複数のViewを同時にタップできなくした変更が、モード選択画面に戻った時には解除されていることの確認です。
再び、スタートボタンで学習を開始し、まるボタンとばつボタンが同時に押せなくなっていることを確認しながら、結果表示画面に移動してください。結果表示画面で、結果リストなどをホールドしながら、Backボタンを押せることを確認してください。これは、学習中画面に移動した際に、複数のViewを同時にタップできなくした変更が、結果表示画面に進んだ時には解除されていることの確認です。
再び、学習中画面ではまるボタンとばつボタンが同時に押せなくなっていることを確認しながら、結果表示画面に移動してください。結果表示画面で、結果リストなどをホールドしながら、右上の「終了」ボタンを押せることを確認してください。これは、学習中画面に移動した際に、複数のViewを同時にタップできなくした変更が、結果表示画面に進んだ時には解除されていることの確認です。さらに、モード選択画面で、モード選択画面の複数のViewが同時に操作できることを確認してください。
上記を確認しました。
書きかけのPRです。 このPRを書いている途中に別の問題に気がつきました。 また、別の解決法にも気がつきました。 しかし、消すのも勿体無いので、残しておきます。
関連Issue番号
close #123
追加・変更の概要
UIView.appearance().isExclusiveTouch
をtrue
もしくはfalse
に切り替えるタイミングを管理して、StudyViewでのみ、複数のViewを同時に操作できなくします。変更の目的
学習中画面で、最後の問題の結果を指定する際(まるボタン、もしくは、ばつボタンを押す際)、両方のボタンを同時に押して結果画面に移行すると、右上の「終了ボタン」を押した後に、想定しない画面が表示されてしまうため。
タスクの進捗状況
UIView.appearance().isExclusiveTouch
をtrue
もしくはfalse
に切り替えるタイミングを管理して、StudyViewでのみ、複数のViewを同時に操作できなくします。変更内容
UIView.appearance().isExclusiveTouch
の使用方法に若干クセがあります。UIView.appearance().isExclusiveTouch = false
になっている時に生成したViewは複数のViewPartsを同時にタップすることが可能であり、UIView.appearance().isExclusiveTouch = true
になっている時に生成したViewは複数のViewPartsを同時にタップすることが不可能です。 つまり、UIView.appearance().isExclusiveTouch = false
になっている時に生成したViewは複数のViewPartsを同時にタップすることが可能ですが、そのView内で後からUIView.appearance().isExclusiveTouch = true
に変更しても、そのViewの生成の瞬間はUIView.appearance().isExclusiveTouch = false
であったため、後から複数のViewPartsを同時にタップすることが不可能にはなりません。 今回、これらを.onAppear
と.onDisappear
で処理しています。そのため、.onAppear
のタイミングと.onDisappear
の発火のタイミングに気をつけ、次のViewが生成するときにUIView.appearance().isExclusiveTouchがtrue
とfalse
のどちらになっているかになければいけません。ModeSelectionViewの変更
複数のViewを同時にタッチすることを可能にするメソッド
willAllowViewsToBeTouchedAtTheSameTime
を作成しました。メソッドにする必要はなかったかもしれませんが、UIView.appearance().isExclusiveTouch = false
と書くよりは何をしたいのかがメソッド名から伝わるのではないかと思い、メソッドにして名前をつけています。 https://github.com/CodeCandySchool/MedicineNameQuiz_Sagae/blob/33ef4c085ff1c5a5c173dfd26570ffbff62d0ee9/MedicineNameQuiz_Sagae/View/Study/ModeSelectionView.swift#L169-L174.onDisappear
で、発火します。これは、ModeSelectionViewが次のView(StudyView)に遷移した後に発火し、その次に生成するView(ModeSelectionViewもしくはResultView)で複数のViewPartsを同時にタッチすることを可能にするための準備をするためです。 https://github.com/CodeCandySchool/MedicineNameQuiz_Sagae/blob/33ef4c085ff1c5a5c173dfd26570ffbff62d0ee9/MedicineNameQuiz_Sagae/View/Study/ModeSelectionView.swift#L155-L161StudyViewの変更
複数のViewを同時にタッチすることを不可能にするメソッド
willPreventTouchingViewsAtTheSameTime
を作成しました。 https://github.com/CodeCandySchool/MedicineNameQuiz_Sagae/blob/33ef4c085ff1c5a5c173dfd26570ffbff62d0ee9/MedicineNameQuiz_Sagae/View/Study/StudyView.swift#L316-L322.onAppear
で発火し、StudyViewの生成の瞬間に複数のViewを同時にタッチすることを不可能にします。 https://github.com/CodeCandySchool/MedicineNameQuiz_Sagae/blob/33ef4c085ff1c5a5c173dfd26570ffbff62d0ee9/MedicineNameQuiz_Sagae/View/Study/StudyView.swift#L119-L124.onDisappear
でも発火し、StudyViewの次のView(ModeSelectionViewもしくはResultView)に遷移した後に、その次に生成するViewの複数のViewPartsを同時にタッチすることを不可能にします。 https://github.com/CodeCandySchool/MedicineNameQuiz_Sagae/blob/33ef4c085ff1c5a5c173dfd26570ffbff62d0ee9/MedicineNameQuiz_Sagae/View/Study/StudyView.swift#L125-L133影響範囲
操作方法
指2本で同時にタップするため、実機でテストしてください。
まず、モード選択画面の複数のViewが同時に操作できることを確認してください。(動画では、二つのPickerを同時に操作して確認しています。)
スタートボタンで学習を開始し、まるボタンとばつボタンが同時に押せなくなっていることを確認してください。(動画では、まるボタンをホールドしながら、ばつボタンをタップしていますが、ばつボタンの方は反応していません。)
Backボタンでモード選択画面に戻って、モード選択画面の複数のViewが同時に操作できることを確認してください。これは、学習中画面に移動した際に、複数のViewを同時にタップできなくした変更が、モード選択画面に戻った時には解除されていることの確認です。
再び、スタートボタンで学習を開始し、まるボタンとばつボタンが同時に押せなくなっていることを確認しながら、結果表示画面に移動してください。結果表示画面で、結果リストなどをホールドしながら、Backボタンを押せることを確認してください。これは、学習中画面に移動した際に、複数のViewを同時にタップできなくした変更が、結果表示画面に進んだ時には解除されていることの確認です。
再び、学習中画面ではまるボタンとばつボタンが同時に押せなくなっていることを確認しながら、結果表示画面に移動してください。結果表示画面で、結果リストなどをホールドしながら、右上の「終了」ボタンを押せることを確認してください。これは、学習中画面に移動した際に、複数のViewを同時にタップできなくした変更が、結果表示画面に進んだ時には解除されていることの確認です。さらに、モード選択画面で、モード選択画面の複数のViewが同時に操作できることを確認してください。
テストしたこと
上記を確認しました。
相談事項