オンiOS 12.1 UITabBarサブクラスのsafeAreaInsetsをオーバーライドすることでこの問題を解決しました。
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
}
}
次のコードを使用して別のファイルを作成します。
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
}
}
IOS 11.3の場合、これは私のために働いた:
func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
tabBar.invalidateIntrinsicContentSize()
}
UITabbar selectionIndicatorImageを設定するには、以下のガイドラインに従ってください。
Tabbar selectionIndicatorImageのデフォルトの高さは49ですが、iPhone Xでは画像の高さは48に設定されます。
私にとっての解決策は、カスタム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でタブバーが正しく表示されます。
選択イメージを使用しているので、これはうまくいきました。
tabBar.selectionIndicatorImage = UIImage.imageWithColor(color: UIColor.NewDesignColor.yellow, size: tabBarItemSize).resizableImage(withCapInsets: UIEdgeInsets.init(top: 0, left: 0, bottom: 20, right: 0))
私の場合、下の差し込みを追加すると役立ちます。これがあなたにも役立つことを願っています。ありがとう。
同様の問題がありました。 viewDidLoad()でselectionIndicatorImageを設定していました。コードをviewDidLayoutSubviews()に移動すると、問題が修正されました。
クレイジーに見えますが、コードのこの行を削除するだけです
self.view.layoutIfNeeded()
画面に表示されないビューでlayoutIfNeededを呼び出すと、この問題が発生すると思います。とにかく、@ mohamed-ALiのソリューションも正しく機能します。ありがとうございます。
UIViewControllerが回転可能な場合、これをUITabBarViewControllerに入れてTabBarの高さを修正します。
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
tabBar.sizeToFit()
}
あなたを助けるかもしれないviewWillLayoutSubviewsのUITabBarのinvalidateIntrinsicContentSize。
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
self.tabBar.invalidateIntrinsicContentSize()
}
制約内-
「下部レイアウトガイド」で下部スペースを提供している場合、この問題が発生します。
解決策:
スーパービューに関して下部スペースを確保します。これは100%完璧に機能します。
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!
}
}
IPhone Xのすべての問題を解決するUITabBar
サブクラスがあります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
}
}
}
}
Appleはこの問題をiOS 12.1.1で修正しました
これは私のために働いた。
[self.tabBar.bottomAnchor constraintEqualToAnchor:self.view.layoutMarginsGuide.bottomAnchor].active = YES;