Я использую этот код для создания панели навигации с настраиваемыми кнопками:
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
Как сделать сенсорный вид за панелью навигации? ⇐ IOS
Программируем под IOS
-
Anonymous
1736312602
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
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79337404/how-to-make-touchable-view-behind-navigation-bar[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия