經(jīng)過一晚上的不斷努力終于搞明白了ios 11 iPhone X 模擬器上出現(xiàn)TabBar移動和跳轉(zhuǎn)的Bug的原因,都是safeAreaInsets引起的!!!下面是解決問題的代碼:
A: 對應(yīng)的OC代碼:
#import "MyTabBar.h"
@interface MyTabBar()
@property (nonatomic,assign) UIEdgeInsets oldSafeAreaInsets;
@end
@implementation MyTabBar
// 解決iPhone X TabBar跳轉(zhuǎ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移動的問題
- (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: 對應(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的子類里面,然后在UITabBarControler的子類里面[self setValue:tabBar forKeyPath:@"tabBar"];即可。
附:老外的文章鏈接:https://stackoverflow.com/questions/46214740/ios-11-iphone-x-simulator-uitabbar-icons-and-titles-being-rendered-on-top-coveri