Các biểu tượng và tiêu đề UITabBar của iOS 11 giả lập trên iPhone X được hiển thị trên cùng bao gồm nhau


134

Bất cứ ai có vấn đề với trình giả lập iPhone X xung quanh thành phần UITabBar?

Của tôi dường như hiển thị các biểu tượng và tiêu đề chồng lên nhau, tôi không chắc là mình có thiếu thứ gì không, tôi cũng đã chạy nó trong trình giả lập iPhone 8 và một thiết bị thực tế trông rất ổn như thể hiện trên bảng truyện.

iPhone X:

Lỗi iPhone X UITabBar

iPhone 8

iPhone 8 UITabBar hoạt động


1
Vấn đề tương tự của tôi: chế độ xem hình ảnh chỉ báo lựa chọn chìm trong tab Chế độ xem khoảng 16 điểm trong iPhone X.
Itachi

FYI - điều này không may không được sửa trong Xcode 9.2beta
tdios

Đây là một lỗi uikit vẫn còn tồn tại. Các ràng buộc phải được thiết lập vừa phải. Xem câu trả lời của tôi dưới đây!
RyanM

Tôi gặp vấn đề như vậy Kiểm tra câu trả lời này stackoverflow.com/a/53524635/5441253
Maxime Ashurov

Câu trả lời:


40

Tôi đã có thể khắc phục vấn đề bằng cách gọi không hợp lệIntrinsicContentSize trên UITabBar trong viewDidLayoutSubview.

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    [self.tabBar invalidateIntrinsicContentSize];
}

Lưu ý: Phần dưới cùng của thanh tab sẽ cần được chứa ở dưới cùng của chế độ xem chính, thay vì vùng an toàn và thanh tab không được hạn chế chiều cao.


Tôi đã có một thanh tab không có ràng buộc về chiều cao, bị ràng buộc với Hướng dẫn bố cục dưới cùng và điều này không phù hợp với tôi. Còn ý tưởng nào khác không?
Kenny Wyland

1
Không hoạt động khi homeVC trình bày VC A, sau đó loại bỏ A và đẩy VC B khỏi homeVC. Đây là một stackoverflow
ooops

1
Thêm phương pháp này kết hợp với ghim thanh tab vào dưới cùng của giám sát của nó ( không phải vùng an toàn) làm việc cho tôi.
vẽ C

3
Tôi cũng cần phải thêm [self.view layoutIfNeeded].
Iulian Onofrei

1
Điều này hoạt động nhưng tôi đã học được tôi cũng phải chú ý đến kích thước của hình ảnh trong các nút thanh tab. Ở chế độ ngang (trên thiết bị nhỏ gọn, nhưng không phải kiểu iPad và iPhone Plus), hệ thống sử dụng thanh tab nhỏ gọn được cho là có hình ảnh nhỏ hơn mà bạn có thể đặt với thuộc landscapeImagetính của nút thanh tab. Các kích thước được đề xuất nằm trong [Apple HIG] ( developer.apple.com/design/human-interface-guferences/ios/ gợi ) dưới Kích thước biểu tượng tùy chỉnh
RobP

25

Câu trả lời được cung cấp bởi VoidLess chỉ khắc phục các sự cố TabBar. Nó khắc phục các vấn đề về bố cục trong thanh tab, nhưng nếu bạn sử dụng trình điều khiển che giấu thanh tab, thanh tab được hiển thị không chính xác trong khi hoạt ảnh (để tái tạo tốt nhất là có 2 cách ly - một chế độ và một lần đẩy. Nếu bạn thay thế các dấu cách, bạn có thể xem thanh tab được đưa ra khỏi vị trí). Các mã dưới đây sửa chữa cả hai vấn đề. Táo làm tốt lắm.

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

Mã mục tiêu-C:

@implementation VSTabBarFix {
    UIEdgeInsets oldSafeAreaInsets;
}


- (void)awakeFromNib {
    [super awakeFromNib];

    oldSafeAreaInsets = UIEdgeInsetsZero;
}


- (void)safeAreaInsetsDidChange {
    [super safeAreaInsetsDidChange];

    if (!UIEdgeInsetsEqualToEdgeInsets(oldSafeAreaInsets, self.safeAreaInsets)) {
        [self invalidateIntrinsicContentSize];

        if (self.superview) {
            [self.superview setNeedsLayout];
            [self.superview layoutSubviews];
        }
    }
}

- (CGSize)sizeThatFits:(CGSize)size {
    size = [super sizeThatFits:size];

    if (@available(iOS 11.0, *)) {
        float bottomInset = self.safeAreaInsets.bottom;
        if (bottomInset > 0 && size.height < 50 && (size.height + bottomInset < 90)) {
            size.height += bottomInset;
        }
    }

    return size;
}


- (void)setFrame:(CGRect)frame {
    if (self.superview) {
        if (frame.origin.y + frame.size.height != self.superview.frame.size.height) {
            frame.origin.y = self.superview.frame.size.height - frame.size.height;
        }
    }
    [super setFrame:frame];
}


@end

Giải pháp hoàn chỉnh. Cảm ơn.
Sayalee Pote

4
Cảm ơn bạn vì câu trả lời. Nhưng làm thế nào để bạn sử dụng nó trong một lớp UITabBarControll?
Jojo

2
@Jojo, được cho biết cần bao nhiêu mã để điền vào thanh tab thông qua mã, tôi luôn tạo trình điều khiển uitabbar bằng bảng phân cảnh. Ở đó bạn có thể gán lớp tùy chỉnh cho thanh tab. Hi vọng điêu nay co ich.
Raimundas Sakalauskas

sự cố này không xảy ra trên thiết bị thực Tôi đã thử nghiệm điều này trên iPhone11 pro iOS 13
Akshay Jadhav

22

Có một mẹo mà chúng ta có thể giải quyết vấn đề.

Chỉ cần đặt UITabBar của bạn trong một UIView.

Điều này thực sự làm việc cho tôi.

Hoặc bạn có thể theo liên kết này để biết thêm chi tiết.


3
Điều này hoạt động tốt, có một uiview chỉ đơn giản chứa UITabBar. Đặt các phần tiếp giáp với các khu vực an toàn trên UIView (L, R và Dưới cùng), cho chiều cao (49) và giới hạn UITabBar cho UIView ở mọi phía.
sdsykes

1
Giải pháp này đã làm việc cho tôi. Tôi đã không sử dụng UITabControll, chỉ là UITabBar.
Riccardo Tesio

1
Đã làm cho tôi. Cảm ơn
francis lanthier

1
Điều này đã giúp tôi ra ngoài! Cảm ơn bạn!
Glenn

2
Điều này hoạt động nhưng sau đó khu vực "không an toàn" có thể không cùng màu với thanh tab (trong trường hợp siêu xem và thanh tab không cùng màu)
iDev

16

ghi đè UITabBar sizeThatFits(_)cho safeArea

extension UITabBar {
    static let height: CGFloat = 49.0

    override open func sizeThatFits(_ size: CGSize) -> CGSize {
        guard let window = UIApplication.shared.keyWindow else {
            return super.sizeThatFits(size)
        }
        var sizeThatFits = super.sizeThatFits(size)
        if #available(iOS 11.0, *) {
            sizeThatFits.height = UITabBar.height + window.safeAreaInsets.bottom
        } else {
            sizeThatFits.height = UITabBar.height
        }
        return sizeThatFits
    }
}

Xuất sắc. Tôi vừa đặt kích thước tùy chỉnh của thanh tab của mình và tự hỏi tại sao nó không hoạt động trên iPhoneX. Các giải pháp khác không hoạt động đối với tôi vì tôi đang sử dụng Trình điều khiển Tab Bar và nó không bao gồm các ràng buộc.
Jindřich Rohlík

12

Tôi đã thêm điều này vào viewWillAppeartùy chỉnh của mình UITabBarController, vì không có câu trả lời nào được cung cấp cho tôi:

tabBar.invalidateIntrinsicContentSize()
tabBar.superview?.setNeedsLayout()
tabBar.superview?.layoutSubviews()

1
Điều này giúp tôi khắc phục sự cố liên quan đến việc di chuyển tabBar lên trên cùng của màn hình. Cảm ơn bạn!
Jay

Nhưng không phải cho tôi :(
Nick

9

Tôi đã từng gặp vấn đề tương tự.

nhập mô tả hình ảnh ở đây

Nếu tôi đặt bất kỳ hằng số khác không trên ràng buộc dưới cùng của UITabBar đến vùng an toàn:

nhập mô tả hình ảnh ở đây

Nó bắt đầu hoạt động như mong đợi ...

nhập mô tả hình ảnh ở đây

Đó là thay đổi duy nhất tôi đã thực hiện và tôi không biết tại sao nó lại hoạt động nhưng nếu có ai tôi muốn biết.


1
Đây là những gì tôi đã làm vào cuối để làm cho nó hoạt động, nhưng vâng tôi không biết tại sao hoặc hiểu những gì nó đang làm. Đối với tôi nó vẫn cảm thấy như một lỗi
adrian chen

7

Di chuyển thanh tab 1 điểm từ phía dưới làm việc cho tôi.

Tất nhiên, bạn sẽ có một khoảng trống bằng cách làm như vậy mà bạn sẽ phải điền theo một cách nào đó, nhưng văn bản / biểu tượng hiện được đặt đúng vị trí.


7

Aha! Đó thực sự là ma thuật!

Cuối cùng tôi đã tìm ra điều này sau nhiều giờ chửi bới Apple.

UIKit thực sự xử lý việc này cho bạn và có vẻ như các mục thanh tab đã thay đổi là do thiết lập không chính xác (và có thể là lỗi UIKit thực tế). Không cần phân lớp hoặc xem nền.

UITabBar sẽ "chỉ hoạt động" nếu nó bị giới hạn ở đáy của giám sát, KHÔNG ở vùng an toàn dưới cùng .

Nó thậm chí hoạt động trong Trình xây dựng giao diện.

Cài đặt đúng

Làm việc trong IB

  1. Trong trình tạo giao diện, xem dưới dạng iPhone X, kéo UITabBar ra nơi nó khớp vào vùng an toàn phía dưới. Khi bạn thả nó, nó sẽ trông chính xác (lấp đầy khoảng trống đến cạnh dưới cùng).
  2. Sau đó, bạn có thể thực hiện "Thêm các ràng buộc thiếu" và IB sẽ thêm các ràng buộc chính xác và thanh tab của bạn sẽ hoạt động một cách kỳ diệu trên tất cả các iPhone! (Lưu ý rằng ràng buộc dưới có vẻ như nó có giá trị không đổi bằng chiều cao của khu vực không an toàn của iPhone X, nhưng hằng số thực sự là 0)

Đôi khi nó vẫn không hoạt động

Bị hỏng ở IB

Điều thực sự ngu ngốc là bạn cũng có thể nhìn thấy lỗi trong IB, ngay cả khi bạn thêm các ràng buộc chính xác mà IB thêm vào trong các bước trên!

  1. Kéo ra một UITabBar và không gắn nó vào phần dưới cùng của vùng an toàn
  2. Thêm tất cả các ràng buộc hàng đầu, theo dõi và dưới cùng vào giám sát (khu vực không an toàn) Thật kỳ lạ, điều này sẽ tự khắc phục nếu bạn thực hiện "Mục đầu tiên và mục thứ hai" trong trình kiểm tra ràng buộc cho ràng buộc dưới. ¯_ (ツ) _ /

đã thay đổi tất cả các ràng buộc từ khu vực an toàn sang giám sát và làm việc. Huyền thoại Ryan
RyanTCB

6

Đã sửa lỗi bằng cách sử dụng UITabBar được phân lớp để áp dụng safeAreaInsets:

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

Giải quyết một phần của các vấn đề, nhưng không phải tất cả. Xin vui lòng xem câu trả lời đầy đủ dưới đây
Raimundas Sakalauskas

Nó hoạt động với tôi khi tôi cố gắng trình bày VCA, sau đó loại bỏ VCA, đẩy VCB.
Tai Le

Điều này làm việc cho tôi nhưng tôi cần đặt các ràng buộc dưới cùng cho giám sát và không phải là khu vực an toàn.
yajra

Tôi phải làm gì với lớp mới này sau khi tôi tạo nó? Tôi đã thử xem qua ứng dụng của mình cho bất kỳ sự xuất hiện nào của UITabBar và thay thế chúng bằng SafeAreaFixTabBar ... Tôi đã tìm thấy những sự cố này: ứng dụng func (_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIAppla () .barTintColor = ... SafeAreaFixTabBar.appparent (). backgroundColor = ... SafeAreaFixTabBar.appftime (). tintColor = ... Nhưng không sửa được gì
user1019042

4

Giải quyết cho tôi bằng cách gọi [tabController.view setNeedsLayout];sau khi loại bỏ phương thức trong khối hoàn thành.

[vc dismissViewControllerAnimated:YES completion:^(){ 
     UITabBarController* tabController = [UIApplication sharedApplication].delegate.window.rootViewController;
     [tabController.view setNeedsLayout];
}];

2

UITabBar đang tăng chiều cao để ở trên nút home / line, nhưng vẽ phần phụ ở vị trí ban đầu của nó và phủ UITabBarItem lên trên phần phụ.

Như một giải pháp thay thế, bạn có thể phát hiện iPhone X và sau đó thu nhỏ chiều cao của chế độ xem 32px để đảm bảo thanh tab được hiển thị trong vùng an toàn phía trên đường nhà.

Ví dụ: nếu bạn đang tạo TabBar theo chương trình thay thế

self.tabBarController = [[UITabBarController alloc] init];
self.window.rootViewController = self.tabBarController;

Với cái này:

#define IS_IPHONEX (([[UIScreen mainScreen] bounds].size.height-812)?NO:YES)
self.tabBarController = [[UITabBarController alloc] init];    
self.window.rootViewController = [[UIViewController alloc] init] ;
if(IS_IPHONEX)
    self.window.rootViewController.view.frame = CGRectMake(self.window.rootViewController.view.frame.origin.x, self.window.rootViewController.view.frame.origin.y, self.window.rootViewController.view.frame.size.width, self.window.rootViewController.view.frame.size.height + 32) ;
[self.window.rootViewController.view addSubview:self.tabBarController.view];
self.tabBarController.tabBar.barTintColor = [UIColor colorWithWhite:0.98 alpha:1.0] ;
self.window.rootViewController.view.backgroundColor = [UIColor colorWithWhite:0.98 alpha:1.0] ;

LƯU Ý: Đây cũng có thể là một lỗi, vì kích thước khung nhìn và bố cục thanh tab được đặt bởi HĐH. Nó có thể sẽ hiển thị theo ảnh chụp màn hình của Apple trong Nguyên tắc giao diện con người của iPhone X tại đây: https://developer.apple.com/ios/human-interface-guferences/overview/iphone-x/


1
Tôi thấy, tôi đã không tạo thanh Tab theo lập trình, tôi đã sử dụng bảng phân cảnh để xây dựng nó với các ràng buộc được đặt ở dưới cùng của màn hình. Tôi cảm thấy kỳ lạ với chúng tôi rằng chúng tôi phải phát hiện nếu đó là iPhone X thì hãy thực hiện một số điều chỉnh về bố cục, trong khi chúng chỉ tự tăng chiều cao của TabBar mà không có bất kỳ thay đổi mã nào.
chrian

Điều này cảm thấy giống như một lỗi với tôi bây giờ, tôi nghĩ rằng tôi sẽ làm một báo cáo lỗi về điều này và xem những gì phát sinh từ nó. Cảm ơn bạn đã giúp đỡ!!
chrian

Thực sự không phải là một ý tưởng tuyệt vời để sử dụng chiều cao chính xác của giới hạn màn hình chính để xác định xem ứng dụng có chạy trên iPhone X hay không. Điều gì xảy ra nếu model năm sau có cùng kích thước? Hoặc nếu ứng dụng đang chạy ở chế độ ngang?
roperklacks

Độ trong suốt dường như không ảnh hưởng đến các biểu tượng của tôi được đặt không đúng cách. Họ đang rối tung cho dù UITabBar mờ đục hay trong suốt.
Adama

Có vẻ như bạn đang thực sự thêm 32px vào chiều cao của khung chứ không phải trừ đi?
Perry

2

Trường hợp của tôi là tôi đã đặt chiều cao UITabBar tùy chỉnh trong UITabBarControll của mình, như sau:

  override func viewWillLayoutSubviews() {            
        var tabFrame = tabBar.frame
        tabFrame.size.height = 60
        tabFrame.origin.y = self.view.frame.size.height - 60
        tabBar.frame = tabFrame
    }

Xóa mã này là giải pháp để TabBar hiển thị chính xác trên iPhone X.


2

Giải pháp đơn giản nhất tôi tìm thấy là chỉ cần thêm một khoảng trống 0,2 pt giữa dưới cùng của thanh tab và dưới cùng của safeAreaLayoutGuide.bottomAnchor như vậy.

tabBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -0.2)

1

Tôi đã gặp vấn đề tương tự khi tôi cố gắng đặt khung của UITabBar trong TabBarControll tùy chỉnh của mình.

self.tabBar.frame = CGRectMake(0, self.view.frame.size.height - kTabBarHeight, self.view.frame.size.width, kTabBarHeight);

Khi tôi chỉ điều chỉnh nó sang kích thước mới, vấn đề đã biến mất

if(IS_IPHONE_X){
    self.tabBar.frame = CGRectMake(0, self.view.frame.size.height - kPhoneXTabBarHeight, self.view.frame.size.width, kPhoneXTabBarHeight);
}
else{
    self.tabBar.frame = CGRectMake(0, self.view.frame.size.height - kTabBarHeight, self.view.frame.size.width, kTabBarHeight);
}

1
Các giá trị của là kPhoneXTabBarHeight gì?
Tiago Veloso

Tôi vừa thêm 32 điểm vào giá trị trước đó của kTabBarHeight (là 45). Nhưng bạn không phải chỉ định chính xác cùng một giá trị, đối với tôi nó cũng hoạt động tốt mà không chỉ định khung cho tabBar. Nhưng nếu bạn chỉ định nó, bạn phải điều chỉnh chiều cao bổ sung trên iPhone X.
Evgeny

1
Tổng số hack, nhưng nó là một trong những giải pháp duy nhất khiến nó phù hợp với tôi.
Kenny Wyland

Khi bạn có chế độ xem tùy chỉnh làm thanh tab, bạn muốn sử dụng bản hack này để làm cho chế độ xem tùy chỉnh của bạn phù hợp với iPhone X.
Hemang

1
@Hemang không, đã 45 tuổi cho dự án này tôi đã mượn mã này.
Evgeny

1

Tôi đã gặp điều này hôm nay với aa UITabBar được thêm thủ công vào trình điều khiển chế độ xem trong bảng phân cảnh, khi căn chỉnh xuống dưới cùng của vùng an toàn với hằng số 0 tôi sẽ gặp sự cố nhưng thay đổi nó thành 1 sẽ khắc phục vấn đề. Ứng dụng của tôi có UITabBar tăng hơn 1 pixel so với bình thường là điều có thể chấp nhận được đối với ứng dụng của tôi.


Không làm việc cho tôi. Tôi cũng đang sử dụng một UITabBar được thêm thủ công.
Kenny Wyland

1

Tôi đã gãi đầu về vấn đề này. Nó dường như được liên kết với cách tabBar được khởi tạo và thêm vào để xem phân cấp. Tôi cũng đã thử các giải pháp trên như gọi điện invalidateIntrinsicContentSize, đặt khung và cả bottomInsetsbên trong lớp con UITabBar. Tuy nhiên, chúng dường như hoạt động tạm thời và chúng phá vỡ một số kịch bản khác hoặc hồi quy thanh tab bằng cách gây ra một số vấn đề bố cục mơ hồ. Khi tôi gỡ lỗi sự cố, tôi đã thử gán các hạn chế về chiều cao cho UITabBar và cent trung tâm, tuy nhiên không khắc phục được sự cố. Tôi nhận ra trong trình gỡ lỗi xem rằng chiều cao của tabBar là chính xác trước và sau khi sự cố được sao chép, điều đó khiến tôi nghĩ rằng vấn đề nằm trong các cuộc phỏng vấn. Tôi đã sử dụng đoạn mã dưới đây để khắc phục thành công sự cố này mà không cần hồi quy bất kỳ kịch bản nào khác.

- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    if (DEVICE_IS_IPHONEX())
    {
        [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
            for (UIView *view in self.tabBar.subviews)
            {
                if ([NSStringFromClass(view.class) containsString:@"UITabBarButton"])
                {
                    if (@available (iOS 11, *))
                    {
                        [view.bottomAnchor constraintEqualToAnchor:view.superview.safeAreaLayoutGuide.bottomAnchor].active = YES;
                    }
                }
            }
        } completion:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
            [self.tabBar layoutSubviews];
        }];
    }
}

Giả định: Tôi chỉ làm điều này cho iPhone X, vì nó dường như không sao chép trên bất kỳ thiết bị nào khác vào lúc này. Dựa trên giả định rằng Apple không thay đổi tên của lớp UITabBarButton trong các bản phát hành iOS trong tương lai. Chúng tôi chỉ thực hiện điều này trên UITabBarButton khi có nghĩa là nếu apple thêm nhiều cuộc phỏng vấn nội bộ vào UITabBar, chúng tôi có thể cần phải sửa đổi mã để điều chỉnh cho điều đó.

Xin vui lòng cho biết nếu điều này hoạt động, sẽ được mở để đề xuất và cải tiến!

Nó nên đơn giản để tạo ra một tương đương nhanh chóng cho việc này.


Tôi đặt cái này vào viewDidAppear(animated:)trong UITabBarControllervà nó hoạt động tốt. Cảm ơn!
Albert Bori

1
những gì param u thông qua kích thước và điều phối viên? từ xem didAppear
sulabh

1

Từ hướng dẫn này:

https://github.com/eggswift/ESTabBarControll

và sau khi khởi tạo thanh tab viết dòng này trong lớp appdelegate

(self.tabBarController.tabBar as? ESTabBar)?.itemCustomPositioning = .fillIncludeSeparator

Giải quyết vấn đề của tôi về thanh tab.

Hy vọng nó giải quyết vấn đề của bạn

Cảm ơn


1

Chọn thanh tab và đặt hộp kiểm "Lưu lề tương đối khu vực" trong Trình chỉnh sửa thanh tra như thế này:

nhập mô tả hình ảnh ở đây


1

Tôi gặp vấn đề tương tự, lúc đầu nó được hiển thị chính xác nhưng sau khi thiết lập badgeValuetrên một trong các tabBarItem, nó đã phá vỡ bố cục. Những gì nó làm việc cho tôi mà không cần phân lớp UITabBarlà cái này, trên UITabBarControllerlớp con đã được tạo của tôi .

-(void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    NSLayoutYAxisAnchor *tabBarBottomAnchor = self.tabBar.bottomAnchor;
    NSLayoutYAxisAnchor *tabBarSuperviewBottomAnchor = self.tabBar.superview.bottomAnchor;
    [tabBarBottomAnchor constraintEqualToAnchor:tabBarSuperviewBottomAnchor].active = YES;
    [self.view layoutIfNeeded];
}

Tôi đã sử dụng giám sát tabBar để đảm bảo rằng các ràng buộc / neo nằm trên cùng một hệ thống phân cấp xem và tránh sự cố.

Dựa trên sự hiểu biết của tôi, vì đây có vẻ là một lỗi UIKit, chúng ta chỉ cần viết lại / đặt lại các ràng buộc của thanh tab để công cụ bố trí tự động có thể bố trí lại thanh tab một cách chính xác.


0

Nếu bạn có bất kỳ hạn chế về chiều cao nào cho Tab Bar, hãy thử gỡ bỏ nó.

Đối mặt với cùng một vấn đề và loại bỏ điều này đã giải quyết vấn đề.


0

Tôi đã tạo UITabBarContoder mới trong bảng phân cảnh của mình và đẩy tất cả các bộ điều khiển xem sang UITabBarConttoller mới này. Vì vậy, tất cả đều hoạt động tốt trong trình giả lập iPhone X.


Điều này cũng đã sửa nó cho tôi. Có điều gì đó khác biệt về cách Xcode 9 IB tạo XML của UITabBarContoder đã khắc phục sự cố.
Tiago

0

Đối với iPhone, bạn có thể thực hiện việc này, Phân lớp UITabBarControll.

class MyTabBarController: UITabBarController {

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    if #available(iOS 11, *) {
        self.tabBar.heightAnchor.constraint(equalToConstant: 40).isActive = true
        self.tabBar.invalidateIntrinsicContentSize()
    }
  }
}

Bảng phân cảnh Goto và cho phép sử dụng Hướng dẫn bố cục vùng an toàn và thay đổi lớp của UITabbarControll thành MyTabBarCont kiểm

PS Giải pháp này không được thử nghiệm trong trường hợp ứng dụng phổ thông và iPad.


0

thử thay đổi màn hình giật gân với kích thước @ 3x là (3726 × 6624)


Điều gì xảy ra nếu chúng ta đang sử dụng Bảng phân cảnh LaunchScreen?
Avineet Gupta

Không sao, chỉ cần sử dụng kích thước mới giật gân
Sob7y

0

Đối với tôi, loại bỏ [self.tabBar setBackgroundImage:]công việc, có thể đó là lỗi UIKit


0

Đối với tôi điều này đã khắc phục tất cả các vấn đề:

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        let currentHeight = tabBar.frame.height
        tabBar.frame = CGRect(x: 0, y: view.frame.size.height - currentHeight, width: view.frame.size.width, height: currentHeight)
    }

0

Tôi đã sử dụng một UITabBarControllerbảng phân cảnh và lúc đầu nó hoạt động tốt với tôi, nhưng sau khi nâng cấp lên phiên bản Xcode mới hơn, nó bắt đầu cho tôi các vấn đề liên quan đến chiều cao của tabBar.

Đối với tôi, cách khắc phục là xóa cái hiện có UITabBarControllerkhỏi bảng phân cảnh và tạo lại bằng cách kéo nó từ thư viện đối tượng xây dựng giao diện .


0

Đối với những người viết toàn bộ UITabBarControllerchương trình, bạn có thể sử dụngUITabBarItem.appearance().titlePositionAdjustment để điều chỉnh vị trí tiêu đề

Vì vậy, trong trường hợp này bạn muốn thêm một khoảng cách giữa Biểu tượng và Tiêu đề, hãy sử dụng nó trong viewDidLoad:

    override func viewDidLoad() {
        super.viewDidLoad()

        // Specify amount to offset a position, positive for right or down, negative for left or up
        let verticalUIOffset = UIOffset(horizontal: 0, vertical: hasTopNotch() ? 5 : 0)

        UITabBarItem.appearance().titlePositionAdjustment = verticalUIOffset
    }

phát hiện nếu thiết bị có màn hình Notch:

  func hasTopNotch() -> Bool {
      if #available(iOS 11.0, tvOS 11.0, *) {
        return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
      }
      return false
  }

-1

Tôi đã có cùng một vấn đề đã được giải quyết bằng cách đặt các mục của tabBar sau khi thanh tab được đặt ra.

Trong trường hợp của tôi, vấn đề xảy ra khi:

  1. Có một bộ điều khiển xem tùy chỉnh
  2. Một UITabBar được tạo trong trình khởi tạo của trình điều khiển khung nhìn
  3. Các mục thanh tab được đặt trước khi tải đã tải
  4. Trong chế độ xem đã tải, thanh tab được thêm vào chế độ xem chính của trình điều khiển chế độ xem
  5. Sau đó, các mục được hiển thị như bạn đề cập.

-1

Tôi nghĩ rằng đây là một lỗi UIKit từ iPhoneX. bởi vì nó hoạt động:

if (@available(iOS 11.0, *)) {
    if ([UIApplication sharedApplication].keyWindow.safeAreaInsets.top > 0.0) {
       self.tabBarBottomLayoutConstraint.constant = 1.0;
    }
} 

bạn có thể cung cấp thêm thông tin về tabBarBottomLayoutConstraint không?
dùng3099837

-1

Tôi tin rằng bạn có thể đang đặt thanh tab theo hướng dẫn bố cục an toàn dưới cùng. Đây có lẽ không phải là điều bạn muốn vì thanh tab dường như tự thực hiện các tính toán của mình để định vị các mục thanh tab một cách an toàn trên đầu trang chủ trong iPhone X. Thiết lập ràng buộc dưới cùng của bạn so với đáy giám sát . Bạn sẽ thấy rằng nó xuất hiện chính xác trên iPhone X cũng như các iPhone khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.