上記の答えはどちらも非常に有用だったが、私はUIScrollViewの内にネストUIPickerViewを持っています。私はまた、GUIが存在する間、画面上のどこかで連続レンダリングを行っています。問題は、UIPickerViewが完全に更新されないことです。選択されていない行をタップしたり、ピッカーを移動して2つの行が選択範囲を跨いだり、行がドラッグされてもUIPickerViewの外にスライドしたりします。その後、UIScrollViewが移動されてからピッカーが即時に更新されるまではありません。この結果は醜いです。
問題が原因です:私の継続的なレンダリングは、UIPickerViewのアニメーションがCPUサイクルを終了してから、正しい現在の選択を表示しないようにしていました。私の解決策 - これはうまくいきました - UIPickerViewのtouchesEnded:withEvent:
では、レンダリングを一時停止するために何かを実行します。 SubUIPickerView.h、その後、
#import "SubUIPickerView.h"
@implementation SubUIPickerView
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
[pickerTable touchesBegan:touches withEvent:event];
}
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
[pickerTable touchesMoved:touches withEvent:event];
}
- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
[singleton set_secondsPauseRendering:0.5f]; // <-- my code to pause rendering
[pickerTable touchesEnded:touches withEvent:event];
}
- (void) touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
{
[pickerTable touchesCancelled:touches withEvent:event];
}
- (UIView*) hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
if (CGRectContainsPoint(self.bounds, point))
{
if (pickerTable == nil)
{
int nSubviews = self.subviews.count;
for (int i = 0; i < nSubviews; ++i)
{
UIView* view = (UIView*) [self.subviews objectAtIndex:i];
if ([view isKindOfClass:NSClassFromString(@"UIPickerTable")])
{
pickerTable = (UIPickerTable*) view;
break;
}
}
}
return self; // i.e., *WE* will respond to the hit and pass it to UIPickerTable, above.
}
return [super hitTest:point withEvent:event];
}
@end
とヘッダ::ここでは、コードです
@class UIPickerTable;
@interface SubUIPickerView : UIPickerView
{
UIPickerTable* pickerTable;
}
@end
私が言ったように、この作品。UIPickerViewアニメーションを終了させるために、レンダリングがさらに1/2秒間停止します(UIScrollViewをスライドすると既に一時停止しています)。 NSClassFromString()を使用すると、文書化されていないAPIを使用していないことを意味します。レスポンダーチェーンを盗むことは必要ありませんでした。 checccoとTylerc230のおかげで私自身の解決策が生まれました。
おかげで働いていたNOに親ビューの設定canCancelContentTouchesとdelaysContentTouches、:) – ArunGJ
このコードは、タッチがすぐピッカーホイールを囲む枠の上に発生した場合を除いて、動作しているようです。そうすることで、getNextResponderView:withEvent:メソッドの呼び出しが無限ループするようです。 – pistachionut
私はgetNextResponderViewからのhitTestViewの代わりにnilを返すことによってそれを防ぐ:withEvent:私は周りの車輪に触れた場合。 – ArunGJ