Как сделать сенсорный вид за панелью навигации?IOS

Программируем под IOS
Ответить
Anonymous
 Как сделать сенсорный вид за панелью навигации?

Сообщение Anonymous »

Я использую этот код для создания панели навигации с настраиваемыми кнопками:
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.backgroundColor = .clear
navigationItem.setHidesBackButton(true, animated: false)

rightButtonsImagesArrayNormal = ["gear","unmute"]
rightButtonsImagesArraySelected = ["gear","mute"]

navigationController?.navigationBar.addSubview(rightStackView)
setupNavigationBarButtonConstraint()
setupRightButtons()
}

func setupNavigationBarButtonConstraint() {
rightStackView.topAnchor.constraint(equalTo: (navigationController?.navigationBar.topAnchor)!, constant: 8.0).isActive = true
rightStackView.bottomAnchor.constraint(equalTo: (navigationController?.navigationBar.bottomAnchor)!, constant: -8.0).isActive = true
rightStackView.trailingAnchor.constraint(equalTo: (navigationController?.navigationBar.trailingAnchor)!, constant: -SafeArea().right()).isActive = true
}

func setupRightButtons() {
var configuration = UIButton.Configuration.plain()
configuration.baseBackgroundColor = UIColor.clear
barButton = UIButton(configuration: configuration, primaryAction: nil)
let handler: UIButton.ConfigurationUpdateHandler = { button in
switch button.state {
case .normal: button.configuration?.image = UIImage(named: self.rightButtonsImagesArrayNormal[index-1])
case .selected: button.configuration?.image = UIImage(named: self.rightButtonsImagesArraySelected[index-1])
default: break
}
}
barButton.configurationUpdateHandler = handler
barButton.tag = index
barButton.widthAnchor.constraint(equalToConstant: CGFloat(navigationBarButtonHeight)).isActive = true
barButton.heightAnchor.constraint(equalToConstant: CGFloat(navigationBarButtonHeight)).isActive = true
barButton.addTarget(self, action: #selector(self.rightBarButtonAction), for: .touchUpInside)
rightStackView.addArrangedSubview(barButton)
rightStackView.widthAnchor.constraint(equalToConstant: CGFloat(((navigationBarButtonHeight+16)*rightButtonsImagesArrayNormal.count) - 16)).isActive = true
}

Я использую:
navigationController?.navigationBar.isUserInteractionEnabled = false

чтобы сделать вид позади панели навигации сенсорным, но в этом случае моя barButton внутри rightStackView становится неприкосновенной, и я не могу использовать barButton. Я делаю так:
barButton.isUserInteractionEnabled = true
rightStackView.isUserInteractionEnabled = true

но это не решает проблему. Как это исправить?
Полный код, рекомендованный @HangarRash:
class ViewController: UIViewController {

var navigationBarHeight = Float()
var rightBarButtonSize = Float()
var rightButtonsImagesArrayNormal = [""]
var rightButtonsImagesArraySelected = [""]

lazy var rightStackView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.spacing = 16
stackView.alignment = .fill
stackView.distribution = .equalSpacing
stackView.translatesAutoresizingMaskIntoConstraints = false
return stackView
}()

var barButton: UIButton = {
let button = UIButton()
button.layer.shadowColor = UIColor.black.withAlphaComponent(0.5).cgColor
button.layer.shadowOffset = CGSize.zero
button.layer.shadowOpacity = 0.2
button.layer.shadowRadius = 3
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()

func setupNavigationBar() {
defaultHeight = (navigationController?.navigationBar.frame.size.height)!
navigationItem.perform(NSSelectorFromString(["_", "set", "Bottom", "Palette", ":"].joined()), with: NavigationBarCustomHeight().height())
navigationController?.navigationBar.backgroundColor = .clear
navigationController?.navigationBar.isUserInteractionEnabled = false
navigationItem.setHidesBackButton(true, animated: false)
rightButtonsImagesArrayNormal = ["gear","unmute"]
rightButtonsImagesArraySelected = ["gear","mute"]
navigationController?.navigationBar.addSubview(rightStackView)
setupNavigationBarButtonConstraint()
setupRightButtons()
}

func setupNavigationBarButtonConstraint() {
rightStackView.topAnchor.constraint(equalTo: (navigationController?.navigationBar.topAnchor)!, constant: 8.0).isActive = true
rightStackView.bottomAnchor.constraint(equalTo: (navigationController?.navigationBar.bottomAnchor)!, constant: -8.0).isActive = true
rightStackView.trailingAnchor.constraint(equalTo: (navigationController?.navigationBar.trailingAnchor)!, constant: -32).isActive = true
}

func setupRightButtons() {
for index in 1...rightButtonsImagesArrayNormal.count {
var configuration = UIButton.Configuration.plain()
configuration.baseBackgroundColor = UIColor.clear
barButton = UIButton(configuration: configuration, primaryAction: nil)
let handler: UIButton.ConfigurationUpdateHandler = { button in
switch button.state {
case .normal: button.configuration?.image = UIImage(named: self.rightButtonsImagesArrayNormal[index-1])
case .selected: button.configuration?.image = UIImage(named: self.rightButtonsImagesArraySelected[index-1])
default: break
}
}
barButton.configurationUpdateHandler = handler
barButton.tag = index
barButton.widthAnchor.constraint(equalToConstant: CGFloat(navigationBarButtonHeight)).isActive = true
barButton.heightAnchor.constraint(equalToConstant: CGFloat(navigationBarButtonHeight)).isActive = true
barButton.addTarget(self, action: #selector(self.rightBarButtonAction), for: .touchUpInside)
rightStackView.addArrangedSubview(barButton)
rightStackView.widthAnchor.constraint(equalToConstant:
CGFloat(((navigationBarButtonHeight+16)*rightButtonsImagesArrayNormal.count) - 16)).isActive = true
}
}

override func viewDidLoad() {
super.viewDidLoad()
setupNavigationBar()
}

}

var defaultHeight = CGFloat()
var navigationBarHeight = 80
var navigationBarButtonHeight = 64

class NavigationBarCustomHeight: UIViewController {
func height() -> AnyObject {
let contentView = UIView()
contentView.frame.size.height = CGFloat(navigationBarHeight) - defaultHeight

let _UINavigationBarPalette = NSClassFromString(["_", "UI", "Navigation", "Bar", "Palette"].joined()) as! UIView.Type
let palette = _UINavigationBarPalette.perform(NSSelectorFromString("alloc"))
.takeUnretainedValue()
.perform(NSSelectorFromString("initWithContentView:"), with: contentView)
.takeUnretainedValue()

return palette
}
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... gation-bar
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»