すでにいくつかの可能な修正を検索しましたが、すべてが私のものを解決しませんでした。
uitableview内のボタンではなく、セルをクリックし続けます。
これが私のコードです:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.backgroundColor = [UIColor blackColor];
UIView *v = nil;
NSArray *array = [cell subviews];
for (v in array) {
NSLog(@"%@",[v class]);
if( [v isKindOfClass:[UIView class]] ){
[v removeFromSuperview];
}
}
//tb
if (tableView == self.tb) {
v = [[UIView alloc] initWithFrame: CGRectMake(0, 0, self.tb.bounds.size.width, 120.0)];
if([feeds count]>0){
UIImageView *box=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"statusBox.png"]];
box.userInteractionEnabled = YES;
[v addSubview:box];
AsyncImageView *imageView1 = [[AsyncImageView alloc] initWithFrame:CGRectMake(10, 20.0f, 34.0f, 34.0f)];
imageView1.contentMode = UIViewContentModeScaleAspectFill;
imageView1.clipsToBounds = YES;
//cancel loading previous image for cell
[[AsyncImageLoader sharedLoader] cancelLoadingImagesForTarget:imageView1];
if (users1 != nil && users1.imagelink != nil && (id) users1.imagelink != [NSNull null]){
imageView1.imageURL = [NSURL URLWithString:users1.imagelink];
}
else{
imageView1.image=[UIImage imageNamed:@"default_ProfilePic.png"];
}
UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myFunction:)];
tapped.numberOfTapsRequired = 1;
[imageView1 addGestureRecognizer:tapped];
[tapped release];
imageView1.userInteractionEnabled = NO;
[v addSubview:imageView1];
UIFont *font = [UIFont fontWithName:@"TrebuchetMS-Bold" size:11];
UILabel *descLabel1 = [[UILabel alloc] initWithFrame: CGRectMake(52, 23, 160, 48)];
descLabel1.text = [NSString stringWithFormat:@"%@ %@",users1.userfirstn,users1.userlastn];
descLabel1.textColor = [UIColor blackColor];
descLabel1.font = font;
descLabel1.adjustsFontSizeToFitWidth=YES;
descLabel1.numberOfLines = 0;
CGSize expectedLabelSize = [descLabel1.text sizeWithFont:descLabel1.font
constrainedToSize:descLabel1.frame.size
lineBreakMode:UILineBreakModeWordWrap];
CGRect newFrame = descLabel1.frame;
newFrame.size.height = expectedLabelSize.height;
descLabel1.frame = newFrame;
descLabel1.numberOfLines = 0;
descLabel1.userInteractionEnabled = NO;
[v addSubview:descLabel1];
UILabel *descLabel2= [[UILabel alloc] initWithFrame: CGRectMake(52, 43, 200, 48)];
StatusClass *stat1=[feeds objectAtIndex:indexPath.row];
descLabel2.text = [stat1 statcreate];
descLabel2.textColor = [UIColor blackColor];
descLabel2.font = font;
descLabel2.adjustsFontSizeToFitWidth=YES;
descLabel2.numberOfLines = 0;
CGSize expectedLabelSize2 = [descLabel2.text sizeWithFont:descLabel2.font
constrainedToSize:descLabel2.frame.size
lineBreakMode:UILineBreakModeWordWrap];
CGRect newFrame2 = descLabel2.frame;
newFrame2.size.height = expectedLabelSize2.height;
descLabel2.frame = newFrame2;
descLabel2.numberOfLines = 0;
descLabel2.userInteractionEnabled = NO;
[v addSubview:descLabel2];
UILabel *descLabel3= [[UILabel alloc] initWithFrame: CGRectMake(10, 63, 280, 80)];
StatusClass *stat=[feeds objectAtIndex:indexPath.row];
descLabel3.text = [stat stattext];
descLabel3.textColor = [UIColor blackColor];
descLabel3.font = font;
descLabel3.adjustsFontSizeToFitWidth=YES;
descLabel3.numberOfLines = 0;
descLabel3.userInteractionEnabled = NO;
[v addSubview:descLabel3];
//comment button
UIButton *buttonC = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[buttonC addTarget:self action:@selector(sendComment:) forControlEvents:UIControlEventTouchUpInside];
[buttonC setImage:[UIImage imageNamed:@"comment.png"] forState:UIControlStateNormal];
buttonC.frame = CGRectMake(2, 160, 145, 35);
buttonC.userInteractionEnabled = YES;
[v addSubview:buttonC];
//share button
UIButton *buttonS = [UIButton buttonWithType:UIButtonTypeRoundedRect];
buttonS.tag = indexPath.row;
[buttonS addTarget:self action:@selector(sendShare:) forControlEvents:UIControlEventTouchUpInside];
[buttonS setImage:[UIImage imageNamed:@"share.png"] forState:UIControlStateNormal];
buttonS.frame = CGRectMake(150, 160, 140, 35);
buttonS.userInteractionEnabled = YES;
[v addSubview:buttonS];
}
v.userInteractionEnabled = YES;
[cell addSubview:v];
}
return cell;
}
また、ボタンにUITapGestureRecognizer
を試しましたが、まだ機能しません。
ありがとう。
私はこの問題に困惑しています...
1つのプロジェクトでこれを行うことで、この問題を修正することができました。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("RegCell", forIndexPath: indexPath) as! CustomCell
cell.contentView.userInteractionEnabled = false // <<-- the solution
return cell
}
しかし、同じことは別のプロジェクトでは機能しませんでした。理由がわからない...
このような問題の別の潜在的な原因があります。つまり、UITableViewCells
にcontentView
があります。これは、タッチを取得してセルの選択を検出するために、カスタムテーブルビューセル内の他のビューの前に配置できます。そうすることで、背後にあるビューへのタッチをブロックする可能性があります。ペン先を使用してセルを作成するときに、この煩わしさに特に気づきました。
これに対処するために受け入れられている手段は、すべてのサブビューがテーブルビューセル自体ではなく、そのcontentView
に追加されるようにすることです。これは読み取り専用のプロパティであり、特定の状況下で、たとえば、削除ボタンを表示するために横にスライドしたときや、編集モード中に、独自のフレームを調整します。したがって、contentView
に追加するアイテムはすべてインテリジェントなサイズであり、正しいサイズ変更動作を備えていることを確認する必要があります。
また、セルをcontentView
に追加すると、セルへのタッチがブロックされ、セルが選択されなくなる可能性があることにも注意してください。私は個人的に、カスタムのユーザー対応コントロールを備えたセルを含むテーブルビューでセルを選択できないようにしています。それは混乱と厄介なインターフェースにつながるだけです。実際、私は将来のプロジェクトですべてのUITableViews
をはるかに適応性の高いUICollectionViews
に置き換えることを真剣に検討しています。
-灰
UIButton
=のyオフセットは160として指定され、UIView's
高さはちょうど120として指定されます。UIButton's
yオフセットを変更して試してください。
Swift 3およびStoryboardの場合
私の場合、コンテンツビュー内でマルチタッチを有効にし、テーブルビュー、テーブルビューセル、コンテンツビュー、UIButtonなどすべてでユーザー操作を有効にする必要がありました。絵コンテを使っていました。
また、テーブルビューセルをサブクラスとして設定しました。
問題を調査しているときにここで答えが見つからなかったので、これについてスタックオーバーフローに別の質問を投稿しました。あなたは私のコードを見て、これがここで機能しているプロジェクトをダウンロードすることができます: ITableViewCell内のボタンをクリックできませんか?
UITableViewCellは、デフォルトですべてのジェスチャを処理しています。セットする cell.selectionStyle = UITableViewCellSelectionStyleNone;
デフォルトの動作を無効にします。
この問題が発生しましたが、私の場合はテーブルビューとは関係ありませんでした。代わりに、ボタンでuserInteractionEnabled
がtrueのサブビューを使用していて、その値をfalse(NO)に設定していたためです。すべてのボタンのサブビューで問題が修正されました。
私はこれをやっていた:
let plusButton: UIButton = {
let v = UIButton()
v.setImage(plusImg, for: .normal)
v.tintColor = .dark
v.translatesAutoresizingMaskIntoConstraints = false
v.addTarget(self, action: #selector(plusButtonHandler), for: .touchUpInside)
// adding targets here did not work
return v
}()
また、クロージャー内でaddTargetメソッドを呼び出しても機能しなかったようです。 addTargetメソッドを因数分解し、代わりに初期化子に入れると、すべてが機能しました。
これを試して
public override void SetSelected(bool selected, bool animated)
{
// this.interestsButton.Selected = true;
if (selected)
{
// this.TextLabel.TextColor = UIColor.Red;
//this.interestsButton.ShowsTouchWhenHighlighted = true;
this.interestsButton.BackgroundColor = UIColor.Purple;
//this.interestsButton.SetTitleColor(UIColor.Red, UIControlState.Highlighted);
}
else
{
}
// cell.ContentView.UserInteractionEnabled = false;
base.SetSelected(selected, animated);
}
「Mvvmcross.iOS」でのみテスト済み
UIButton
内で押されたUITableViewCell
の代替セレクターがない場合は、ボタンのuserInteractionEnabled
をオフにする必要があります
cellButton.userInteractionEnabled = false
この場合、ボタンのタッチはセルのタッチに伝播します。
私も同じ問題を抱えていますが、どういうわけか自分の間違いを見つけました。self(UITableViewCell)
のconstraints
をself(UITableViewCell)
のconstraints
にcontentView
に変更した後、私のセルのボタンはもう一度クリック可能。
カスタムUITableViewCellを作成します。 このリンク を参照してください。
DisplayButtonという名前のUIButton
があるとすると、次のようなことができます。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
内で、セルを作成した後、
[cell.dislayButton addTarget: self
action: @selector(replyButtonPressed:withEvent:)
forControlEvents: UIControlEventTouchUpInside];
そして、ViewControllerでそのようなメソッドを作成します。
- (void) replyButtonPressed: (id) sender withEvent: (UIEvent *) event
{
UITouch * touch = [[event allTouches] anyObject];
CGPoint location = [touch locationInView: self.tableView];
NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: location];
}