it-swarm.com.ru

Как исправить проблему высоты панели вкладок на iPhone X

У меня возникла проблема с моим приложением при тестировании iPhone X. Я не уверен, как решить эту проблему, а также не могу решить проблему с размерами не iPhone X. Это только кажется проблемой на симуляторе iPhone X.

 enter image description here

 enter image description here

22
icekomo

 "File inspector"

«Инспектор файлов» справа от раскадровки XCode, включите макет руководства Безопасной области для поддержки вашего приложения в iPhone 

Этот пост описывает действительно хорошо.

7
Dipak Kacha

На iOS 12.1 Я решил эту проблему, переопределив safeAreaInsets в подклассе UITabBar:

class TabBar: UITabBar {
    private var cachedSafeAreaInsets = UIEdgeInsets.zero

    override var safeAreaInsets: UIEdgeInsets {
        let insets = super.safeAreaInsets

        if insets.bottom < bounds.height {
            cachedSafeAreaInsets = insets
        }

        return cachedSafeAreaInsets
    }
}
11
Andrey

Создайте отдельный файл со следующим кодом:

extension UITabBar {
    override open func sizeThatFits(_ size: CGSize) -> CGSize {
        super.sizeThatFits(size)
        guard let window = UIApplication.shared.keyWindow else {
            return super.sizeThatFits(size)
        }
        var sizeThatFits = super.sizeThatFits(size)
        sizeThatFits.height = window.safeAreaInsets.bottom + 40
        return sizeThatFits
    }
}
7
Mohamed Ali

Для iOS 11.3 это сработало для меня:

func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    tabBar.invalidateIntrinsicContentSize()
}
3
clopex

Я столкнулся с той же проблемой. К счастью, следующий пост спасает меня. Я уверен, что вы можете решить эту проблему с ним.

https://novemberfive.co/blog/Apple-september-event-iphonex-apps/

Техника, использующая базовый вид UITabBar для заполнения нижней области, устраняет проблему, от которой вы страдаете.

3
Kyokook Hwang

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

 Align to safe area

И когда выровнен к суперпредставлению, он покажет правильно:

 Align to Superview

Я думаю, это потому, что Apple присвоила элементам панели вкладок поле по умолчанию для нижней части, если оно находится на iPhone X, поскольку они хотят, чтобы панель вкладок была расширена до нижней части экрана, чтобы избежать плавающей панели.

1
ben87nz

Решением для меня было то, что у меня был пользовательский набор высоты UITabBar, что-то вроде этого:

  override func viewWillLayoutSubviews() {            
        var tabFrame = tabBar.frame
        tabFrame.size.height = 60
        tabFrame.Origin.y = self.view.frame.size.height - 60
        tabBar.frame = tabFrame
    }

Удалите его, и панель вкладок будет отображаться правильно на iPhone X.

1
Gytis

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

    tabBar.selectionIndicatorImage = UIImage.imageWithColor(color: UIColor.NewDesignColor.yellow, size: tabBarItemSize).resizableImage(withCapInsets: UIEdgeInsets.init(top: 0, left: 0, bottom: 20, right: 0))

Добавление нижнего врезки помогает в моем случае ........ Надеюсь, что это работает и для вас ..... Спасибо.

1
Akanksha Sharma

Следуйте приведенным ниже рекомендациям по настройке UITabbar selectionIndicatorImage.

  1. UITabBar.appearance (). SelectionIndicatorImage = #YOUR_IMAGE
  2. Убедитесь, что высота вашего изображения составляет 48.  

Высота по умолчанию для tabbar selectionIndicatorImage равна 49, но в iPhone X установленная высота изображения равна 48.

0
user5180348

Это выглядит сумасшедшим, но мне просто нужно удалить эту строку в моем коде

self.view.layoutIfNeeded()

Я просто предполагаю, что вызов layoutIfNeeded для представления, которое не отображается на экране, вызовет возникновение этой проблемы .... В любом случае, решение из @ mohamed-ALi также будет работать правильно. Спасибо большое.

0
Hiro

invalidateIntrinsicContentSize для UITabBar в viewWillLayoutSubviews, который может вам помочь.

 override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    self.tabBar.invalidateIntrinsicContentSize()
}
0
Nishant Bhindi

В ограничениях - 

Если вы указываете нижнее пространство в «Руководстве по разметке дна», то эта проблема возникнет. 

Решение:

Дайте нижнее пространство относительно суперпредставления. Это будет работать на 100% идеально.

0
Mehul Thakkar

У меня была похожая проблема. Я устанавливал selectionIndicatorImage в viewDidLoad (). Перемещение кода в viewDidLayoutSubviews () решило мою проблему.

0
Randeep

Существует подкласс UITabBar, который решает все мои проблемы с iPhone X iOS 11/iOS 12

class TabBar: UITabBar {

private var _safeAreaInsets = UIEdgeInsets.zero
private var _subviewsFrames: [CGRect] = []

@available(iOS 11.0, *)
override func safeAreaInsetsDidChange() {
    super.safeAreaInsetsDidChange()

    if _safeAreaInsets != safeAreaInsets {
        _safeAreaInsets = safeAreaInsets

        invalidateIntrinsicContentSize()
        superview?.setNeedsLayout()
        superview?.layoutSubviews()
    }
}

override func sizeThatFits(_ size: CGSize) -> CGSize {
    var size = super.sizeThatFits(size)
    if #available(iOS 12.0, *) {
        let bottomInset = safeAreaInsets.bottom
        if bottomInset > 0 && size.height < 50 && (size.height + bottomInset < 90) {
            size.height += bottomInset
        }
    }
    return size
}

override var frame: CGRect {
    get {
        return super.frame
    }
    set {
        var tmp = newValue
        if let superview = superview, tmp.maxY !=
                superview.frame.height {
            tmp.Origin.y = superview.frame.height - tmp.height
        }

        super.frame = tmp
    }
}

override func layoutSubviews() {
    super.layoutSubviews()
    let state = subviews.map { $0.frame }
    if (state.first { $0.width == 0 } == nil) {
        _subviewsFrames = state
    } else {
        Zip(subviews, _subviewsFrames).forEach { (view, rect) in
            view.frame = rect
        }
    }

}
}
0
Maxime Ashurov

Apple теперь исправила эту проблему в iOS 12.1.1

0
Gurunathan