In my UITableView I want to have an option to click a button which have a fixed posision (see attached picture). But anything that is in front or behind the UITableView's section headers is blocked from interaction, it does not register the button taps. I've tried to set a higher zPosition, which brings the buttons in front of the headers, but I still can't press the buttons. This is what it lookes like:
Image that shows the buttons before and after (nameOfButton).layer.zPosition = 99
Even though my buttons is in front of the headers, the button taps is not registered...
I'm creating the buttons programatically, and my
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
}
}
it took me a while to find solution but i figure it out:
sectionView.userInteractionEnabled = false
+
sectionView.layer.zPosition = -1
EDIT: SWIFT 3 UPDATE:
view.isUserInteractionEnabled = false