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被放置在单元格中,此代码是否不起作用?
我该怎么办?
斯威夫特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)
您正在创建一个UIButton
100x100的大小,并且.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!
你应该在你想要放大的视图上覆盖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)
归档时间: |
|
查看次数: |
3276 次 |
最近记录: |