Элементы UITabBar, переходящие на обратную навигацию на iOS 12.1 - PullRequest
0 голосов
/ 31 октября 2018

У меня есть приложение для iOS с UITabBarController на главном экране, переход к подробному экрану, скрывающее UITabBarController с настройкой hidesBottomBarWhenPushed = true.

Возвращаясь к главному экрану, UITabBarController делает странный «прыжок», как показано на этом GIF:

enter image description here

Это происходит только на iOS 12.1 , а не на 12.0 или 11.x.

Похоже на ошибку в iOS 12.1, потому что я заметил другие приложения, такие как FB Messenger с таким поведением, но мне было интересно, есть ли какое-то решение для этого?

Ответы [ 12 ]

0 голосов
/ 01 ноября 2018
import UIKit

extension UITabBar{

open override func layoutSubviews() {
    super.layoutSubviews()
    if let UITabBarButtonClass = NSClassFromString("UITabBarButton") as? NSObject.Type{
        let subItems = self.subviews.filter({return $0.isKind(of: UITabBarButtonClass)})
        if subItems.count > 0{
            let tmpWidth = UIScreen.main.bounds.width / CGFloat(subItems.count)
            for (index,item) in subItems.enumerated(){
                item.frame = CGRect(x: CGFloat(index) * tmpWidth, y: 0, width: tmpWidth, height: item.bounds.height)
                }
            }
        }
    }

open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    if let view:UITabBar = super.hitTest(point, with: event) as? UITabBar{
        for item in view.subviews{
            if point.x >= item.frame.origin.x  && point.x <= item.frame.origin.x + item.frame.size.width{
                return item
                }
            }
        }
        return super.hitTest(point, with: event)
    }
}
0 голосов
/ 31 октября 2018

Я думаю, это ошибка Apple Но вы можете попробовать это как исправление: просто создайте класс для вашего tabBar со следующим кодом:

import UIKit

class FixedTabBar: UITabBar {

    var itemFrames = [CGRect]()
    var tabBarItems = [UIView]()


    override func layoutSubviews() {
        super.layoutSubviews()

        if itemFrames.isEmpty, let UITabBarButtonClass = NSClassFromString("UITabBarButton") as? NSObject.Type {
            tabBarItems = subviews.filter({$0.isKind(of: UITabBarButtonClass)})
            tabBarItems.forEach({itemFrames.append($0.frame)})
        }

        if !itemFrames.isEmpty, !tabBarItems.isEmpty, itemFrames.count == items?.count {
            tabBarItems.enumerated().forEach({$0.element.frame = itemFrames[$0.offset]})
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...