Swift - UITableView 中的 Header 阻止按钮交互
Swift - Header in UITableView blocks button interaction
在我的 UITableView 中,我希望有一个选项可以单击具有固定位置的按钮(见附图)。但是 UITableView 部分 headers 前面或后面的任何内容都被阻止进行交互,它不会注册按钮点击。我已经尝试设置更高的 zPosition,这会将按钮置于 headers 的前面,但我仍然无法按下按钮。这是它的样子:
Image that shows the buttons before and after (nameOfButton).layer.zPosition = 99
is applied.
即使我的按钮在 headers 前面,但按钮点击未注册...
我正在以编程方式创建按钮,我的 viewDidLoad
看起来像这样:
override func viewDidLoad() {
super.viewDidLoad()
// Allow iOS to resize the cells automatically according to our Auto Layout constraints
tableView.rowHeight = UITableViewAutomaticDimension
// We will take ownership of the header view we've so nicely setup in the storyboard and then remove it from the table view.
headerView = tableView.tableHeaderView
tableView.tableHeaderView = nil
tableView.addSubview(headerView)
let addPhotoTapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.addPhoto(_:)))
headerView.addGestureRecognizer(addPhotoTapGesture)
// PhotoPicker
createPhotoPickerButtons()
let effectiveHeight = kTableHeaderHeight-kTableHeaderCutAway/2
tableView.contentInset = UIEdgeInsets(top: effectiveHeight, left: 0, bottom: 0, right: 0)
tableView.contentOffset = CGPoint(x: 0, y: -effectiveHeight)
headerMaskLayer = CAShapeLayer()
headerMaskLayer.fillColor = UIColor.blackColor().CGColor
headerView.layer.mask = headerMaskLayer
updateHeaderView()
}
还有我的 createPhotoPickerButtons()
(这里我将按钮放在视图下方,这样我就可以使用 showImagePicker()
:
为它们的外观添加动画效果
func createPhotoPickerButtons() {
takePhotoButton = UIButton.init(type: UIButtonType.System) // .System
photoLibraryButton = UIButton.init(type: UIButtonType.System) // .System
cancelButton = UIButton.init(type: UIButtonType.System) // .System
takePhotoButton.frame = CGRectMake(20, (0 + self.tableView.contentOffset.y + UIScreen.mainScreen().bounds.height), (UIScreen.mainScreen().bounds.width - 40), 40)
photoLibraryButton.frame = CGRectMake(20, (0 + self.tableView.contentOffset.y + UIScreen.mainScreen().bounds.height), (UIScreen.mainScreen().bounds.width - 40), 40)
cancelButton.frame = CGRectMake(20, (0 + self.tableView.contentOffset.y + UIScreen.mainScreen().bounds.height), (UIScreen.mainScreen().bounds.width - 40), 40)
takePhotoButton.backgroundColor = UIColor(red: 0/255, green: 122/255, blue: 255/255, alpha: 1.0)
photoLibraryButton.backgroundColor = UIColor(red: 0/255, green: 122/255, blue: 255/255, alpha: 1.0)
cancelButton.backgroundColor = UIColor(red: 0/255, green: 122/255, blue: 255/255, alpha: 1.0)
takePhotoButton.setTitle("Take Photo", forState: UIControlState.Normal)
photoLibraryButton.setTitle("Photo Library", forState: UIControlState.Normal)
cancelButton.setTitle("Cancel", forState: UIControlState.Normal)
takePhotoButton.titleLabel?.font = UIFont.systemFontOfSize(17)
photoLibraryButton.titleLabel?.font = UIFont.systemFontOfSize(17)
cancelButton.titleLabel?.font = UIFont.systemFontOfSize(17)
takePhotoButton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
photoLibraryButton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
cancelButton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
let takePhotoButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.takePhotoButtonAction(_:)))
takePhotoButton.addGestureRecognizer(takePhotoButtonTapGesture)
let photoLibraryButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.photoLibraryButtonAction(_:)))
photoLibraryButton.addGestureRecognizer(photoLibraryButtonTapGesture)
let cancelButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.cancelButtonAction(_:)))
cancelButton.addGestureRecognizer(cancelButtonTapGesture)
self.tableView.addSubview(takePhotoButton)
self.tableView.addSubview(photoLibraryButton)
self.tableView.addSubview(cancelButton)
takePhotoButton.layer.zPosition = 99
photoLibraryButton.layer.zPosition = 99
cancelButton.layer.zPosition = 99
takePhotoButton.alpha = 0
photoLibraryButton.alpha = 0
cancelButton.alpha = 0
}
最后我的 showImagePicker()
在 addPhoto()
中调用(用户点击图像时调用的操作):
func showImagePicker(){
// (0 + self.tableView.contentOffset.y + UIScreen.mainScreen().bounds.height - 50 - 10 - 50 - 10 - 50 - 10)
UIView.animateWithDuration(0.5) {
self.takePhotoButton.alpha = 1
self.photoLibraryButton.alpha = 1
self.cancelButton.alpha = 1
self.takePhotoButton.frame.origin.y = 0 + self.tableView.contentOffset.y + UIScreen.mainScreen().bounds.height - 50 - 10 - 50 - 10 - 50 - 10
self.photoLibraryButton.frame.origin.y = 0 + self.tableView.contentOffset.y + UIScreen.mainScreen().bounds.height - 50 - 10 - 50 - 10
self.cancelButton.frame.origin.y = 0 + self.tableView.contentOffset.y + UIScreen.mainScreen().bounds.height - 50 - 10
}
}
我在 SO 上找不到任何相关信息,也不知道 tableView 中按钮的其他解决方案。
你的问题是你在一个函数中声明你的手势识别器,如果你这样做那么它们将在函数体完成后被销毁。
在 createPhotoPickerButtons 之外声明您的识别器。所以上面的 viewDidLoad:
var takePhotoButtonTapGesture: UITapGestureRecognizer!
var photoLibraryButtonTapGesture: UITapGestureRecogniser!
var cancelButtonTapGesture: UITapGestureRecogniser!
并在 createPhotoPickerButtons 中:
func createPhotoPickerButtons() {
takePhotoButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.takePhotoButtonAction(_:)))
takePhotoButton.addGestureRecognizer(takePhotoButtonTapGesture)
photoLibraryButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.photoLibraryButtonAction(_:)))
photoLibraryButton.addGestureRecognizer(photoLibraryButtonTapGesture)
cancelButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.cancelButtonAction(_:)))
cancelButton.addGestureRecognizer(cancelButtonTapGesture)
}
首先你的代码有问题。
切勿向 UIButton
添加点击手势。
相反,请尝试 addTarget(target: AnyObject?, action: Selector, forControlEvents controlEvents: UIControlEvents)
。这用于处理点击按钮。
我花了一段时间才找到解决方案,但我想通了:
sectionView.userInteractionEnabled = false
+
sectionView.layer.zPosition = -1
编辑:SWIFT 3 更新:
view.isUserInteractionEnabled = false
在我的 UITableView 中,我希望有一个选项可以单击具有固定位置的按钮(见附图)。但是 UITableView 部分 headers 前面或后面的任何内容都被阻止进行交互,它不会注册按钮点击。我已经尝试设置更高的 zPosition,这会将按钮置于 headers 的前面,但我仍然无法按下按钮。这是它的样子:
Image that shows the buttons before and after (nameOfButton).layer.zPosition = 99
is applied.
即使我的按钮在 headers 前面,但按钮点击未注册...
我正在以编程方式创建按钮,我的 viewDidLoad
看起来像这样:
override func viewDidLoad() {
super.viewDidLoad()
// Allow iOS to resize the cells automatically according to our Auto Layout constraints
tableView.rowHeight = UITableViewAutomaticDimension
// We will take ownership of the header view we've so nicely setup in the storyboard and then remove it from the table view.
headerView = tableView.tableHeaderView
tableView.tableHeaderView = nil
tableView.addSubview(headerView)
let addPhotoTapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.addPhoto(_:)))
headerView.addGestureRecognizer(addPhotoTapGesture)
// PhotoPicker
createPhotoPickerButtons()
let effectiveHeight = kTableHeaderHeight-kTableHeaderCutAway/2
tableView.contentInset = UIEdgeInsets(top: effectiveHeight, left: 0, bottom: 0, right: 0)
tableView.contentOffset = CGPoint(x: 0, y: -effectiveHeight)
headerMaskLayer = CAShapeLayer()
headerMaskLayer.fillColor = UIColor.blackColor().CGColor
headerView.layer.mask = headerMaskLayer
updateHeaderView()
}
还有我的 createPhotoPickerButtons()
(这里我将按钮放在视图下方,这样我就可以使用 showImagePicker()
:
func createPhotoPickerButtons() {
takePhotoButton = UIButton.init(type: UIButtonType.System) // .System
photoLibraryButton = UIButton.init(type: UIButtonType.System) // .System
cancelButton = UIButton.init(type: UIButtonType.System) // .System
takePhotoButton.frame = CGRectMake(20, (0 + self.tableView.contentOffset.y + UIScreen.mainScreen().bounds.height), (UIScreen.mainScreen().bounds.width - 40), 40)
photoLibraryButton.frame = CGRectMake(20, (0 + self.tableView.contentOffset.y + UIScreen.mainScreen().bounds.height), (UIScreen.mainScreen().bounds.width - 40), 40)
cancelButton.frame = CGRectMake(20, (0 + self.tableView.contentOffset.y + UIScreen.mainScreen().bounds.height), (UIScreen.mainScreen().bounds.width - 40), 40)
takePhotoButton.backgroundColor = UIColor(red: 0/255, green: 122/255, blue: 255/255, alpha: 1.0)
photoLibraryButton.backgroundColor = UIColor(red: 0/255, green: 122/255, blue: 255/255, alpha: 1.0)
cancelButton.backgroundColor = UIColor(red: 0/255, green: 122/255, blue: 255/255, alpha: 1.0)
takePhotoButton.setTitle("Take Photo", forState: UIControlState.Normal)
photoLibraryButton.setTitle("Photo Library", forState: UIControlState.Normal)
cancelButton.setTitle("Cancel", forState: UIControlState.Normal)
takePhotoButton.titleLabel?.font = UIFont.systemFontOfSize(17)
photoLibraryButton.titleLabel?.font = UIFont.systemFontOfSize(17)
cancelButton.titleLabel?.font = UIFont.systemFontOfSize(17)
takePhotoButton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
photoLibraryButton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
cancelButton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
let takePhotoButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.takePhotoButtonAction(_:)))
takePhotoButton.addGestureRecognizer(takePhotoButtonTapGesture)
let photoLibraryButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.photoLibraryButtonAction(_:)))
photoLibraryButton.addGestureRecognizer(photoLibraryButtonTapGesture)
let cancelButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.cancelButtonAction(_:)))
cancelButton.addGestureRecognizer(cancelButtonTapGesture)
self.tableView.addSubview(takePhotoButton)
self.tableView.addSubview(photoLibraryButton)
self.tableView.addSubview(cancelButton)
takePhotoButton.layer.zPosition = 99
photoLibraryButton.layer.zPosition = 99
cancelButton.layer.zPosition = 99
takePhotoButton.alpha = 0
photoLibraryButton.alpha = 0
cancelButton.alpha = 0
}
最后我的 showImagePicker()
在 addPhoto()
中调用(用户点击图像时调用的操作):
func showImagePicker(){
// (0 + self.tableView.contentOffset.y + UIScreen.mainScreen().bounds.height - 50 - 10 - 50 - 10 - 50 - 10)
UIView.animateWithDuration(0.5) {
self.takePhotoButton.alpha = 1
self.photoLibraryButton.alpha = 1
self.cancelButton.alpha = 1
self.takePhotoButton.frame.origin.y = 0 + self.tableView.contentOffset.y + UIScreen.mainScreen().bounds.height - 50 - 10 - 50 - 10 - 50 - 10
self.photoLibraryButton.frame.origin.y = 0 + self.tableView.contentOffset.y + UIScreen.mainScreen().bounds.height - 50 - 10 - 50 - 10
self.cancelButton.frame.origin.y = 0 + self.tableView.contentOffset.y + UIScreen.mainScreen().bounds.height - 50 - 10
}
}
我在 SO 上找不到任何相关信息,也不知道 tableView 中按钮的其他解决方案。
你的问题是你在一个函数中声明你的手势识别器,如果你这样做那么它们将在函数体完成后被销毁。
在 createPhotoPickerButtons 之外声明您的识别器。所以上面的 viewDidLoad:
var takePhotoButtonTapGesture: UITapGestureRecognizer!
var photoLibraryButtonTapGesture: UITapGestureRecogniser!
var cancelButtonTapGesture: UITapGestureRecogniser!
并在 createPhotoPickerButtons 中:
func createPhotoPickerButtons() {
takePhotoButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.takePhotoButtonAction(_:)))
takePhotoButton.addGestureRecognizer(takePhotoButtonTapGesture)
photoLibraryButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.photoLibraryButtonAction(_:)))
photoLibraryButton.addGestureRecognizer(photoLibraryButtonTapGesture)
cancelButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.cancelButtonAction(_:)))
cancelButton.addGestureRecognizer(cancelButtonTapGesture)
}
首先你的代码有问题。
切勿向 UIButton
添加点击手势。
相反,请尝试 addTarget(target: AnyObject?, action: Selector, forControlEvents controlEvents: UIControlEvents)
。这用于处理点击按钮。
我花了一段时间才找到解决方案,但我想通了:
sectionView.userInteractionEnabled = false
+
sectionView.layer.zPosition = -1
编辑:SWIFT 3 更新:
view.isUserInteractionEnabled = false