2011-07-05 6 views
0

私はNavCtrlを持っています。その上にTableView/ctrlを持っていれば、私はscrollviewを持っています。NavCtrl + TableViewCtrl + ScrollView、TableViewが接触しない

私はテーブルビューでCellを押すことができないことを除いて、すべてが機能しています。

私はnextResponderのことを試しましたが、すべてが正しいことをしているようです。ここでは、それはまだ「クリーン」ではありませんので、このコードは:)テストのために多くのことを変更されている心に留めておく、コードの一部抜粋です:


ScrollView *myScrollView = [[ScrollView alloc] initWithFrame:CGRectMake(0, 150, 320, 680)]; 
    myScrollView.contentSize = CGSizeMake(320 , 888); 
    myScrollView.pagingEnabled = NO; 
    myScrollView.bounces = NO; 
    myScrollView.directionalLockEnabled = YES; 
    myScrollView.canCancelContentTouches = NO; 
    myScrollView.delaysContentTouches = NO; 
    myScrollView.scrollEnabled = true; 
    myScrollView.userInteractionEnabled = YES; 
    myScrollView.scrollsToTop = NO; 


    mySettingsTableView = [[SettingsTableView alloc] init]; 

// Settings View Ctrl 
    SettingsTableViewCtrl *mySettingsTableViewCtrl = [[SettingsTableViewCtrl alloc] initWithStyle:UITableViewStyleGrouped]; 
    mySettingsTableViewCtrl.tableView.scrollEnabled = NO; 
mySettingsTableViewCtrl.tableView.delaysContentTouches = NO; 
mySettingsTableViewCtrl.tableView.canCancelContentTouches = NO; 
mySettingsTableViewCtrl.view.userInteractionEnabled = YES; 

[mySettingsTableViewCtrl.view addSubview:myScrollView]; 
[mySettingsTableViewCtrl.view addSubview:mySettingsTableView]; 

* scrollViewのサブクラスで*

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    //if (![self yourMethodThatDeterminesInterestingTouches:touches withEvent:event]) 
    [super touchesBegan:touches withEvent:event]; 
    [self.nextResponder touchesBegan:touches withEvent:event]; 

} 

ここでタッチイベントからのNSLogです:

NSLog(@"Event: %@", event); 
NSLog(@"Event NextResponder : %@\n", self.nextResponder); 


2011-07-05 13:09:36.063 App[1924:14f03] Event: <UITouchesEvent: 0x802ea30> timestamp: 8503.71 touches: {(
    <UITouch: 0x80e6f60> phase: Began tap count: 1 window: <UIWindow: 0x836eb00; frame = (0 0; 320 480); layer = <CALayer: 0x836ebb0>> view: <ScrollView: 0x83770b0; baseClass = UIScrollView; frame = (0 150; 320 680); clipsToBounds = YES; layer = <CALayer: 0x8376e00>; contentOffset: {0, 0}> location in window: {140, 249} previous location in window: {140, 249} location in view: {140, 35} previous location in view: {140, 35} 
)} 

2011-07-05 13:09:36.065 App[1924:14f03] Event NextResponder : <SettingsTableViewCtrl: 0x8377db0> 

+0

なぜスクロールビューをtableviewに追加していますか? – Mahesh

+0

私はそうではありません、私はテーブルビューの上部にスクロールビューを追加しています。基本的に私は、私のtableviewの上にあるdatePickerをスクロールしたいと思います。しかしテストのために、私は現時点ではスクロールビュー内に何も持っていません。 – Darren

+0

一時的にSettingsTableViewCtrlにスクロールビューを追加せずにチェックします。 – Mahesh

答えて

0

完璧な、私が終わったものではないのですが、まだ働いて、任意のチューニング・アドバイスをいただければ幸いです......

//AppDelegate.m

ScrollView *myScrollView = [[ScrollView alloc] initWithFrame:CGRectMake(0, 140, 320, 680)]; 
myScrollView.contentSize = CGSizeMake(320 , 888); 
myScrollView.pagingEnabled = NO; 
myScrollView.bounces = NO; 
myScrollView.directionalLockEnabled = YES; 
myScrollView.canCancelContentTouches = NO; 
myScrollView.delaysContentTouches = NO; 
myScrollView.scrollEnabled = true; 
myScrollView.userInteractionEnabled = YES; 
myScrollView.scrollsToTop = NO; 

mySettingsTableViewCtrl = [[SettingsTableViewCtrl alloc] initWithStyle:UITableViewStyleGrouped]; 
mySettingsTableViewCtrl.tableView.scrollEnabled = NO; 
mySettingsTableViewCtrl.tableView.delaysContentTouches = NO; 
mySettingsTableViewCtrl.tableView.canCancelContentTouches = NO; 
mySettingsTableViewCtrl.view.userInteractionEnabled = YES; 

[mySettingsTableViewCtrl.view addSubview:myScrollView]; 
[mySettingsTableViewCtrl.view addSubview:mySettingsTableView]; 

// ScrollView .M

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
[super touchesBegan:touches withEvent:event]; 
[self.nextResponder touchesBegan:touches withEvent:event]; 

}

//SettingsTableView.m

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

UITouch *touch = [touches anyObject]; 
NSUInteger tapCount = [touch tapCount]; 
CGPoint location = [touch locationInView:self]; 

NSIndexPath *indexPathAtHitPoint = [self indexPathForRowAtPoint:location]; 
if ([self cellForRowAtIndexPath:indexPathAtHitPoint]) { 
    [self.delegate tableView:self didSelectRowAtIndexPath:indexPathAtHitPoint];  
} else { 
    [super touchesBegan:touches withEvent:event]; 
} 
} 
は今、私はscrollviewとその作業の上に日付ピッカーを持っていますが、このコードは、ピッカーがときにありませんが、「触れる」とされたときを検出、すなわち、それを管理するためにいくつかの追加のコードを必要とします。私はそれがあなたの目的のためにScrollViewを使用するようにやり過ぎかもしれないと思うの助けとコメントの

おかげで、

D

0

私は私のコードと同じ問題を抱えている、と私はタッチを処理したい先のビューにUITapGestureRecognizerを追加することによって、それを解決しました。 UITapGestureRecognizerをスクロールビューに追加する必要があります。スクロールビューでタッチを処理する場合は、UITapGestureRecognizerを追加する必要があります。

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedScrollView)]; 
[tapRecognizer setNumberOfTapsRequired:1]; 
[myScrollView addGestureRecognizer:tapRecognizer]; 
[tapRecognizer release]; 

あなたがしたいことは、次のような方法で行う必要があります。

- (無効)tappedScrollView {
// TO-DOスクロールビューをタッチした後、それをここに何したいです。 }

同様に、テーブルビューでは次のようにすることができます。

UITapGestureRecognizer *tapRecognizerForTableView = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedTableView)]; 
[tapRecognizerForTableView setNumberOfTapsRequired:1]; 
[mySettingsTableView addGestureRecognizer:tapRecognizerForTableView]; 
[tapRecognizerForTableView release]; 

あなたがしたいことは、次のような方法で行う必要があります。

- (void)tappedTableView { //テーブルビューをタッチした後に必要なものをここで実行します。 ここ}

+0

ありがとう、私は後でテストしますが、それがなぜ機能しないのか説明できますか? NSLOGから見ると、nextResponderは実際にはTableViewであるため、タッチイベントを適切な場所に渡すように見えます。それだけでそれを取得していない? – Darren

+0

こんにちはすべて、 UITapGestureRecognizerは(ファッションで)動作しますが、スクロールビューがレスポンダチェーンまでのイベントを渡さない理由を説明していません。何か案は? NSLOGから、イベントがtableviewとtableviewctrlの両方で表示されることがわかりました。私はUITableViewCellをサブクラス化しようとしましたが、scrollviewが関わっているときにイベント/ touchは表示されません。スクロールビューが表示されていない場合は、タッチが表示されます。 お返事ありがとうございます。 D – Darren

0

;しかし、それは(私が思うに)あまりにも難しいことではありません。任意のビューを「スクロール」することができます。それを部分的に配置するか、またはすべてが境界にないように配置し、親ビューでクリッピングモードを設定し、それを「スクロール」したいときは、そのフレームをインバリッドに変更します。つまり、日付に関連付けられたテーブルに項目を追加するなど、他のイベントに応答してDatePickerをスクロールしている場合です。ユーザーが日付ピッカーをドラッグしてスクロールしてから続けます。

テーブルビューはスクロールビューなので、スクロールビューとテーブルビューを組み合わせるのは難しいでしょう。スクロールジェスチャーを処理する必要があるのはあいまいです。可能かもしれませんが、おそらくあいまいさを明示的にするために余分なコードを書く必要があります。

+1

私は実際に元々説明したように、実際に動作しています。基本的に私はそれを自動的にスクロールしていませんでした、私はユーザーが指でそれを使ってやりたいと思っていました。私は完全に働いています。 – Darren

関連する問題