私の問題は、この問題のスーパーセットだった - 私はUITableViewCells内UISlidersを持っているし、全体のUITableViewはUIScrollViewの内部ページです。スライダーは他の2つとのやりとりに混乱を招き、サブクラス化の解決策は機能しませんでした。ここで私が思いついたのは素晴らしいことです:スライダが移動し、この間にUITableViewとUIScrollViewのdisableScrollingをオンにしたときに通知を送信します。下の図では、スライダは水平、テーブルビューは垂直、UIScrollViewは水平ページを示しています。
のUITableViewCellは、プログラムが作成したスライダーのイベントを拾っ
:このチュートリアルの目的のために
self.numberSlider = [[UISlider alloc] init];
[self.numberSlider addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];
[self.numberSlider addTarget:self action:@selector(sliderTouchDown:) forControlEvents:UIControlEventTouchDown];
[self.numberSlider addTarget:self action:@selector(sliderTouchUp:) forControlEvents:UIControlEventTouchUpInside];
[self.numberSlider addTarget:self action:@selector(sliderTouchUp:) forControlEvents:UIControlEventTouchUpOutside];
は、我々は唯一のタッチダウンとアップを気:
- (void)sliderTouchDown:(UISlider *)sender
{
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFY_SLIDER_TOUCH_BEGAN object:nil];
}
- (void)sliderTouchUp:(UISlider *)sender
{
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFY_SLIDER_TOUCH_ENDED object:nil];
}
ここでは、これらの通知を両方のUITableViewで捕捉しています(tableviewはVC内にありますが、サブクラassed):
- (void)viewDidLoad
{
// other stuff
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sliderTouchDown:) name:NOTIFY_SLIDER_TOUCH_BEGAN object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sliderTouchUp:) name:NOTIFY_SLIDER_TOUCH_ENDED object:nil];
}
- (void)sliderTouchDown:(NSNotification *)notify
{
self.treatmentTableView.scrollEnabled = NO;
}
- (void)sliderTouchUp:(NSNotification *)notify
{
self.treatmentTableView.scrollEnabled = YES;
}
とVCで囲まれた上記と同じUIScrollViewの(、):
- (void)viewDidLoad
{
// other stuff
// Register for slider notifications
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(disableScrolling:) name:NOTIFY_SLIDER_TOUCH_BEGAN object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enableScrolling:) name:NOTIFY_SLIDER_TOUCH_ENDED object:nil];
}
- (void)disableScrolling:(NSNotification *)notify
{
self.scrollView.scrollEnabled = NO;
}
- (void)enableScrolling:(NSNotification *)notify
{
self.scrollView.scrollEnabled = YES;
}
私はもっとエレガントな解決策を聞いてみたいが、これは間違いなく仕事を取得します。スライダを使用すると、テーブルとスクロールビューは停止し、スライダの外側をクリックすると、テーブルビューとスクロールビューが期待どおりに移動します。また、このソリューションでは、3つのコンポーネントすべてのサブクラス化されていないインスタンスを使用できます。これが誰かを助けることを願って!
ありがとうございました。しかし、別の奇妙なことに...この振る舞いはシミュレータ上でのみ現れたようです。私はデバイス上でそれを得た後、それは修正なしで正常に働いた。 – MarkPowell
面白いのは、テスト用のシミュレータだけに頼らない別の理由... – BoltClock
FWIW、私はシミュレータ(iOS 6)とデバイス(iOS 5.1)の両方で同じ問題が発生していることを確認しています。私はスライダーをドラッグする前に瞬間をタップして保持する必要があります。そうでなければ、スクロールビューのドラッグを取得します。 –