Как центрировать пользовательский элемент вкладки на iPhone X - PullRequest
3 голосов
/ 12 мая 2019

У меня есть приложение, в котором я создал пользовательский элемент панели вкладок в UITabbarController, который кто-то может нажать, чтобы сделать снимок, и похоже, что он делает это ниже.

Image for iPhone 8s

Это именно то, что я хочу, проблема в том, что когда я тестирую его на iPhone X, элемент панели вкладок для камеры выглядит ниже, чем мне хотелось бы, например:

Image for iPhone X

Я попробовал несколько вещей, чтобы исправить это, например, исправить высоту панели вкладок в viewDidLayoutSubviews (), но она перепуталась с панелью вкладок на iPhone 8. Я также убедился, что «Использовать макет безопасной области Гиды "выбрано, но все равно не работает.

enter image description here

Я также пытался изменить рамку элемента панели вкладок, но это тоже не работает.

Это код, который я использовал для пользовательского контроллера вкладок:

    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

enter image description here

Если вам нужна дополнительная информация, пожалуйста, спросите. Спасибо


Edit: С помощью @Revanth Kausikan я решил создать настраиваемую панель вкладок с видом и несколькими кнопками. Это работает очень хорошо, на мой взгляд. По краям выглядит немного грубовато, но пока это просто тест.

What it looks like

Вот код для просмотра:

    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)
        }
    }
}

Если кому-то еще есть что добавить, это будет с благодарностью. Спасибо

1 Ответ

0 голосов
/ 12 мая 2019

Точка Y рамки кнопки должна быть такой же, как у ее суперпредставления (т. Е. Здесь панель вкладок).

Если вы не создали выход для панели вкладок, сначала сделайте это.

  1. Ctrl (или вправо) щелкните и перетащите с панели вкладок в раскадровке на соответствующий контроллер представления, чтобы создать выход.(предположим, что я называю это tabBar)

  2. , а теперь попробуйте это:

var centerBtnFrame = centerBtn.frame
let tabBarFrame = self.convert(tabBar.frame, to: view) 
centerBtnFrame.origin.y = tabBarFrame.minY //Make centerBtn' top equal to that of tabBar's
centerBtnFrame.origin.x = view.bounds.width/2 - centerBtnFrame.size.width/2
centerBtn.frame = centerBtnFrame

В качестве альтернативы, вы можете попробовать это:

var centerBtnFrame = centerBtn.frame
centerBtnFrame.origin.y = view.height - tabBar.height //This is the same logic as you've used for fixing x value of centerBtnFrame.
centerBtnFrame.origin.x = view.bounds.width/2 - centerBtnFrame.size.width/2
centerBtn.frame = centerBtnFrame

Еще один подход - вернуться к ограничениям и убедиться, что элементы и базовый вид находятся в безопасной зоне.

Если мое предположение верно (поскольку вымы не предоставили подробностей об ограничениях в вопросе), вы установили базовое представление (представление, которое находится внизу / основание, в котором содержатся все остальные элементы), чтобы оно соответствовало всему представлению для контроллера представления,Попробуйте изменить его, чтобы он соответствовал безопасному району.

Дайте мне знать результаты.

РЕДАКТИРОВАТЬ

Мое мнение о вашей новой попытке:действительно хорошо, и я вижу, что теперь вы можете настраивать его намного больше.

Чтобы улучшить его, вы можете попробовать это:

Здесь есть три вида, которые можно нажимать по своей природе.,мы можем использовать это, чтобы увеличить интерактивную область согласно нашему желанию, чтобы обеспечить естественный опыт для пользователя.enter image description here

Вот его ограничения: enter image description here

Кроме этих предложений, я не думаю, что мне нужно предоставлять какие-либо,Ваш метод самодостаточен для вашей идеи реализации.

:)

...