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

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

введите описание изображения здесь

введите описание изображения здесь

Ответ 1

"File inspector"

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

Align to safe area

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

Align to Superview

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

Ответ 8

Решение для меня состояло в том, что у меня была настроенная высота 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.

Ответ 9

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

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

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

Ответ 10

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

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

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

Ответ 11

Это сработало для меня.

[self.tabBar.bottomAnchor constraintEqualToAnchor:self.view.layoutMarginsGuide.bottomAnchor].active = YES;

Ответ 12

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

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

Ответ 13

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

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

Решение:

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

Ответ 14

Существует подкласс 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
        }
    }

}
}

Ответ 15

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

Ответ 16

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

self.view.layoutIfNeeded()

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

Ответ 17

Добавьте этот код в viewDidLoad

DispatchQueue.main.async {
            let size = CGSize(width: self.tabBar.frame.width / numberOfTabsFloat,
                              height: self.tabBar.frame.height)
            let image = UIImage.drawTabBarIndicator(color: UIColor.white,
                                                   size: size,
                                                   onTop: false)
            UITabBar.appearance().selectionIndicatorImage = image
            self.tabBar.selectionIndicatorImage = image
        }

и добавьте это расширение

extension UIImage{
    //Draws the top indicator by making image with filling color
    class func drawTabBarIndicator(color: UIColor, size: CGSize, onTop: Bool) -> UIImage {
        let indicatorHeight = size.height
        let yPosition = onTop ? 0 : (size.height - indicatorHeight)

        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        color.setFill()
        UIRectFill(CGRect(x: 0, y: yPosition, width: size.width, height: indicatorHeight))
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image!
    }
}

Ответ 18

Поместите это в свой UITabBarViewController, чтобы исправить высоту TabBar, если ваш UIViewController является вращающимся.

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        tabBar.sizeToFit()
    }

Ответ 19

Я столкнулся с этой косметической проблемой только выше iOS 11.0 и ниже 12.0.

enter image description here

У меня был класс CustomTabBar, унаследованный от UITabBar. Я переопределяю метод фрейма, как показано ниже:

- (CGRect)frame{
    return self.bounds;
}

Это решило эту проблему в большинстве версий iOS 11.0 *

Ответ 20

Хотя мой ответ запоздал, но позвольте мне убедиться, что если вы сталкиваетесь с подобной проблемой на экране iphone x, xs или max, убедитесь, что размер изображения, которое вы загружаете в качестве выделения, должен иметь высоту = ширина * 48pxВысота.

Ответ 21

(SWIFT или Objective-C)

enter image description here

  1. Добавить новый UIView
  2. Добавить ограничения

enter image description here

  1. Просто поместите ваш UITabBar в UIView
  2. Добавить ограничения

enter image description here

Результат:

enter image description here

Я надеюсь, что это может кому-то помочь.