iOS增加了TableViewCell中UIButton的触摸区域

Lor*_*ion 14 uibutton uitableview ios swift

我有一个UIButton在我UITableViewCell

我做了一个UIButton覆盖pointInside函数的子类:

var touchMargin:CGFloat = 20.0

override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
    let extendedArea = CGRectInset(self.bounds, -touchMargin, -touchMargin)
    return CGRectContainsPoint(extendedArea, point)
}
Run Code Online (Sandbox Code Playgroud)

但是,触摸区域不会增加.
如果我稍稍触摸一下,我会触摸桌面单元格UIButton.

由于Button被放置在单元格中,此代码是否不起作用?
我该怎么办?

Dav*_*eek 9

斯威夫特3

//
//  ViewController.swift
//  test
//
//  Created by David Seek on 9/29/16.
//  Copyright © 2016 David Seek. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = MyButton(frame: CGRect(x: 200, y: 200, width: 100, height: 100))
        button.backgroundColor = UIColor.white
        button.addedTouchArea = 50 // any value you want
        button.addTarget(self, action:#selector(self.action), for: .touchUpInside)
        self.view.addSubview(button)
    }

    func action() {
        print("touched")
    }

}

class MyButton: UIButton {
    var addedTouchArea = CGFloat(0)

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {

        let newBound = CGRect(
            x: self.bounds.origin.x - addedTouchArea,
            y: self.bounds.origin.y - addedTouchArea,
            width: self.bounds.width + 2 * addedTouchArea,
            height: self.bounds.width + 2 * addedTouchArea
        )
        return newBound.contains(point)
    }
}
Run Code Online (Sandbox Code Playgroud)

您正在创建一个UIButton100x100的大小,并且.addedTouchArea有一个UIButton - 仍然是光学尺寸100x100,但触摸区域为150x150.

Swift 2.X

class MyButton: UIButton {
    var addedTouchArea = CGFloat(0)

    override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {

        let newBound = CGRect(
            x: self.bounds.origin.x - addedTouchArea,
            y: self.bounds.origin.y - addedTouchArea,
            width: self.bounds.width + 2 * addedTouchArea,
            height: self.bounds.width + 2 * addedTouchArea
        )
        return newBound.contains(point)
    }
}
Run Code Online (Sandbox Code Playgroud)

InterfaceBuilder中

如果您确实使用了按钮设置了Button,请将InterfaceBuilder我们的子类UIButton应用于您的按钮.

在此输入图像描述

然后在按钮上设置一个插座,名为buttonXY.并设置buttonXY.addedTouchArea = 50在内viewDidLoad,fe

的UITableViewCell

既然你要求UITableViewCell.它的工作方式完全相同.

在ViewController类中:

extension ViewController: UITableViewDelegate, UITableViewDataSource {

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "tableViewCell") as! TableViewCell
        cell.selectionStyle = UITableViewCellSelectionStyle.none

        cell.myButton.addedTouchArea = 50 // any value you want
        tableView.rowHeight = 200

        return cell
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的Cell类中:

class TableViewCell: UITableViewCell {

    @IBOutlet weak var myButton: MyButton!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    @IBAction func myButtonAction(_ sender: AnyObject) {
        print("touched")
    }
}
Run Code Online (Sandbox Code Playgroud)

唯一值得注意的事情是:将插座设置为UIButton插座,即使我已将其声明为MyButton的子类InterfaceBuilder.我不得不手动更换插座MyButton!@IBOutlet weak var myButton: MyButton!


Dai*_*jan 6

你应该在你想要放大的视图上覆盖hitTest.

例如

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if (!self.isUserInteractionEnabled || self.isHidden || self.alpha <= 0.01) {
        return nil;
    }
    CGRect touchRect = CGRectInset(self.bounds, -10, -10);
    if (CGRectContainsPoint(touchRect, point)) {
        //TODO!? check supviews
        return self;
    }
    return nil;
}
Run Code Online (Sandbox Code Playgroud)