我不明白为什么这个
UIButton
在我的UITableView
的标题中不起作用。它出现在那里,但触摸不起作用。
NSLog 语句也没有触发。它几乎就像是在另一个视图或其他东西的下面,这样你就可以看到它,但按下操作不起作用。
感谢您对此的任何帮助
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *sectionHeader = [[UILabel alloc] initWithFrame:CGRectNull];
sectionHeader.backgroundColor = [UIColor clearColor];
[sectionHeader addSubview:self.topMapView];
// add map launch button
mapLaunchButton = [UIButton buttonWithType:UIButtonTypeCustom];
[mapLaunchButton addTarget:self
action:@selector(mapButtonTouch:)
forControlEvents:UIControlEventTouchDown];
[mapLaunchButton setTitle:@"ggggggg" forState:UIControlStateNormal];
mapLaunchButton.frame = CGRectMake(0, 0, 300, 90);
mapLaunchButton.backgroundColor = [UIColor redColor];
[sectionHeader addSubview:mapLaunchButton];
// [sectionHeader bringSubviewToFront:mapLaunchButton];
self.tableView.tableHeaderView = sectionHeader;
return sectionHeader;
}
- (void)mapButtonTouch:(id)sender {
NSLog(@"map button was touched");
}
我可以看到不止一个错误 -
如果您的表格只有一个部分(以验证对
numberOfSectionsInTableView
代表的此项检查),则删除这一行 -
self.tableView.tableHeaderView =sectionHeader;
将
sectionHeader.frame
设置为适当的值(而不是 CGRectNull
)。设置节标题(相对于表标题视图)的好处是,当用户滚动表行时,节标题将粘在顶部(浮动)并且不会消失。 (素色桌子)问题还是没有解决,那就请验证一下他的方法 -
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 返回 50; // 取决于sectionHeader的高度 }
正如其他海报所指出的,捕获 UIButton 上的触摸事件
UIControlEventTouchUpInside
是首选事件。编辑 - (作为表头视图实现)
如果您想向上滚动它,请将其设置为表标题(而不是节标题)。因此,从 viewForHeaderInSection 中删除所有这些并将其放入视图控制器类的
viewDidLoad
中。保留这条线(在这种情况下不要删除它)-
self.tableView.tableHeaderView = sectionHeader;
但是,上述第2点和第4点仍然成立。
如果将
UIControlEventTouchDown
更改为 UIControlEventTouchUpInside
?
一件事是
section header
,另一件事是table header
。您为两者分配相同的视图。我不确定这是否是您问题的原因,但它可以帮助您开始。
不要实现该方法,而是在 viewDidLoad 上创建该视图并将其指定为
self.tableView.tableHeaderView
此外,最常见的用户体验与
UIControlEventTouchUpInside
相关(直到手指抬起并仍在按钮内时才会执行该操作)。但这可能与您的问题无关。这只是何时调用该操作的问题。
如果这不能解决您的问题,请告诉我,我会尝试检查是否还遗漏了其他内容
干杯!
如果添加视图
self.tableView.tableHeaderView = ({
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 184.0f)];
您可以添加新组件:
UIImageView, UIlabel...
它对我有用!
我测试过。
最终代码:
self.tableView.tableHeaderView = ({
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 184.0f)];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 40, 100, 100)];
imageView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
imageView.image = [UIImage imageNamed:@"avatar.jpg"];
imageView.layer.masksToBounds = YES;
imageView.layer.cornerRadius = 50.0;
imageView.layer.borderColor = [UIColor whiteColor].CGColor;
imageView.layer.borderWidth = 3.0f;
imageView.layer.rasterizationScale = [UIScreen mainScreen].scale;
imageView.layer.shouldRasterize = YES;
imageView.clipsToBounds = YES;
UIButton *mapLaunchButton = [UIButton buttonWithType:UIButtonTypeCustom];
[mapLaunchButton addTarget:self action:@selector(mapButtonTouch:) forControlEvents:UIControlEventTouchDown];
[mapLaunchButton setTitle:@"ggggggg" forState:UIControlStateNormal];
mapLaunchButton.frame = CGRectMake(0, 0, 300, 90);
mapLaunchButton.backgroundColor = [UIColor redColor];
[view addSubview:imageView];
[view addSubview:mapLaunchButton];
view;
});
页脚内的按钮也有同样的问题。
作为解决方法,我们可以使用 UITapGestureRecognizer 并将其与特定按钮或其超级视图链接(因此我们可以根据需要/可能删除按钮):
class TestButtonCell: UITableViewHeaderFooterView {
static let reuseId: String = String(describing: TestButtonCell.self)
static var NIB: UINib {
return UINib.init(nibName: reuseId, bundle: .main)
}
@IBOutlet private var buttonContainer: UIView!
var onTap: (() -> Void)? = nil
override func awakeFromNib() {
super.awakeFromNib()
}
override func prepareForReuse() {
super.prepareForReuse()
}
func setup() {
let touchRecognizer = UITapGestureRecognizer(target: self,
action: #selector(handleButtonTap))
buttonContainer.addGestureRecognizer(touchRecognizer)
}
@objc func handleButtonTap() {
/// Notify listener
onTap?()
}
}
我也有同样的问题。在以下行中将 UIXXXXXX 从 UILabel 更改为 UIView 对我有用:
UIView *sectionHeader = [[UIXXXXX alloc] initWithFrame:CGRectNull];
我没有使用:
self.tableView.tableHeaderView = sectionHeader;