ไอคอน UITabBar จำลอง iOS 11 iPhone X และชื่อที่แสดงอยู่ด้านบนซึ่งครอบคลุมแต่ละอื่น ๆ


136

ใครมีปัญหากับเครื่องจำลอง iPhone X รอบ ๆ ส่วนประกอบ UITabBar?

ดูเหมือนว่าของฉันจะแสดงไอคอนและชื่อเรื่องอยู่ด้านบนของกันและกันฉันไม่แน่ใจว่าฉันพลาดอะไรไปหรือเปล่าฉันยังใช้งานมันในเครื่องจำลอง iPhone 8 และอุปกรณ์จริงหนึ่งเครื่องที่มันดูดีตามที่แสดงบน กระดานเรื่องราว

iPhone X:

ข้อบกพร่องของ iPhone X UITabBar

ไอโฟน 8

iPhone 8 UITabBar ใช้งานได้


1
ปัญหาที่คล้ายกันของฉัน: มุมมองภาพตัวบ่งชี้การเลือกจมลงในมุมมองแถบแถบประมาณ 16 จุดใน iPhone X
Itachi

FYI - สิ่งนี้ไม่ได้รับการแก้ไขใน Xcode 9.2beta
tdios

นี่คือบั๊ก uikit ที่ยังคงมีอยู่ ต้องตั้งค่าข้อ จำกัด ให้ถูกต้อง ดูคำตอบของฉันด้านล่าง!
RyanM

ฉันมีปัญหาเช่นนั้นตรวจสอบคำตอบนี้stackoverflow.com/a/53524635/5441253
Maxime Ashurov

คำตอบ:


41

ฉันสามารถแก้ไขปัญหาได้โดยเพียงแค่เรียก invalidateIntrinsicContentSize บน UITabBar ใน viewDidLayoutSubviews

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

หมายเหตุ: ด้านล่างของแถบแท็บจะต้องอยู่ที่ด้านล่างของมุมมองหลักแทนที่จะเป็นพื้นที่ปลอดภัยและแถบแท็บไม่ควรมีข้อจำกัดความสูง


ฉันมีแถบแท็บที่ไม่มีข้อ จำกัด ด้านความสูงถูก จำกัด ไว้ที่คำแนะนำเค้าโครงด้านล่างและสิ่งนี้ไม่ได้ผลสำหรับฉัน ความคิดอื่น ๆ ?
Kenny Wyland

1
ไม่ทำงานเมื่อ homeVC นำเสนอ VC A จากนั้นปิด A และกด VC B จาก homeVC นี่คือวิธีแก้ปัญหาstackoverflow.com/a/47225653/1553324
อ๊ะ

1
การเพิ่มวิธีนี้ร่วมกับการตรึงแถบแท็บที่ด้านล่างสุดของ superview ( ไม่ใช่พื้นที่ปลอดภัย) ได้ผลสำหรับฉัน
Drew C

3
[self.view layoutIfNeeded]ฉันยังจำเป็นที่จะเพิ่ม
Iulian Onofrei

1
วิธีนี้ใช้ได้ผล แต่ฉันได้เรียนรู้ว่าฉันต้องใส่ใจกับขนาดของรูปภาพในปุ่มแถบแท็บด้วย ในโหมดแนวนอน (บนอุปกรณ์ขนาดกะทัดรัด แต่ไม่ใช่รุ่น iPad และ iPhone Plus) ระบบจะใช้แถบแท็บขนาดกะทัดรัดซึ่งคาดว่าจะมีภาพขนาดเล็กที่คุณสามารถตั้งค่าได้ด้วยlandscapeImageคุณสมบัติของปุ่มแถบแท็บ ขนาดที่แนะนำอยู่ใน [Apple HIG's] ( developer.apple.com/design/human-interface-guidelines/ios/… ) ภายใต้Custom Icon Size
RobP

26

คำตอบจาก VoidLess แก้ไขปัญหา TabBar เพียงบางส่วน มันแก้ไขปัญหาเลย์เอาต์ภายในแถบแท็บ แต่ถ้าคุณใช้วิวคอนโทรลเลอร์ที่ซ่อนแถบแท็บแถบจะแสดงผลไม่ถูกต้องในระหว่างการเคลื่อนไหว (หากต้องการสร้างใหม่จะดีที่สุด 2 มี 2 เซ็กส์ - หนึ่งโมดอลและหนึ่งดันหากคุณสลับส่วนต่างๆกันคุณสามารถ ดูแถบแท็บถูกแสดงผลไม่อยู่ที่ตำแหน่ง) การร้องรหัสช่วยแก้ปัญหาทั้งสองอย่าง แอปเปิ้ลงานดี

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

รหัสวัตถุประสงค์ -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

โซลูชั่นที่สมบูรณ์ ขอบคุณ.
ยาลีพจน์

4
ขอบคุณสำหรับคำตอบ. แต่คุณจะใช้มันในคลาส UITabBarController ได้อย่างไร?
Jojo

2
@Jojo เมื่อกำหนดจำนวนรหัสที่จำเป็นในการเติมแถบแท็บผ่านรหัสฉันมักจะสร้าง uitabbarcontroller โดยใช้สตอรี่บอร์ด ที่นั่นคุณสามารถกำหนดคลาสที่กำหนดเองสำหรับแถบแท็บ หวังว่านี่จะช่วยได้
Raimundas Sakalauskas

ปัญหานี้ไม่เกิดขึ้นกับอุปกรณ์จริงที่ฉันได้ทดสอบบน iPhone11 pro iOS 13
Akshay Jadhav

22

มีเคล็ดลับที่เราสามารถแก้ปัญหาได้

เพียงใส่ UITabBar ของคุณใน UIView

นี่เป็นผลสำหรับฉันจริงๆ

หรือติดตามรายละเอียดเพิ่มเติมได้ที่ลิงค์นี้


3
วิธีนี้ใช้งานได้ดีมี uiview ที่มี UITabBar วางข้อห้ามไว้ในพื้นที่ปลอดภัยบน UIView (L, R และด้านล่าง) ให้ความสูง (49) และ จำกัด UITabBar กับ UIView ทุกด้าน
sdsykes

1
วิธีนี้ใช้ได้ผลสำหรับฉัน ฉันไม่ได้ใช้ UITabController เพียงแค่ UITabBar
Riccardo Tesio

1
ทำงานให้ฉัน ขอบคุณ
francis lanthier

1
สิ่งนี้ช่วยฉันได้! ขอบคุณ!
Glenn Posadas

2
วิธีนี้ใช้งานได้ แต่พื้นที่ที่ "ไม่ปลอดภัย" อาจไม่ใช่สีเดียวกับแถบแท็บ (ในกรณีที่มุมมองขั้นสูงและแถบแท็บไม่ใช่สีเดียวกัน)
iDev

18

แทนที่UITabBar sizeThatFits(_)สำหรับ 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
    }
}

ยอดเยี่ยม. ฉันเพิ่งตั้งค่าขนาดแท็บบาร์แบบกำหนดเองและสงสัยว่าทำไมมันไม่ทำงานบน iPhoneX วิธีแก้ปัญหาอื่น ๆ ไม่ได้ผลสำหรับฉันเนื่องจากฉันใช้ Tab Bar Controller และไม่มีข้อ จำกัด
JindřichRohlík

1
ดูเหมือนว่าเทคนิคนี้จะพังด้วย Xcode 12 / iOS 14
picciano

12

ฉันเพิ่มสิ่งนี้ลงviewWillAppearในแบบกำหนดเองของฉันUITabBarControllerเพราะไม่มีคำตอบที่ให้ไว้สำหรับฉัน:

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

1
สิ่งนี้ช่วยฉันแก้ไขปัญหาเกี่ยวกับการย้ายแถบแท็บไปที่ด้านบนสุดของหน้าจอ ขอบคุณ!
Jay

แต่ไม่ใช่สำหรับฉัน :(
นิค

9

ผมมีปัญหาเหมือนกัน.

ป้อนคำอธิบายภาพที่นี่

ถ้าฉันตั้งค่าคงที่ที่ไม่ใช่ศูนย์บนข้อ จำกัด ด้านล่างของ UITabBar เป็นพื้นที่ปลอดภัย:

ป้อนคำอธิบายภาพที่นี่

มันเริ่มทำงานตามที่คาดไว้ ...

ป้อนคำอธิบายภาพที่นี่

นั่นเป็นการเปลี่ยนแปลงเพียงอย่างเดียวที่ฉันทำและฉันไม่รู้ว่าทำไมมันถึงได้ผล แต่ถ้ามีใครฉันก็อยากรู้


1
นี่คือสิ่งที่ฉันทำในตอนท้ายเพื่อให้มันใช้งานได้ แต่ใช่ฉันไม่รู้ว่าทำไมหรือเข้าใจว่ามันทำอะไร สำหรับฉันมันยังรู้สึกเหมือนเป็นแมลง
adrian chen

7

การย้ายแถบแท็บออกไป 1 จุดจากด้านล่างได้ผลสำหรับฉัน

แน่นอนว่าคุณจะมีช่องว่างจากการทำเช่นนั้นซึ่งคุณจะต้องกรอกข้อมูลบางอย่าง แต่ตอนนี้ข้อความ / ไอคอนอยู่ในตำแหน่งที่เหมาะสมแล้ว


7

อ๊าาา! มันวิเศษจริง!

ในที่สุดฉันก็พบสิ่งนี้หลังจากหลายชั่วโมงของการด่า Apple

UIKit จัดการสิ่งนี้ให้คุณจริง ๆ และดูเหมือนว่ารายการแถบแท็บที่เลื่อนนั้นเกิดจากการตั้งค่าที่ไม่ถูกต้อง (และอาจเป็นข้อบกพร่องของ UIKit จริง) ไม่จำเป็นต้องมีคลาสย่อยหรือมุมมองพื้นหลัง

UITabBar จะ "เพียงแค่การทำงาน" ถ้ามันเป็นข้อ จำกัด ไปที่ด้านล่าง SuperView ที่ไม่ได้ไปยังพื้นที่ปลอดภัยด้านล่าง

มันยังใช้งานได้ในตัวสร้างอินเทอร์เฟซ

แก้ไขการตั้งค่า

ทำงานใน IB

  1. ในตัวสร้างอินเทอร์เฟซที่ดูเป็น iPhone X ให้ลาก UITabBar ออกไปยังตำแหน่งที่ยึดไปยังส่วนที่ฝังในพื้นที่ปลอดภัยด้านล่าง เมื่อคุณวางลงควรมีลักษณะที่ถูกต้อง (เติมช่องว่างจนสุดขอบด้านล่าง)
  2. จากนั้นคุณสามารถทำ "เพิ่มข้อ จำกัด ที่ขาดหายไป" และ IB จะเพิ่มข้อ จำกัด ที่ถูกต้องและแถบแท็บของคุณจะทำงานบน iPhone ทั้งหมดได้อย่างน่าอัศจรรย์! (โปรดทราบว่าข้อ จำกัด ด้านล่างดูเหมือนว่าจะมีค่าคงที่เท่ากับความสูงของพื้นที่ที่ไม่ปลอดภัยของ iPhone X แต่ค่าคงที่เป็น 0)

บางครั้งก็ยังใช้ไม่ได้

เสียใน IB

สิ่งที่โง่จริงๆคือคุณสามารถเห็นจุดบกพร่องใน IB ได้เช่นกันแม้ว่าคุณจะเพิ่มข้อ จำกัด ที่ IB เพิ่มในขั้นตอนด้านบนก็ตาม!

  1. ลาก UITabBar ออกมาและอย่าสแน็ปไปที่สิ่งที่ใส่เข้าไปในพื้นที่ปลอดภัยด้านล่าง
  2. เพิ่มข้อ จำกัด นำหน้าต่อท้ายและด้านล่างทั้งหมดลงในซูเปอร์วิว (ไม่ใช่พื้นที่ปลอดภัย) สิ่งนี้จะแก้ไขได้เองหากคุณทำ "ย้อนกลับรายการแรกและรายการที่สอง" ในตัวตรวจสอบข้อ จำกัด สำหรับข้อ จำกัด ด้านล่าง ¯_ (ツ) _ / ¯

เปลี่ยนข้อ จำกัด ทั้งหมดจากพื้นที่ปลอดภัยเป็น superview และใช้งานได้ Legend Ryan
RyanTCB

6

แก้ไขโดยใช้ UITabBar คลาสย่อยเพื่อใช้ 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
    }
}

แก้ปัญหาได้ส่วนหนึ่ง แต่ไม่ใช่ทั้งหมด โปรดดูคำตอบแบบเต็ม
Raimundas Sakalauskas

มันใช้ได้ผลสำหรับฉันเมื่อฉันพยายามนำเสนอ VCA จากนั้นปิด VCA ผลักดัน VCB
ไทเลอ

สิ่งนี้ใช้ได้กับฉัน แต่ฉันต้องใส่ข้อ จำกัด ด้านล่างให้กับซุปเปอร์วิวไม่ใช่พื้นที่ปลอดภัย
yajra

ฉันจะทำอย่างไรกับชั้นเรียนใหม่นี้หลังจากสร้างแล้ว ฉันพยายามมองหาแอปพลิเคชันของฉันเพื่อหา UITabBar ที่เกิดขึ้นและแทนที่ด้วย SafeAreaFixTabBar ... ฉันพบเหตุการณ์เหล่านี้: แอปพลิเคชัน func (_ แอปพลิเคชัน: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {SafeTabararance () .barTintColor = ... SafeAreaFixTabBar.appearance (). backgroundColor = ... SafeAreaFixTabBar.appearance (). tintColor = ... แต่ไม่ได้แก้ไขอะไร
user1019042

4

แก้ไขให้ฉันโดยการโทร[tabController.view setNeedsLayout];หลังจากปิดโมดอลในบล็อกเสร็จสิ้น

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

2

UITabBar มีความสูงเพิ่มขึ้นเพื่อให้อยู่เหนือปุ่ม / เส้นหน้าแรก แต่การวาดมุมมองย่อยในตำแหน่งเดิมและวางซ้อน UITabBarItem เหนือมุมมองย่อย

ในการแก้ปัญหาเบื้องต้นคุณสามารถตรวจจับ iPhone X จากนั้นลดความสูงของมุมมองลง 32px เพื่อให้แน่ใจว่าแถบแท็บแสดงในพื้นที่ปลอดภัยเหนือเส้นหลัก

ตัวอย่างเช่นหากคุณกำลังสร้าง TabBar โดยใช้โปรแกรมแทนที่

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

ด้วยสิ่งนี้:

#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] ;

หมายเหตุ: นี่อาจเป็นข้อบกพร่องเนื่องจากขนาดมุมมองและเค้าโครงแถบแท็บถูกกำหนดโดย OS มันควรจะแสดงตามภาพหน้าจอของ Apple ในแนวทางการเชื่อมต่อมนุษย์ของ iPhone X ที่นี่: https://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/


1
ฉันเห็นว่าฉันไม่ได้สร้างแถบแท็บตามโปรแกรมฉันใช้สตอรีบอร์ดสร้างโดยมีข้อ จำกัด ที่กำหนดให้อยู่ด้านล่างของหน้าจอ รู้สึกแปลกสำหรับฉันที่เราต้องตรวจสอบว่าเป็น iPhone X หรือไม่จากนั้นไปทำการ rejigging บนเค้าโครงในขณะที่พวกเขาเพียงแค่กระแทกความสูงของ TabBar ด้วยตัวเองโดยไม่มีการเปลี่ยนแปลงรหัสใด ๆ
adrian chen

ตอนนี้รู้สึกเหมือนเป็นข้อบกพร่องสำหรับฉันฉันคิดว่าฉันจะทำรายงานข้อบกพร่องเกี่ยวกับเรื่องนี้และดูว่ามีอะไรเกิดขึ้นบ้าง ขอบคุณสำหรับความช่วยเหลือของคุณ!!
adrian chen

ไม่ใช่ความคิดที่ดีที่จะใช้ความสูงที่แน่นอนของขอบเขตหน้าจอหลักเพื่อตรวจสอบว่าแอปกำลังทำงานบน iPhone X หรือไม่จะเกิดอะไรขึ้นถ้าโมเดลของปีหน้ามีขนาดจุดเท่ากัน หรือถ้าแอปทำงานในโหมดแนวนอน?
roperklacks

ความโปร่งใสดูเหมือนจะไม่มีผลต่อการตั้งค่าไอคอนของฉันอย่างไม่เหมาะสม พวกเขาสับสนไม่ว่า UITabBar จะทึบแสงหรือโปร่งใส
Adama

ดูเหมือนว่าคุณกำลังเพิ่ม 32px ให้กับความสูงของเฟรมแทนที่จะลบออก?
Perry

2

กรณีของฉันคือฉันได้ตั้งค่าความสูง UITabBar ที่กำหนดเองใน UITabBarController เช่นนี้:

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

การลบโค้ดนี้เป็นวิธีแก้ปัญหาเพื่อให้ TabBar แสดงอย่างถูกต้องบน iPhone X


2

วิธีแก้ปัญหาที่ง่ายที่สุดที่ฉันพบคือเพิ่มช่องว่าง 0.2 pt ระหว่างด้านล่างของแถบแท็บและด้านล่างของ safeAreaLayoutGuide.bottomAnchor เช่นนั้น

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

1

ฉันประสบปัญหาเดียวกันเมื่อพยายามตั้งค่าเฟรมของ UITabBar ใน TabBarController ที่กำหนดเอง

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

เมื่อฉันปรับให้มีขนาดใหม่ปัญหาก็หายไป

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
ค่าของkPhoneXTabBarHeight อะไร?
Tiago Veloso

ฉันเพิ่งเพิ่ม 32 คะแนนให้กับค่าก่อนหน้าของ kTabBarHeight (ซึ่งคือ 45) แต่คุณไม่จำเป็นต้องระบุค่าเดียวกันทั้งหมดสำหรับฉันมันก็ใช้งานได้ดีโดยไม่ต้องระบุเฟรมสำหรับ tabBar แต่ถ้าคุณระบุคุณต้องปรับความสูงเพิ่มเติมบน iPhone X
Evgeny

1
แฮ็คทั้งหมด แต่เป็นโซลูชันเดียวที่ทำให้ฉันดูดี
Kenny Wyland

เมื่อคุณมีมุมมองที่กำหนดเองเป็นแถบแท็บคุณต้องการใช้แฮ็คนี้เพื่อทำให้มุมมองที่กำหนดเองของคุณเหมาะกับ iPhone X
Hemang

1
@ เฮมังเลขที่ 45 สำหรับโครงการนี้ที่ฉันยืมรหัสนี้มา
Evgeny

1

ฉันพบสิ่งนี้ในวันนี้โดยมีการเพิ่ม UITabBar ลงในตัวควบคุมมุมมองในกระดานเรื่องราวด้วยตนเองเมื่อจัดตำแหน่งที่ด้านล่างของพื้นที่ปลอดภัยด้วยค่าคงที่เป็น 0 ฉันจะได้รับปัญหา แต่การเปลี่ยนเป็น 1 จะช่วยแก้ปัญหาได้ การมี UITabBar สูงกว่าปกติ 1 พิกเซลเป็นที่ยอมรับสำหรับแอปพลิเคชันของฉัน


ไม่ได้ผลสำหรับฉัน ฉันใช้ UITabBar ที่เพิ่มด้วยตนเองเช่นกัน
เคนนีไวแลนด์

1

ฉันเกาหัวของฉันเกี่ยวกับปัญหานี้ ดูเหมือนว่าจะเชื่อมโยงกับวิธีเริ่มต้นและเพิ่ม tabBar เพื่อดูลำดับชั้น ฉันยังลองวิธีแก้ปัญหาข้างต้นเช่นการโทรinvalidateIntrinsicContentSizeการตั้งค่าเฟรมและbottomInsetsภายในคลาสย่อย UITabBar อย่างไรก็ตามดูเหมือนว่าจะทำงานได้ชั่วคราวและทำให้สถานการณ์อื่น ๆ เสียหายหรือถอยหลังแถบแท็บโดยทำให้เกิดปัญหาเค้าโครงที่คลุมเครือ เมื่อฉันแก้ไขปัญหานี้ฉันพยายามกำหนดข้อ จำกัด ด้านความสูงให้กับ UITabBar และ centerYAnchor แต่ก็ไม่สามารถแก้ไขปัญหาได้ ฉันตระหนักในมุมมองดีบักเกอร์ว่าความสูงของ tabBar นั้นถูกต้องก่อนและหลังเกิดปัญหาขึ้นอีกครั้งซึ่งทำให้ฉันคิดว่าปัญหาอยู่ในมุมมองย่อย ฉันใช้รหัสด้านล่างเพื่อแก้ไขปัญหานี้ได้สำเร็จโดยไม่ต้องถอยกลับสถานการณ์อื่น ๆ

- (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];
        }];
    }
}

สมมติฐาน: ฉันกำลังทำสิ่งนี้สำหรับ iPhone X เท่านั้นเนื่องจากในขณะนี้ดูเหมือนจะไม่ทำซ้ำบนอุปกรณ์อื่น ๆ ตั้งอยู่บนสมมติฐานที่ว่า Apple ไม่ได้เปลี่ยนชื่อของคลาส UITabBarButton ในการเปิดตัว iOS ในอนาคต เรากำลังทำสิ่งนี้บน UITabBarButton ก็ต่อเมื่อหมายความว่าหาก apple เพิ่มมุมมองย่อยภายในเพิ่มเติมใน UITabBar เราอาจต้องแก้ไขโค้ดเพื่อปรับเปลี่ยนตามนั้น

โปรดทราบว่าการทำงานนี้จะเปิดรับข้อเสนอแนะและการปรับปรุง!

มันควรจะง่ายที่จะสร้างสิ่งที่เทียบเท่าอย่างรวดเร็วสำหรับสิ่งนี้


ฉันใส่สิ่งนี้ไว้viewDidAppear(animated:)ในของฉันUITabBarControllerและมันก็ใช้ได้ดี ขอบคุณ!
Albert Bori

1
คุณส่งผ่านขนาดและผู้ประสานงานอะไร จากมุมมอง didAppear
sulabh

1

จากบทช่วยสอนนี้:

https://github.com/eggswift/ESTabBarController

และหลังจากเริ่มต้นแถบแท็บที่เขียนบรรทัดนี้ในคลาส appdelegate

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

แก้ปัญหาแถบแท็บของฉัน

หวังว่าจะช่วยแก้ปัญหาของคุณได้

ขอบคุณ


1

เลือกแถบแท็บและตั้งค่าช่องทำเครื่องหมาย "Save Area Relative Margins" ใน Inspector Editor ดังนี้:

ป้อนคำอธิบายภาพที่นี่


1

ฉันมีปัญหาที่คล้ายกันในตอนแรกมันแสดงผลอย่างถูกต้อง แต่หลังจากตั้งค่าbadgeValueบน tabBarItem อันใดอันหนึ่งมันทำให้เค้าโครงพัง สิ่งที่ได้ผลสำหรับฉันโดยไม่ต้องมีคลาสย่อยUITabBarคือสิ่งนี้ในUITabBarControllerคลาสย่อยที่ฉันสร้างไว้แล้ว

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

ฉันใช้ tabBar superview เพื่อให้แน่ใจว่าข้อ จำกัด / จุดยึดอยู่ในลำดับชั้นของมุมมองเดียวกันและหลีกเลี่ยงข้อขัดข้อง

จากความเข้าใจของฉันเนื่องจากสิ่งนี้ดูเหมือนจะเป็นข้อผิดพลาดของ UIKit เราจึงต้องเขียนใหม่ / ตั้งค่าข้อ จำกัด แถบแท็บใหม่เพื่อให้เอ็นจิ้นการจัดวางอัตโนมัติสามารถจัดวางแถบแท็บได้อย่างถูกต้องอีกครั้ง


0

หากคุณมีข้อจำกัดความสูงสำหรับ Tab Bar ให้ลองลบออก

ประสบปัญหาเดียวกันและการลบสิ่งนี้จะช่วยแก้ปัญหาได้


0

ฉันสร้าง UITabBarController ใหม่ในสตอรีบอร์ดของฉันและผลักดันตัวควบคุมมุมมองทั้งหมดไปที่ UITabBarConttoller ใหม่นี้ ดังนั้นทั้งหมดจึงทำงานได้ดีในเครื่องจำลอง iPhone X


สิ่งนี้แก้ไขให้ฉันด้วย มีบางอย่างที่แตกต่างกันเกี่ยวกับวิธีที่ Xcode 9 IB สร้าง XML ของ UITabBarController ที่แก้ไขปัญหาได้
Tiago

0

สำหรับ iPhone คุณสามารถทำได้ Subclass UITabBarController

class MyTabBarController: UITabBarController {

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

ไปที่ Storyboard และอนุญาตให้Use Safe Area Layout Guideและเปลี่ยนคลาสของUITabbarControllerเป็นMyTabBarController

ป.ล. โซลูชันนี้ไม่ได้รับการทดสอบในกรณีของแอปพลิเคชันสากลและ iPad


0

ลองเปลี่ยนหน้าจอเริ่มต้นด้วยขนาด @ 3x คือ (3726 × 6624)


จะเกิดอะไรขึ้นถ้าเราใช้ LaunchScreen Storyboard?
Avineet Gupta

ไม่เป็นไรแค่ใช้ขนาดใหม่ splash
Sob7y


0

สำหรับฉันสิ่งนี้ได้รับการแก้ไขปัญหาทั้งหมด:

    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

ฉันใช้UITabBarControllerสตอรี่บอร์ดและตอนแรกมันใช้งานได้ดีสำหรับฉัน แต่หลังจากอัปเกรดเป็น Xcode เวอร์ชันใหม่แล้วมันก็เริ่มให้ปัญหาที่เกี่ยวข้องกับความสูงของแท็บบาร์

สำหรับผมการแก้ไขคือการลบที่มีอยู่UITabBarControllerจากสตอรี่บอร์ดและสร้างอีกครั้งด้วยการลากจากอินเตอร์เฟซที่สร้างวัตถุห้องสมุด


0

สำหรับผู้ที่เขียนUITabBarControllerโปรแกรมทั้งหมดคุณสามารถใช้UITabBarItem.appearance().titlePositionAdjustmentเพื่อปรับตำแหน่งหัวเรื่อง

ดังนั้นในกรณีนี้คุณต้องการเพิ่มช่องว่างระหว่าง Icon และ Title ให้ใช้ใน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
    }

ตรวจจับว่าอุปกรณ์มีหน้าจอ Notch หรือไม่:

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

0

สำหรับฉันวิธีแก้ปัญหาคือเลือกแถบแท็บในลำดับชั้นของมุมมองจากนั้นไปที่: ตัวแก้ไข -> แก้ไขปัญหาการจัดวางอัตโนมัติและภายใต้ "มุมมองที่เลือก" (ไม่ใช่ "มุมมองทั้งหมดในมุมมอง") ให้เลือก "เพิ่มข้อ จำกัด ที่ขาดหายไป"


-1

ฉันมีปัญหาเดียวกันซึ่งได้รับการแก้ไขโดยการตั้งค่ารายการของแถบแท็บหลังจากวางแถบแท็บแล้ว

ในกรณีของฉันปัญหาเกิดขึ้นเมื่อ:

  1. มีตัวควบคุมมุมมองที่กำหนดเอง
  2. UITabBar ถูกสร้างขึ้นในตัวเริ่มต้นของตัวควบคุมมุมมอง
  3. รายการแถบแท็บถูกตั้งค่าก่อนที่จะโหลดมุมมอง
  4. ในมุมมองโหลดแถบแท็บจะถูกเพิ่มไปยังมุมมองหลักของตัวควบคุมมุมมอง
  5. จากนั้นรายการจะแสดงผลตามที่คุณกล่าวถึง

-1

ฉันคิดว่านี่เป็นบั๊ก UIKit จาก iPhoneX เพราะมันใช้งานได้:

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

คุณสามารถให้ข้อมูลเพิ่มเติมว่า tabBarBottomLayoutConstraint คืออะไร?
user3099837
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.