在 ios 11 中未点击导航栏中的后退按钮
Back button in navigation bar not getting tapped in ios 11
在我认为导航项应该与 AutoLayout 概念一起工作的最近更新之前,它工作正常。我一直这样使用它:
let button = UIButton(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 30, height: 30)))
button.setImage(UIImage(named: "BackIcon"), for: UIControlState())
button.imageEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0)
button.addTarget((target != nil ? target! : self), action: backAction, for: .touchUpInside)
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: button)
我应该做些什么来让它变得平滑因为目前它不会在每次点击时都被调用,通常在同一区域需要 2-3 次才能被点击。
这对我有用 iOS 11。看看它是否适合你。
let btnLeftMenu = UIButton.init(type: .system)
let image = UIImage(named: "Back");
btnLeftMenu.setImage(image, for: .normal)
btnLeftMenu.setTitle("BACK", for: .normal);
btnLeftMenu.imageEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0)
btnLeftMenu.titleEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0)
btnLeftMenu.sizeToFit()
btnLeftMenu.tintColor = UIColor.white
btnLeftMenu.titleLabel?.font = UIFont.init(name: "Avenir-Heavy", size: 16.0)
btnLeftMenu.addTarget(self, action: #selector (CustomMessageVC.backButtonAction(_:)), for: .touchUpInside)
let barButton = UIBarButtonItem(customView: btnLeftMenu)
self.navigationItem.leftBarButtonItem = barButton
[编辑]
可能图片的宽高偏小了。您可以在 Xcode 调试时使用实时 Viewstack 检查后退按钮的宽度和高度。单击图像右侧的第二个按钮以查看 ViewStack。如果宽度和高度是问题,则增加按钮的宽度和高度,图像居中,imageView 属性 以适应纵横比。那应该可以解决您的问题。编码愉快。
适合我:
let backButton = UIBarButtonItem(title: "Back",
style: .done,
target: self,
action: #selector(moveBack))
navigationItem.setLeftBarButton(backButton, animated: false)
打开视图调试器并检查 leftBarButtonItem 的框架。你应该小心 leftBarButton
,因为它不会继承自 UIView
并在运行时生成框架。
现在 iOS 11 已经出来了,我们的应用程序也发现了这个问题,所以这是我的解决方案。它并不完美,因为您确实需要为按钮设置框架,但可以完成工作,并且可以在 iOS 9.3/10.3.1/11.1(可能介于两者之间)上工作。点击区域正常,用户体验良好。
之前:
之后:
我在viewDidLoad
中这样称呼:
func setNavbarButtons() {
// setup the left and right nav bar buttons
// manually define the frame for the buttons
let buttonWidth: CGFloat = 44
var buttonHeight: CGFloat = buttonWidth
// if possible, use the nav bar height as the button height, else fall back to the manual value above
if let frame = self.navigationController?.navigationBar.frame {
buttonHeight = frame.height
}
// apply this to the left inset for the left button, right inset for the right button, so the image is pushed to the left/right respectively
// (hence the negative value)
// setting this to 0 will center the image in the button and we don't want that
let edgeInset = -(buttonWidth/2)
// setup a button to hold the image (left)
let leftButton = UIButton(type: .custom)
let backIcon = UIImage(named: "Back with shadow")
backIcon!.isAccessibilityElement = true
backIcon!.accessibilityLabel = "Back"
// no title text
leftButton.setTitle("", for: .normal)
leftButton.setImage(backIcon, for: .normal)
leftButton.sizeToFit()
leftButton.addTarget(self, action: #selector(self.didTapLeftNavbarButton), for: .touchUpInside)
// define left button frame and inset
leftButton.frame.size.width = buttonWidth
leftButton.frame.size.height = buttonHeight
leftButton.contentEdgeInsets = UIEdgeInsetsMake(0, edgeInset, 0, 0)
// finally setup a UIBarButtonItem to hold the UIButton (arg)
let leftBarButtonItem = UIBarButtonItem(customView: leftButton)
leftBarButtonItem.title = ""
// set it
self.navigationItem.setLeftBarButton(leftBarButtonItem, animated: true)
// rinse/wash/repeat for right button
let rightButton = UIButton(type: .custom)
let shareIcon = UIImage(named: "Share")
shareIcon!.isAccessibilityElement = true
shareIcon!.accessibilityLabel = "Share"
// no title text
rightButton.setTitle("", for: .normal)
rightButton.setImage(shareIcon, for: .normal)
rightButton.sizeToFit()
rightButton.addTarget(self, action: #selector(self.didTapActionButton(_:)), for: .touchUpInside)
// define right button frame and inset
rightButton.frame.size.width = buttonWidth
rightButton.frame.size.height = buttonHeight
rightButton.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, edgeInset)
let rightBarButtonItem = UIBarButtonItem(customView: rightButton)
rightBarButtonItem.title = ""
self.navigationItem.setRightBarButton(rightBarButtonItem, animated: true)
}
在我的自定义中覆盖以下方法 UIView
class 对我有用:
override var intrinsicContentSize: CGSize {
return UILayoutFittingExpandedSize
}
在我认为导航项应该与 AutoLayout 概念一起工作的最近更新之前,它工作正常。我一直这样使用它:
let button = UIButton(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 30, height: 30)))
button.setImage(UIImage(named: "BackIcon"), for: UIControlState())
button.imageEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0)
button.addTarget((target != nil ? target! : self), action: backAction, for: .touchUpInside)
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: button)
我应该做些什么来让它变得平滑因为目前它不会在每次点击时都被调用,通常在同一区域需要 2-3 次才能被点击。
这对我有用 iOS 11。看看它是否适合你。
let btnLeftMenu = UIButton.init(type: .system)
let image = UIImage(named: "Back");
btnLeftMenu.setImage(image, for: .normal)
btnLeftMenu.setTitle("BACK", for: .normal);
btnLeftMenu.imageEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0)
btnLeftMenu.titleEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0)
btnLeftMenu.sizeToFit()
btnLeftMenu.tintColor = UIColor.white
btnLeftMenu.titleLabel?.font = UIFont.init(name: "Avenir-Heavy", size: 16.0)
btnLeftMenu.addTarget(self, action: #selector (CustomMessageVC.backButtonAction(_:)), for: .touchUpInside)
let barButton = UIBarButtonItem(customView: btnLeftMenu)
self.navigationItem.leftBarButtonItem = barButton
[编辑]
可能图片的宽高偏小了。您可以在 Xcode 调试时使用实时 Viewstack 检查后退按钮的宽度和高度。单击图像右侧的第二个按钮以查看 ViewStack。如果宽度和高度是问题,则增加按钮的宽度和高度,图像居中,imageView 属性 以适应纵横比。那应该可以解决您的问题。编码愉快。
适合我:
let backButton = UIBarButtonItem(title: "Back",
style: .done,
target: self,
action: #selector(moveBack))
navigationItem.setLeftBarButton(backButton, animated: false)
打开视图调试器并检查 leftBarButtonItem 的框架。你应该小心 leftBarButton
,因为它不会继承自 UIView
并在运行时生成框架。
现在 iOS 11 已经出来了,我们的应用程序也发现了这个问题,所以这是我的解决方案。它并不完美,因为您确实需要为按钮设置框架,但可以完成工作,并且可以在 iOS 9.3/10.3.1/11.1(可能介于两者之间)上工作。点击区域正常,用户体验良好。
之前:
之后:
我在viewDidLoad
中这样称呼:
func setNavbarButtons() {
// setup the left and right nav bar buttons
// manually define the frame for the buttons
let buttonWidth: CGFloat = 44
var buttonHeight: CGFloat = buttonWidth
// if possible, use the nav bar height as the button height, else fall back to the manual value above
if let frame = self.navigationController?.navigationBar.frame {
buttonHeight = frame.height
}
// apply this to the left inset for the left button, right inset for the right button, so the image is pushed to the left/right respectively
// (hence the negative value)
// setting this to 0 will center the image in the button and we don't want that
let edgeInset = -(buttonWidth/2)
// setup a button to hold the image (left)
let leftButton = UIButton(type: .custom)
let backIcon = UIImage(named: "Back with shadow")
backIcon!.isAccessibilityElement = true
backIcon!.accessibilityLabel = "Back"
// no title text
leftButton.setTitle("", for: .normal)
leftButton.setImage(backIcon, for: .normal)
leftButton.sizeToFit()
leftButton.addTarget(self, action: #selector(self.didTapLeftNavbarButton), for: .touchUpInside)
// define left button frame and inset
leftButton.frame.size.width = buttonWidth
leftButton.frame.size.height = buttonHeight
leftButton.contentEdgeInsets = UIEdgeInsetsMake(0, edgeInset, 0, 0)
// finally setup a UIBarButtonItem to hold the UIButton (arg)
let leftBarButtonItem = UIBarButtonItem(customView: leftButton)
leftBarButtonItem.title = ""
// set it
self.navigationItem.setLeftBarButton(leftBarButtonItem, animated: true)
// rinse/wash/repeat for right button
let rightButton = UIButton(type: .custom)
let shareIcon = UIImage(named: "Share")
shareIcon!.isAccessibilityElement = true
shareIcon!.accessibilityLabel = "Share"
// no title text
rightButton.setTitle("", for: .normal)
rightButton.setImage(shareIcon, for: .normal)
rightButton.sizeToFit()
rightButton.addTarget(self, action: #selector(self.didTapActionButton(_:)), for: .touchUpInside)
// define right button frame and inset
rightButton.frame.size.width = buttonWidth
rightButton.frame.size.height = buttonHeight
rightButton.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, edgeInset)
let rightBarButtonItem = UIBarButtonItem(customView: rightButton)
rightBarButtonItem.title = ""
self.navigationItem.setRightBarButton(rightBarButtonItem, animated: true)
}
在我的自定义中覆盖以下方法 UIView
class 对我有用:
override var intrinsicContentSize: CGSize {
return UILayoutFittingExpandedSize
}