開発メモ

開発関係のメモをいろいろと。たぶん。

UITableViewCellに置いたUIButtonがすぐに反応するようにする方法

かなりマニアックなtipsシリーズです。

f:id:see_ku:20160223201915p:plain

UITableViewCellにUIButtonを置いた場合、タッチしてすぐに指を離すとボタンがハイライト状態になりません。プログラム的に見ると、ちゃんと押されているのですが・・・ 使ってる側から見ると、まったく反応していないように見えて不親切です。

しばらく押してから離すとハイライト状態になりますが・・・ わかりにくいですよね? これをどうにかする方法のメモです。

動作を確認した環境

環境 情報
Xcode 7.2.1 (7C1002)
iOS 9.2
Swift 2.1.1
Date 2016/2/23

すぐに反応するようにする方法

すぐに反応してくれない原因はUIScrollViewのdelaysContentTouchesがtrueになっていることです。たぶん。

ですから、これをfalseにしてやればいいんですが、UITableViewは内部でUIScrollViewを使用しているため、一工夫必要になります。

具体的にはこんな感じ。

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // UITableViewのdelaysContentTouchesをfalseに
        tableView.delaysContentTouches = false

        // 中のUIScrollViewのdelaysContentTouchesをfalseに
        for vi in tableView.subviews {
            if let vi = vi as? UIScrollView {
                vi.delaysContentTouches = false
            }
        }
        
        // 実際にUITableViewを使う処理

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

簡単ですね。