iOS 11 iPhone X सिम्युलेटर UITabBar आइकन और शीर्षकों को प्रत्येक आच्छादन के शीर्ष पर प्रदान किया जा रहा है


134

UITabBar घटक के आसपास iPhone X सिम्युलेटर के साथ कोई समस्या है?

मेरा एक दूसरे के ऊपर आइकन और शीर्षक प्रदान करते प्रतीत हो रहे हैं, मुझे यकीन नहीं है कि अगर मुझे कुछ याद आ रहा है, तो मैंने इसे iPhone 8 सिम्युलेटर में भी चलाया, और एक वास्तविक उपकरण जहां यह ठीक दिखता है जैसा कि यहां दिखाया गया है कहानी मंडल।

iPhone X:

iPhone X UITabBar बग

iPhone 8

iPhone 8 UITabBar काम करता है


1
मेरे समान मुद्दा: iPhone X में 16 अंक के बारे में tabBar ध्यान में रखते हुए चयन सूचक छवि दृश्य डूब
इताची

FYI करें - यह दुर्भाग्य से Xcode 9.2beta में तय नहीं है
tdios

यह एक uikit बग है जो अभी भी मौजूद है। अड़चनें ठीक ही खड़ी करनी पड़ती हैं। नीचे मेरा जवाब देखें!
रियानएम

मेरे पास इस तरह के मुद्दे थे, इस उत्तर की जांच करें stackoverflow.com/a/53524635/5441253
मैक्सिमे आशुरोव

जवाबों:


40

मैं केवल देखने के लिए UIDabBar पर ViewDidLayoutSubviews में अमान्य कॉल करके समस्या को हल करने में सक्षम था।

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

नोट: टैब बार के निचले भाग को सुरक्षित क्षेत्र के बजाय मुख्य दृश्य के निचले हिस्से में समाहित करना होगा, और टैब बार में कोई ऊंचाई की बाधा नहीं होनी चाहिए।


मुझे एक टैब बार मिला है जिसमें कोई ऊंचाई की बाधा नहीं है, नीचे के लेआउट गाइड के लिए विवश है, और यह मेरे लिए काम नहीं करता है। कोई अन्य विचार?
केनी वायलैंड

1
काम नहीं कर रहा है जब होमवीसी वीसी ए को पेश करता है, तो ए को खारिज करें, और वीवीसी को होमवीसी से धक्का दें। यह एक समाधान नहीं है stackoverflow.com/a/47225653/1553324
ओह

1
इस विधि अपने superview के नीचे (करने के लिए टैब बार pinning के साथ संयुक्त जोड़ना नहीं सुरक्षित क्षेत्र) मेरे लिए काम किया।
ड्रयू सी

3
मुझे भी जोड़ने की जरूरत थी [self.view layoutIfNeeded]
इयूलियन ओनोफ्रेई

1
यह काम करता है लेकिन मुझे पता है कि मुझे टैब बार बटन में छवियों के आकार पर भी ध्यान देना चाहिए । लैंडस्केप मोड में (कॉम्पैक्ट डिवाइस पर, लेकिन आईपैड और आईफोन प्लस मॉडल नहीं), सिस्टम एक कॉम्पैक्ट टैब बार का उपयोग करता है, जिसमें माना जाता है कि छोटी छवियां हैं जिन्हें आप landscapeImageटैब बार बटन की संपत्ति के साथ सेट कर सकते हैं। अनुशंसित आकार कस्टम आइकन आकार के तहत [Apple HIG] ( डेवलपर.
apple.com/design/human-interface-guidelines/ios/…

25

VoidLess द्वारा प्रदान किया गया उत्तर TabBar समस्याओं को आंशिक रूप से ठीक करता है। यह टैबबार के भीतर लेआउट की समस्याओं को ठीक करता है, लेकिन यदि आप टैब को छिपाने वाले व्यूकंट्रोलर का उपयोग करते हैं, तो टैबबार को एनिमेशन के दौरान गलत तरीके से प्रस्तुत किया जाता है (इसे पुन: पेश करने के लिए 2 सर्वश्रेष्ठ 2 सेगमेंट हैं - एक मोडल और एक पुश। यदि आप सेगमेंट को वैकल्पिक करते हैं, तो आप कर सकते हैं। देखें टैबबार जगह से बाहर प्रस्तुत किया जा रहा है)। कोड bellow दोनों समस्याओं को ठीक करता है। अच्छा काम सेब।

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

उद्देश्य-सी कोड:

@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 क्लास में कैसे इस्तेमाल करते हैं?
जोजो

2
@ जोजो, यह देखते हुए कि कोड के माध्यम से टैब्बर को पॉप्युलेट करने के लिए कितना कोड की आवश्यकता है, मैं हमेशा स्टोरीबोर्ड का उपयोग करके यूटैबरबंट्रोलर बनाता हूं। वहां आप टैबबार के लिए कस्टम क्लास असाइन कर सकते हैं। उम्मीद है की यह मदद करेगा।
रायमुंडस सकलाकॉसस

यह समस्या वास्तविक डिवाइस पर नहीं है जिसे मैंने iPhone11 पर परीक्षण किया है Pro iOS 13
अक्षय जाधव

22

एक चाल है जिसके द्वारा हम समस्या को हल कर सकते हैं।

बस अपना UITabBar एक UIView के अंदर रखें।

यह वास्तव में मेरे लिए काम कर रहा है।

या आप अधिक जानकारी के लिए इस लिंक का अनुसरण कर सकते हैं ।


3
यह ठीक काम किया, एक uiview है जिसमें बस UITabBar शामिल है। UIView (L, R, और बॉटम) पर सुरक्षित क्षेत्रों के लिए कंट्रास्ट रखें, इसे एक ऊँचाई (49) दें, और UITABBAR को UIView को सभी तरफ से विवश करें।
sdsykes

1
इस समाधान ने मेरे लिए काम किया। मैं यूआईटैब कंट्रोलर का उपयोग नहीं कर रहा था, केवल यूआईटीएबीबार।
रिकार्डो टेसियो

1
मेरे लिए काम किया। धन्यवाद
फ्रांसिस lanthier

1
इससे मुझे मदद मिली! धन्यवाद!
ग्लेन

2
यह काम करता है, लेकिन तब "असुरक्षित" क्षेत्र टैब बार के समान रंग नहीं हो सकता है (यदि सुपर दृश्य और
टैब्बर

16

ओवरराइड 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 पर काम क्यों नहीं करता है। अन्य समाधान मेरे लिए काम नहीं करते हैं क्योंकि मैं टैब बार नियंत्रक का उपयोग कर रहा हूं और इसमें बाधाएं शामिल नहीं हैं।
जिंदिच रोहिलक

12

मैंने इसे viewWillAppearअपने रिवाज में शामिल किया UITabBarController, क्योंकि दिए गए किसी भी उत्तर ने मेरे लिए काम नहीं किया:

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

1
इससे मुझे टैबबार को स्क्रीन के शीर्ष पर ले जाने से संबंधित समस्या को ठीक करने में मदद मिली। धन्यवाद!
जय

लेकिन मेरे लिए नहीं :(
निक

9

मुझे भी यही समस्या थी।

यहां छवि विवरण दर्ज करें

यदि मैं UITabBar के सुरक्षित क्षेत्र के निचले अवरोध पर कोई गैर-शून्य स्थिरांक सेट करता हूं:

यहां छवि विवरण दर्ज करें

यह उम्मीद के मुताबिक काम करना शुरू कर देता है ...

यहां छवि विवरण दर्ज करें

यही एकमात्र बदलाव है जिसे मैंने किया है और मुझे नहीं पता कि यह क्यों काम करता है लेकिन अगर कोई ऐसा करता है तो मुझे यह जानना अच्छा लगेगा।


1
यह वही था जो मैंने इसे काम करने के लिए अंत में किया था, लेकिन हाँ मुझे नहीं पता कि क्यों या क्या समझ रहा है। मेरे लिए यह अभी भी एक बग की तरह लगता है
एड्रियन चेन

7

टैब बार को नीचे से 1 बिंदु दूर ले जाना मेरे लिए काम करता है।

बेशक आपको ऐसा करने से एक अंतर मिलेगा, जिसे आपको किसी तरह से भरना होगा, लेकिन पाठ / आइकन अब ठीक से तैनात हैं।


7

अहा! यह वास्तव में जादू है!

मैंने आखिरकार Apple को अपशब्द कहने के घंटों बाद यह पता लगाया।

UIKit वास्तव में आपके लिए इसे संभालता है, और ऐसा प्रतीत होता है कि स्थानांतरित टैब बार आइटम गलत सेटअप (और शायद एक वास्तविक UIKit बग) के कारण हैं। उपवर्ग या पृष्ठभूमि दृश्य की कोई आवश्यकता नहीं है।

UITabBar "बस काम करेगा" अगर यह पर्यवेक्षण के तल पर विवश है, न कि नीचे सुरक्षित क्षेत्र में

यह इंटरफ़ेस बिल्डर में भी काम करता है।

सही सेटअप

आईबी में काम कर रहे हैं

  1. इंटरफ़ेस बिल्डर में, iPhone X के रूप में देखने पर, UITabBar को बाहर खींचें जहां वह नीचे सुरक्षित क्षेत्र इनसेट में जाता है। जब आप इसे छोड़ देते हैं, तो यह सही दिखना चाहिए (नीचे के किनारे तक सभी जगह को भरें)।
  2. फिर आप एक "Add Missing Constraints" कर सकते हैं और IB सही बाधाओं को जोड़ देगा और आपका टैब बार जादुई रूप से सभी iPhones पर काम करेगा! (ध्यान दें कि नीचे का अवरोध ऐसा दिखता है कि इसमें iPhone X असुरक्षित क्षेत्र की ऊंचाई के बराबर एक स्थिर मान है, लेकिन स्थिरांक वास्तव में 0 है)

कभी-कभी यह अभी भी काम नहीं करता है

आईबी में टूट गया

क्या वास्तव में गूंगा है कि आप आईबी में बग को देख सकते हैं, भले ही आप उन सटीक बाधाओं को जोड़ दें जो आईबी ऊपर चरणों में जोड़ता है!

  1. UITabBar को बाहर खींचें और इसे नीचे के सुरक्षित क्षेत्र इनसेट में न डालें
  2. पर्यवेक्षक (सुरक्षित क्षेत्र नहीं) सभी के लिए अग्रणी, अनुगामी और नीचे की बाधाओं को जोड़ें, अजीब रूप से, यह स्वयं ठीक कर देगा यदि आप नीचे की बाधा के लिए बाधा निरीक्षक में "रिवर्स फर्स्ट एंड सेकंड आइटम" करते हैं। _ (ツ) _ / ¯

सुरक्षित क्षेत्र से पर्यवेक्षण और काम करने के लिए सभी बाधाओं को बदल दिया। लीजेंड रयान
रयानटीसीबी

6

सुरक्षित उपयोग करने के लिए उप-वर्ग UITabBar का उपयोग करके तय किया गया है:

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 की किसी भी घटना के लिए अपने आवेदन को देखने की कोशिश की और उन्हें SafeAreaFixTabBar के साथ बदल दिया ... मुझे ये घटनाएँ मिलीं: func application (_ application: UIApplication, didFinishLaitingWithOptions लॉन्च लॉन्च: [UIApplicationLaunchOptionsKey: Any]] ->> B] () .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] ;

नोट: यह अच्छी तरह से एक बग हो सकता है, क्योंकि दृश्य आकार और टैब बार लेआउट ओएस द्वारा निर्धारित किए जाते हैं। यह शायद iPhone X मानव इंटरफ़ेस दिशानिर्देशों में Apple के स्क्रीनशॉट के अनुसार प्रदर्शित होना चाहिए: https://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/


1
मैं देखता हूं, मैंने टैब बार को प्रोग्रामेटिक रूप से नहीं बनाया, मैंने स्टोरीबोर्ड का उपयोग स्क्रीन के निचले हिस्से में स्थापित बाधाओं के साथ किया। यह मेरे लिए अजीब लगता है कि हमें यह पता लगाना होगा कि क्या यह एक iPhone X है तो लेआउट पर कुछ रिजेक्टिंग करते हैं, जबकि वे बस TabBar की ऊंचाई को बिना किसी कोड परिवर्तन के स्वयं से टकराते हैं।
एड्रियन चेन

यह अब मेरे लिए एक बग की तरह लगता है, मुझे लगता है कि मैं इस पर एक बग रिपोर्ट करने जा रहा हूं और देखता हूं कि इसमें से क्या निकलता है। आपकी सहायता के लिए धन्यवाद!!
adrian chen

यह निर्धारित करने के लिए कि क्या iPhone X पर ऐप चल रहा है, यह निर्धारित करने के लिए मुख्य स्क्रीन सीमा की सटीक ऊंचाई का उपयोग करना वास्तव में एक महान विचार नहीं है। यदि अगले वर्ष का मॉडल समान बिंदु आकार है तो क्या होगा? या अगर ऐप लैंडस्केप मोड में चल रहा है?
रॉपरक्लैक्स

पारदर्शिता मेरे आइकन को अनुचित तरीके से सेट करने के लिए प्रभावित नहीं करती है। वे गड़बड़ कर रहे हैं कि क्या UITabBar अपारदर्शी या पारदर्शी है।
आदम

ऐसा प्रतीत होता है कि आप वास्तव में फ्रेम से ऊँचाई तक 32px जोड़ रहे हैं बजाय इसके से घटाकर?
पेरी

2

मेरा मामला यह था कि मैंने अपने UITabBarController में एक कस्टम 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 पर टैबबार को सही ढंग से प्रदर्शित करने के लिए समाधान था।


2

सबसे सरल समाधान जो मुझे मिला, वह था कि टैब बार के नीचे और तिजोरी के नीचे के बीच एक 0.2 सेंटीमीटर जगह जोड़ना। इतना ही नहीं।

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

1

जब मैं अपने कस्टम TabBarController में UITabBar के फ्रेम को सेट करने की कोशिश कर रहा था तो मुझे वही मुद्दा मिल रहा था।

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 ?
टियागो वेलोसो

मैंने सिर्फ kTabBarHeight के पिछले मूल्य में 32 अंक जोड़े (जो कि 45 था)। लेकिन आपको ठीक उसी मूल्य को निर्दिष्ट करने की आवश्यकता नहीं है, मेरे लिए यह टैबबार के लिए फ्रेम को निर्दिष्ट किए बिना भी ठीक काम करता है। लेकिन अगर आप इसे निर्दिष्ट करते हैं, तो आपको iPhone X पर अतिरिक्त ऊंचाई के लिए समायोजित करना होगा।
एव्जेनी

1
कुल हैक, लेकिन यह इन समाधानों में से केवल एक था जो इसे मेरे लिए सही लग रहा था।
केनी वायलैंड

जब आप अपने टैबबार के रूप में एक कस्टम दृश्य देख रहे हों, तो आप इस हैक का उपयोग iPhone X के लिए अपने कस्टम दृश्य को फिट बनाने के लिए करना चाहते हैं।
हेमंग

1
@ हेमांग नहीं, यह इस परियोजना के लिए 45 था मैंने इस कोड से उधार लिया था।
एवगेनी

1

मुझे आज इसका सामना स्टोरीबोर्ड में आ UITabBar के साथ मैन्युअल रूप से जोड़ा गया है, जब 0 के एक निरंतर के साथ सुरक्षित क्षेत्र के तल पर संरेखित करना मुझे मुद्दा मिलेगा लेकिन इसे 1 में बदलने से समस्या ठीक हो जाएगी। मेरे आवेदन के लिए सामान्य से अधिक 1 पिक्सेल UITabBar होना स्वीकार्य था।


मेरे लिए काम नहीं किया। मैं एक UITabBar का उपयोग कर रहा था जिसे मैन्युअल रूप से भी जोड़ा गया था।
केनी वायलैंड

1

मैंने इस समस्या पर अपना सिर खुजलाया है। यह इस बात से जुड़ा हुआ प्रतीत होता है कि टैबबार कैसे आरम्भ किया जाता है और पदानुक्रम को देखने के लिए जोड़ा जाता है। मैंने कॉल invalidateIntrinsicContentSizeकरने, फ्रेम सेट करने और bottomInsetsUITabBar उपवर्ग के अंदर जैसे समाधानों की भी कोशिश की । वे हालांकि अस्थायी रूप से काम करने लगते हैं और वे कुछ अन्य परिदृश्य को तोड़ते हैं या कुछ अस्पष्ट लेआउट मुद्दे के कारण टैब बार को पुनः प्राप्त करते हैं। जब मैं उस मुद्दे पर डिबग कर रहा था जब मैंने UITabBar और centerYAnchor को ऊंचाई की बाधाओं को निर्दिष्ट करने की कोशिश की, हालांकि न तो समस्या को ठीक किया। मैंने डिबगर को देखते हुए महसूस किया कि समस्या को पुन: पेश करने से पहले और बाद में टैबबार की ऊंचाई सही थी, जिसके कारण मुझे लगा कि समस्या साक्षात्कार में थी। मैंने किसी अन्य परिदृश्य को पुनः प्राप्त किए बिना इस समस्या को सफलतापूर्वक ठीक करने के लिए नीचे दिए गए कोड का उपयोग किया।

- (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 भविष्य में iOS रिलीज में UITabBarButton वर्ग का नाम नहीं बदलता है। हम UITabBarButton पर यह तभी कर रहे हैं जब इसका मतलब यह है कि यदि Apple UITabBar में अधिक आंतरिक साक्षात्कार जोड़ता है तो हमें इसके लिए समायोजित करने के लिए कोड को संशोधित करने की आवश्यकता हो सकती है।

कृपया पता है कि अगर यह काम करता है, तो सुझाव और सुधार के लिए खुला रहेगा!

इसके लिए एक स्विफ्ट समकक्ष बनाना सरल होना चाहिए।


मैंने इसे viewDidAppear(animated:)अपने में डाल दिया UITabBarControllerऔर यह ठीक काम कर गया। धन्यवाद!
अल्बर्ट बोरी 20

1
क्या परम यू आकार और समन्वयक पारित किया? देखने से हुआ
sulabh

1

इस ट्यूटोरियल से:

https://github.com/eggswift/ESTabBarController

और टैब बार के आरंभ के बाद इस पंक्ति को appdelegate क्लास में लिखना

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

टैब बार की मेरी समस्या का समाधान करता है।

आशा है कि इसकी समस्या को हल किया जाए

धन्यवाद


1

टैबबार का चयन करें और इंस्पेक्टर एडिटर में "सेव एरिया रिलेटिव मार्जिन्स" चेकबॉक्स सेट करें:

यहां छवि विवरण दर्ज करें


1

मुझे भी इसी तरह की समस्या थी, पहले तो इसे सही तरीके से प्रस्तुत किया गया था, लेकिन badgeValueएक टैबबैरीम पर स्थापित होने के बाद इसने लेआउट को तोड़ दिया। उपवर्ग के बिना मेरे लिए यह क्या काम करता 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 पर्यवेक्षण का उपयोग किया कि बाधाएं / लंगर एक ही दृश्य पदानुक्रम पर हैं और क्रैश से बचते हैं।

मेरी समझ के आधार पर, चूंकि यह एक UIKit बग लगता है, हमें बस टैब बार बाधाओं को फिर से लिखना / फिर से सेट करना होगा ताकि ऑटो लेआउट इंजन टैब बार को फिर से सही ढंग से लेआउट कर सके।


0

यदि आपके पास टैब बार के लिए कोई ऊंचाई की बाधा है, तो इसे हटाने का प्रयास करें।

उसी समस्या का सामना किया और इस समस्या को दूर किया।


0

मैंने अपने स्टोरीबोर्ड में नया UITabBarController बनाया और सभी दृश्य नियंत्रकों को इस नए UITabBarConttoller पर धकेल दिया। तो, iPhone X सिम्युलेटर में सभी अच्छी तरह से काम करते हैं।


यह भी मेरे लिए तय है। जिस तरह से Xcode 9 IB UITabBarController का XML उत्पन्न करता है, इस मुद्दे पर कुछ अलग है।
टिआगो

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

गोटो स्टोरीबोर्ड और सुरक्षित क्षेत्र लेआउट गाइड का उपयोग करें और UITabbarController के वर्ग बदलने के लिए MyTabBarController की अनुमति दें

PS यह समाधान सार्वभौमिक अनुप्रयोग और iPad के मामले में परीक्षण नहीं किया गया है।


0

@ 3x आकार के साथ स्प्लैश स्क्रीन बदलने का प्रयास करें (3726 × 6624)


क्या होगा अगर हम एक लॉन्चस्क्रीन स्टोरीबोर्ड का उपयोग कर रहे हैं?
अवनीत गुप्ता

यह ठीक है बस छप नए आकार का उपयोग करें
Sob7y

0

मेरे लिए, [self.tabBar setBackgroundImage:]काम को हटा दें , हो सकता है कि यह UIKit बग हो


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 संस्करण में अपग्रेड करने के बाद इसने मुझे tabBar की ऊंचाई से संबंधित मुद्दों को देना शुरू कर दिया।

मेरे लिए, UITabBarControllerस्टोरीबोर्ड से मौजूदा को हटाना और इंटरफ़ेस बिल्डर ऑब्जेक्ट लाइब्रेरी से इसे खींचकर फिर से बनाना था ।


0

पूरे UITabBarControllerप्रोग्राम लिखने वालों के लिए , आप UITabBarItem.appearance().titlePositionAdjustmentशीर्षक स्थिति को समायोजित करने के लिए उपयोग कर सकते हैं

तो इस मामले में कि आप आइकन और शीर्षक के बीच एक अंतर जोड़ना चाहते हैं 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
  }

-1

मेरे पास एक ही मुद्दा था जो टैब बार के आउट होने के बाद टैबबार के आइटम सेट करके हल किया गया था।

मेरे मामले में समस्या तब हुई जब:

  1. एक कस्टम व्यू कंट्रोलर है
  2. व्यू कंट्रोलर के इनिशियलाइज़र में UITabBar बनाया जाता है
  3. टैब बार आइटम लोड किए जाने से पहले सेट किए जाते हैं
  4. देखने में लोड टैब टैब दृश्य नियंत्रक के मुख्य दृश्य में जोड़ा जाता है
  5. फिर, आइटम का उल्लेख किया गया है।

-1

मुझे लगता है कि यह iPhoneX से बग बग है। क्योंकि यह काम करता है:

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

क्या आप अधिक जानकारी दे सकते हैं कि tabBarBottomLayoutConstraint क्या है?
user3099837

-1

मेरा मानना ​​है कि आप नीचे सुरक्षित लेआउट गाइड के खिलाफ टैब बार बिछा सकते हैं। यह शायद नहीं है कि आप क्या चाहते हैं क्योंकि टैब बार iPhone X में होम लाइन के शीर्ष पर टैब बार आइटम को सुरक्षित रूप से रखने के लिए अपनी गणना करने के लिए लगता है । पर्यवेक्षण के तल के खिलाफ अपने नीचे की बाधा स्थापित करें । आपको यह देखना चाहिए कि यह iPhone X के साथ-साथ अन्य iPhones पर सही ढंग से काम करता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.