10

これに似た問題がありますが、答えはあまり役に立ちません。私はUITableViewいくつかのカスタムを持っていますUITableViewCells。これらのセルにはネストされたカスタムがいくつかUIViewsあり、最後にいくつかの UIButtons が内部にあります。問題は、上記の質問のように、ボタンをタッチするとイベントが入力されずUITableView、スクロールしないことです。

ここにいくつかのコードがあります(これは再現するための最速の方法であり、私の実際のコードではありません):

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

@property (strong, nonatomic) IBOutlet UITableView * tableView;

@end

@implementation ViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])
    {
        self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0,
                                                                       self.view.bounds.size.width,
                                                                       self.view.bounds.size.height)
                                                      style:UITableViewStylePlain];
        [self.view addSubview:self.tableView];
        self.tableView.delegate = self;
        self.tableView.dataSource = self;
    }
    return self;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell * cell = [[UITableViewCell alloc] init];
    UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.backgroundColor = [UIColor redColor];
    button.frame = CGRectMake(0, 0, 50, 44);
    [cell.contentView addSubview:button];
    return cell;
}

@end

唯一のセルの赤いボタンでは、テーブル ビューのバウンス スクロールができません。

誰かが私を少し助けることができますか?

PS 私が提供したコードの愚かさに注意を払わないでください。私はそれに関するすべての問題を認識しています。問題が何であるかを示すためにそれを提供しただけです。buttonViewとの衝突ですscrollView

4

4 に答える 4

11

UITableView で touchesShouldCancelInContentView: をオーバーライドすることで、動作を変更できます。これを機能させるには、loadView または xib ファイルで、テーブル ビューをこのサブクラスに置き換える必要があります。

@interface AutoCancelTableView: UITableView
@end

@implementation AutoCancelTableView

//
// Overriding touchesShouldCanceInContentView changes the behaviour
// of button selection in a table view to act like cell selection -
// dragging while clicking a button will cancel the click and allow
// the scrolling to occur
//
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
    return YES;
}

@end
于 2013-10-27T01:13:15.000 に答える
9

これは、テーブルビューが使用する標準的な動作ですUIScrollView。システムは、指を動かすまでスクロールしたいことを認識しませんが、その時までにボタンを「押した」ので、それがあなたがしたいことであると想定します。

テーブルビューのスクロールビューでいくつかのプロパティを操作して動作を変更できますが、遅延が増えるため、セルやボタンの感触に悪影響を与える場合があります。

self.tableView.delaysContentTouches = YES;

delaysContentTouches このプロパティの値が YES の場合、スクロール ビューは、スクロールが目的であるかどうかを判断できるまで、タッチダウン ジェスチャの処理を遅らせます...

self.tableView.canCancelContentTouches = YES

canCancelContentTouches このプロパティの値が YES で、コンテンツ内のビューがタッチした指の追跡を開始し、ユーザーがスクロールを開始するのに十分なほど指をドラッグした場合、ビューは touchesCancelled:withEvent: メッセージを受け取り、スクロール ビュー ハンドルスクロールとしてのタッチ。

于 2013-04-12T08:14:06.087 に答える
0

以下のコードは私のために働きます:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
cell = [tableView dequeueReusableCellWithIdentifier:@"cell_id"];
cell.userInteractionEnabled = YES;
if (cell == nil) {
    cell = [[[CustomCell1 alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell_id"]autorelease];
}

[cell.button addTarget:self action:@selector(button_action) forControlEvents:UIControlEventTouchUpInside];}

-(void)button_action{NSLog(@"Hello!");}

これは私のカスタムセルです:

#import "CustomCell.h"
@implementation CustomCell
@synthesize button;


- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
    button = [[UIButton alloc]init];
    button =[UIColor redColor];
    [self.contentView addSubview: button];
           }
return self;}

- (void)layoutSubviews {
[super layoutSubviews];
CGRect contentRect = self.contentView.bounds;
CGFloat boundsX = contentRect.origin.x;
CGRect frame;
frame= CGRectMake(boundsX+50 ,+15, 100, 100);
        button = frame;}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{   [super setSelected:selected animated:animated];
// Configure the view for the selected state
}
于 2013-04-12T08:01:05.983 に答える