У меня проблема с моим приложением при тестировании на iPhone X. Я не уверен, как настроить эту проблему, а также не сделать ее проблемой для не iPhone X размеров. Это только кажется проблемой на симуляторе iPhone X.
Как исправить размер строки в строке вкладок на iPhone X
Ответ 1
"Инспектор файлов" справа от раскадровки 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 по суперпредставлению, а не по безопасной зоне. Если вы выровняете его по безопасной области, это будет выглядеть так:
И когда выровнен к суперпредставлению, он покажет правильно:
Я думаю, это потому, что 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.
- UITabBar.appearance(). SelectionIndicatorImage = #YOUR_IMAGE
- Убедитесь, что высота вашего изображения составляет 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.
У меня был класс CustomTabBar, унаследованный от UITabBar. Я переопределяю метод фрейма, как показано ниже:
- (CGRect)frame{
return self.bounds;
}
Это решило эту проблему в большинстве версий iOS 11.0 *
Ответ 20
Хотя мой ответ запоздал, но позвольте мне убедиться, что если вы сталкиваетесь с подобной проблемой на экране iphone x, xs или max, убедитесь, что размер изображения, которое вы загружаете в качестве выделения, должен иметь высоту = ширина * 48pxВысота.
Ответ 21
(SWIFT или Objective-C)
- Добавить новый UIView
- Добавить ограничения
- Просто поместите ваш UITabBar в UIView
- Добавить ограничения
Результат:
Я надеюсь, что это может кому-то помочь.