經(jīng)過(guò)一晚上的不斷努力終于搞明白了ios 11 iPhone X 模擬器上出現(xiàn)TabBar移動(dòng)和跳轉(zhuǎn)的Bug的原因烫幕,都是safeAreaInsets引起的4涤伞G航病庐镐!下面是解決問(wèn)題的代碼:
A: 對(duì)應(yīng)的OC代碼:
#import "MyTabBar.h"
@interface MyTabBar()
@property (nonatomic,assign) UIEdgeInsets oldSafeAreaInsets;
@end
@implementation MyTabBar
// 解決iPhone X TabBar跳轉(zhuǎn)問(wèn)題
- (void) safeAreaInsetsDidChange
{
[super safeAreaInsetsDidChange];
if(self.oldSafeAreaInsets.left != self.safeAreaInsets.left ||
self.oldSafeAreaInsets.right != self.safeAreaInsets.right ||
self.oldSafeAreaInsets.top != self.safeAreaInsets.top ||
self.oldSafeAreaInsets.bottom != self.safeAreaInsets.bottom)
{
self.oldSafeAreaInsets = self.safeAreaInsets;
[self invalidateIntrinsicContentSize];
}
}
// 解決iPhone X TabBar移動(dòng)的問(wèn)題
- (CGSize) sizeThatFits:(CGSize) size
{
CGSize s = [super sizeThatFits:size];
if(@available(iOS 11.0, *))
{
CGFloat bottomInset = self.safeAreaInsets.bottom;
if( bottomInset > 0 && s.height < 50) {
s.height += bottomInset;
}
}
return s;
}
}
@end
B: 對(duì)應(yīng)的Swift代碼:
class SafeAreaFixTabBar: UITabBar {
var oldSafeAreaInsets = UIEdgeInsets.zero
@available(iOS 11.0, *)
override func safeAreaInsetsDidChange() {
super.safeAreaInsetsDidChange()
if oldSafeAreaInsets != safeAreaInsets {
oldSafeAreaInsets = safeAreaInsets
invalidateIntrinsicContentSize()
superview?.setNeedsLayout()
superview?.layoutSubviews()
}
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
var size = super.sizeThatFits(size)
if #available(iOS 11.0, *) {
let bottomInset = safeAreaInsets.bottom
if bottomInset > 0 && size.height < 50 {
size.height += bottomInset
}
}
return size
}
}
把上面的代碼放在繼承UITabBar的子類(lèi)里面恩商,然后在UITabBarControler的子類(lèi)里面[self setValue:tabBar forKeyPath:@"tabBar"];即可。
附:老外的文章鏈接:https://stackoverflow.com/questions/46214740/ios-11-iphone-x-simulator-uitabbar-icons-and-titles-being-rendered-on-top-coveri