У меня есть приложение, в котором я создал пользовательский элемент панели вкладок в UITabbarController, который кто-то может нажать, чтобы сделать снимок, и похоже, что он делает это ниже.
Это именно то, что я хочу, проблема в том, что когда я тестирую его на iPhone X, элемент панели вкладок для камеры выглядит ниже, чем мне хотелось бы, например:
Я попробовал несколько вещей, чтобы исправить это, например, исправить высоту панели вкладок в viewDidLayoutSubviews (), но она перепуталась с панелью вкладок на iPhone 8. Я также убедился, что «Использовать макет безопасной области Гиды "выбрано, но все равно не работает.
Я также пытался изменить рамку элемента панели вкладок, но это тоже не работает.
Это код, который я использовал для пользовательского контроллера вкладок:
import UIKit
class OtherTabController: UITabBarController, UITabBarControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
setupBtn()
// Do any additional setup after loading the view.
}
func setupBtn() {
let centerBtn = UIButton(frame: CGRect(x: 0, y: 10, width: 45, height: 45))
var centerBtnFrame = centerBtn.frame
centerBtnFrame.origin.y = (view.bounds.height - centerBtnFrame.height) - 2
centerBtnFrame.origin.x = view.bounds.width/2 - centerBtnFrame.size.width/2
centerBtn.frame = centerBtnFrame
centerBtn.layer.cornerRadius = 35
view.addSubview(centerBtn)
let centerImg = UIImage(named: "Other")
centerBtn.setBackgroundImage(centerImg, for: .normal)
centerBtn.addTarget(self, action: #selector(centerBtnAction(sender:)), for: .touchUpInside)
view.layoutIfNeeded()
}
@objc private func centerBtnAction(sender: UIButton) {
print("Camera")
cameraAction()
}
func cameraAction() {
let alertController = UIAlertController.init(title: nil, message: nil, preferredStyle: .actionSheet)
let takePhotoAction = UIAlertAction(title: "Take a Photo", style: .default, handler: nil)
alertController.addAction(takePhotoAction)
let selectFromAlbumAction = UIAlertAction(title: "Select from Album", style: .default, handler: nil)
alertController.addAction(selectFromAlbumAction)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
alertController.addAction(cancelAction)
self.present(alertController, animated: true, completion: nil)
//OtherTabController?.present(alertController, animated: true, completion: nil)
}
}
Если есть что-то еще, с чем я мог бы помочь, пожалуйста, спросите. Спасибо
EDIT:
Я попытался сделать вид y таким же, как и вид super, но все, что он сделал, это переместил кнопку в верхнюю часть экрана.
var centerBtnFrame = centerBtn.frame
centerBtnFrame.origin.y = view.bounds.minY //Make centerBtn' top equal to that of view's
centerBtnFrame.origin.x = view.bounds.width/2 - centerBtnFrame.size.width/2
centerBtn.frame = centerBtnFrame
Если вам нужна дополнительная информация, пожалуйста, спросите. Спасибо
Edit:
С помощью @Revanth Kausikan я решил создать настраиваемую панель вкладок с видом и несколькими кнопками. Это работает очень хорошо, на мой взгляд. По краям выглядит немного грубовато, но пока это просто тест.
Вот код для просмотра:
import UIKit
class ItemScene: UIViewController {
@IBOutlet var customTab: UIView!
@IBOutlet weak var cameraBtn: UIButton!
@IBOutlet weak var twoBtn: UIButton!
@IBOutlet weak var oneBtn: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func cameraBtnPressed(_ sender: Any) {
print("Camera")
}
@IBAction func twoBtnPressed(_ sender: Any) {
self.performSegue(withIdentifier: "segue", sender: nil)
print("Two")
}
@IBAction func oneBtnPressed(_ sender: Any) {
print("One")
}
}
это код для второго ViewController:
import UIKit
class TestingViewController: UIViewController {
@IBOutlet weak var cameraBtn: UIButton!
@IBOutlet weak var oneBtn: UIButton!
@IBOutlet weak var twoBtn: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func cameraBtnPressed(_ sender: Any) {
print("Camera")
}
@IBAction func twoBtnPressed(_ sender: Any) {
print("Two")
}
@IBAction func oneBtnPressed(_ sender: Any) {
performSegueToReturnBack()
print("One")
}
}
extension UIViewController {
func performSegueToReturnBack() {
if let nav = self.navigationController {
nav.popViewController(animated: true)
} else {
self.dismiss(animated: true, completion: nil)
}
}
}
Если кому-то еще есть что добавить, это будет с благодарностью. Спасибо