2013-05-20 15 views
17

ビューの私の構造にする場合、それは動作しません:UIButtonはUIScrollViewの

UITableView 
    UITableViewCell 
    UIScrollView 
     CustomView 
     UIButton 

問題は、私はそれに触れたときに動作しませんUIButtonです。 私はコードでそれを作成します。

btn = [[UIButton alloc] init]; 
[btn setImage:image forState:UIControlStateNormal]; 
[btn addTarget:self action:@selector(tileTouchUpInside) forControlEvents:UIControlEventTouchUpInside]; 
btn.layer.zPosition = 1; 
[self addSubview:btn]; 

は、私もこれを追加しました:

scroll.delaysContentTouches = NO; 
scroll.canCancelContentTouches = NO; 

しかし、私のボタンはとにかく動作しません。私はそれを設定すると、UITableViewは垂直方向にスクロールを停止するので、私はcancelContentTouchesまたはUITableViewの遅延を設定することはできません。

ありがとうございました!

+0

'tileTouchUpInside'メソッドを実装しましたか? –

+2

CustomViewのuserInteractionEnabledはYESですか? –

+0

@AhmedZ。 - 確かに – George

答えて

19

あなたがそのメッセージを取得していない場合は、

- (BOOL)touchesShouldCancelInContentView:(UIView *)view { 
    return NO; 
} 

とUIScrollViewのサブクラスを作成しない設定:

scrollView.delaysContentTouches = NO; 

問題は、デフォルトでは方法のためtouchesShouldCancelInContentView振る舞いで、それが唯一のNOを返しますサブビューがUIControlだが、あなたのボタンがCustomView内に隠れていて、そうでない場合。

+3

また、 IBの「コンテンツの接触を遅らせる」オプションをオフにします。これは私のためのトリックでした。 – jowie

+4

スクロール表示がスクロールを停止しました – Yaman

3

ボタンフレームを設定する必要があります。デフォルトではbtn = [[UIButton alloc] init];メソッドを使用してボタンを初期化すると、UIButtonTypeCustomになります。また、ボタンが実際に配置されている場所を書き留めるために、デバッグ目的で背景色を設定します。 あなたの場合、そのボタンのフレームを設定する必要がありますbtn.frame = CGRectMake(0,0,100,100);

内部UIScrollViewでは、このデリゲートメソッドを実装します。

- (BOOL)touchesShouldCancelInContentView:(UIView *)view 
    { 
     return ![view isKindOfClass:[UIButton class]]; 
    } 

これが機能する場合があります。

+0

ありがとう、私はボタンフレームを設定し、ちょうどコードでこれについて教えていない。 – George

2

あなたのCustomViewのフレームがあなたのUIButtonを妨害している可能性があります。それらは重なっていますか? [CustomView addSubview:UIButton];でテストするためにボタンをCustomViewに追加してください(もちろん値を使用してください)。それがうまくいくならば、あなたの問題は重なりそうです。

+0

ありがとうございました。しかし、私はちょうど私のCustomViewをViewControllerに追加するだけで、スクロールしても完全に動作します。スクロールビューに配置すると作業が停止します。 – George

+0

テーブルビュー用のボタンを追加するだけの場合は、この前の投稿をご覧ください... http://stackoverflow.com/questions/10229597/adding-uibutton-to-uitableview-cells – sangony

4

同じシナリオで同じです。 UIScrollViewは別のクラスにあり、カスタムビューでボタンを追加します。 「NSNotificationCenter」は私がこの問題を解決するのを助けました。 サンプルコード:スクロールビューを含むクラスで

-(void)tileTouchUpInside:(id)sender 
{  
    NSDictionary *dict=[NSDictionary dictionaryWithObject:@"index" forKey:@"index"]; 

    [[NSNotificationCenter defaultCenter]postNotificationName:@"Action" object:nil userInfo:dict]; 
} 

- (void)viewDidLoad 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doAction:) name:@"Action" object:nil]; 
} 
-(void)doAction:(NSNotification *) notification 
{ 
    NSString* value =[notification.userInfo valueForKey:@"index"]; 
    // ....... 
} 

スクロールビュー、カスタムビューやボタンのuserInteractionを有効にします。

-1

私はそれを使用し、最新のSDKを使用して、同じ問題に意見の&同じ階層構造を持っていた:

が同じのUITableViewCellにUIButtonのためにNOにdelaysContentTouchesを設定します。

self.tableView.delaysContentTouches = NO 
+0

これは私にとっては役に立ちません –

0

CustomViewからすべてのサブビューをScrollViewに追加します。また、CustomViewを非表示にします。 CustomView(scrollViewのContainerView)もscrollViewのサブビューであることを確認してください。

関連する問題