iphone আইওএস 11 আইফোন এক্স সিমুলেটর ইউআইটিববার আইকন এবং শিরোনাম শীর্ষে coveringেকে দেওয়া উপর রেন্ডার করা হচ্ছে



uitabbar ios11 (20)

ইউআইটিববার উপাদানটির সাথে আইফোন এক্স সিমুলেটারের সাথে কারও সমস্যা?

আমি একে অপরের উপরে আইকন এবং শিরোনাম উপস্থাপন করছে বলে মনে হচ্ছে, আমি কিছু অনুপস্থিত কিনা তা আমি নিশ্চিত নই, আমি এটি আইফোন 8 সিমুলেটারেও চালিয়েছি এবং এমন একটি আসল ডিভাইস যেখানে এটি ঠিক যেমন দেখায় ঠিক তেমন দেখাচ্ছে গল্প বোর্ড

আইফোন এক্স:

আইফোন 8

https://ffff65535.com


আহা! এটা আসলে যাদু!

অ্যাপলকে অভিশাপ দেওয়ার কয়েক ঘন্টা পরে অবশেষে আমি এটি আবিষ্কার করেছি।

ইউআইকিট আসলে আপনার জন্য এটি পরিচালনা করে এবং এটি প্রদর্শিত হয় যে স্থানান্তরিত ট্যাব বার আইটেমগুলি ভুল সেটআপের কারণে হয়েছে (এবং সম্ভবত একটি সত্যই ইউআইকিট বাগ)। সাবক্ল্যাসিং বা পটভূমি দেখার দরকার নেই।

ইউআইটিববার নীচে সুরক্ষিত অঞ্চলে নয় , তদারকির নীচে সীমাবদ্ধ থাকলে "" কাজ করবে "।

এমনকি এটি ইন্টারফেস বিল্ডারেও কাজ করে।

সঠিক সেটআপ

  1. ইন্টারফেস বিল্ডারে, আইফোন এক্স হিসাবে দেখাতে, একটি ইউআইটিববারটি টানুন যেখানে এটি নীচের নিরাপদ অঞ্চলের ইনসেটে স্ন্যাপ করে। আপনি এটিকে ফেলে দিলে, এটি সঠিক দেখতে হবে (নীচের প্রান্তে পুরো জায়গাটি পূরণ করুন)।
  2. তারপরে আপনি একটি "মিসিং সীমাবদ্ধতা" যুক্ত করতে পারেন এবং আইবি সঠিক সীমাবদ্ধতা যুক্ত করবে এবং আপনার ট্যাব বারটি সমস্ত আইফোনে যাদুতে কাজ করবে! (নোট করুন যে নীচের সীমাবদ্ধতার মতো মনে হচ্ছে এটির আইফোন এক্স অনিরাপদ অঞ্চলের উচ্চতার সমান ধ্রুবক মান রয়েছে তবে ধ্রুবকটি আসলে 0)

কখনও কখনও এটি এখনও কাজ করে না

আসলেই মূকটি হ'ল আপনি আইবিতে বাগটি তত্ক্ষণাত্ দেখতে পাচ্ছেন, এমনকি আপনি উপরের পদক্ষেপগুলিতে আইবি যে সঠিক সীমাবদ্ধতা যুক্ত করেছেন তা যুক্ত করেও!

  1. একটি ইউআইটিববার টেনে আনুন এবং নীচে নিরাপদ অঞ্চল ইনসেটে স্ন্যাপ করবেন না
  2. শীর্ষস্থানীয়, অনুসরণযোগ্য এবং নীচের সমস্ত সীমাবদ্ধতাগুলি তদারকির জন্য (নিরাপদ অঞ্চল নয়) যুক্ত করুন অদ্ভুতভাবে, আপনি নীচের সীমাবদ্ধতার জন্য সীমাবদ্ধ পরিদর্শকের কোনও "বিপরীত প্রথম এবং দ্বিতীয় আইটেম" করেন তবে এটি নিজেকে স্থির করবে। _ (ツ): _ / ¯

@ 3x আকারের (3726 × 6624) স্প্ল্যাশ স্ক্রিনটি পরিবর্তন করার চেষ্টা করুন


আইফোনের জন্য আপনি এটি করতে পারেন, সাবক্লাস UITabBarController।

class MyTabBarController: UITabBarController {

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

স্টোরিবোর্ডে যান এবং নিরাপদ অঞ্চল লেআউট গাইড এবং ইউআইটিববারকন্ট্রোলারের ক্লাসটি মাইটাববারকন্ট্রোলারে পরিবর্তনের অনুমতি দিন

পিএস এই সমাধানটি সর্বজনীন অ্যাপ্লিকেশন এবং আইপ্যাডের ক্ষেত্রে পরীক্ষা করা হয় না।


আমার অনুরূপ সমস্যাটি ছিল, প্রথমে এটি সঠিকভাবে উপস্থাপন করা হয়েছিল তবে badgeValue একটিতে badgeValue সেটআপ করার পরে এটি বিন্যাসটি ভেঙে যায়। এটি আমার জন্য ইতিমধ্যে তৈরি UITabBarController সাবক্লাসে, 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];
}

সীমাবদ্ধতা / অ্যাঙ্করগুলি একই দর্শন শ্রেণিবিন্যাসে রয়েছে এবং ক্র্যাশগুলি এড়ায় তা নিশ্চিত করতে আমি ট্যাববার সুপারভাইউ ব্যবহার করেছি।

আমার বোঝার উপর ভিত্তি করে, যেহেতু এটি ইউআইকিট বাগ হিসাবে মনে হচ্ছে, আমাদের কেবলমাত্র ট্যাব বারের সীমাবদ্ধতাগুলি পুনরায় লিখতে / পুনরায় সেট করতে হবে যাতে স্বয়ংক্রিয় বিন্যাস ইঞ্জিনটি ট্যাব বারটিকে আবার সঠিকভাবে বিন্যাস করতে পারে।


আমার কেসটি হ'ল আমি আমার ইউআইটিববারকন্ট্রোলারে একটি কাস্টম ইউআইটিববার উচ্চতা সেট করেছি, এটি এর মতো:

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

এই কোডটি সরিয়ে ফেলাটাই ছিল ট্যাববারের আইফোন এক্সে সঠিকভাবে প্রদর্শন করার সমাধান the


আমার জন্য [tabController.view setNeedsLayout]; কল করে সমাধান করা হয়েছে [tabController.view setNeedsLayout]; সমাপ্তি ব্লকে মডেলকে বরখাস্ত করার পরে।

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

আমার জন্য, [self.tabBar setBackgroundImage:] কাজ সরান, সম্ভবত এটি ইউআইকিট বাগ


আমারও একই সমস্যা ছিল।

আমি যদি ইউআইটিববারের নীচের সীমানায় কোনও অ-শূন্য স্থির সেট করে নিরাপদ অঞ্চলে:

এটি প্রত্যাশা অনুযায়ী কাজ শুরু করে ...

এটাই আমি একমাত্র পরিবর্তন করেছি এবং কেন এটি কাজ করে তা আমার কোনও ধারণা নেই তবে কেউ যদি তা করতে আগ্রহী তবে আমি তা জানতে আগ্রহী।


আমি আমার কাস্টম UITabBarController viewWillAppear এটি যুক্ত করেছি, কারণ সরবরাহিত উত্তরগুলির মধ্যে আমার পক্ষে কাজ করা হয়নি:

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

আমি আমার লঞ্চ স্ক্রিন স্টোরিবোর্ডের এই বাগের মধ্যে দৌড়েছি, যা সাবক্লাসিংয়ের মাধ্যমে কাস্টমাইজ করা যায় না। কিছু বিশ্লেষণের পরে আমি কারণটি সনাক্ত করতে সক্ষম হয়েছি - আমি সরাসরি একটি UITabBar ব্যবহার UITabBar । কোনও UITabBarController স্যুইচ করা, যা একটি UITabBar , সমস্যাটি সমাধান করেছে।

দ্রষ্টব্য - এটি আইওএস 11.1 দ্বারা স্থির করা সম্ভব, তাই আসল আইফোন এক্স অ্যাপ্লিকেশনগুলিতে প্রভাব ফেলতে পারে না (যেহেতু সম্ভবত আইফোন এক্স আইওএস 11.1 চলমান প্রকাশিত হবে)।


আমি বিশ্বাস করি আপনি নীচের নিরাপদ বিন্যাস গাইডের বিপরীতে ট্যাব বারটি পাচ্ছেন। এটি সম্ভবত আপনি চান না যেহেতু ট্যাব বারটি আইফোন এক্স-এ হোম লাইনের শীর্ষে ট্যাব বার আইটেমগুলি নিরাপদে অবস্থানের জন্য নিজস্ব গণনা করে। সুপারভিউ নীচের বিপরীতে আপনার নীচের সীমাবদ্ধতা সেটআপ করুন । আপনার দেখতে হবে যে এটি আইফোন এক্সের পাশাপাশি অন্যান্য আইফোনে সঠিকভাবে প্রস্থান করেছে।


আমি ভিআইডিব্লাউটসউবউভিউগুলিতে ইউআইটিববারে কেবল অবৈধভাবে ইন্ট্রিন্সিক কনসেন্টসাইজ কল করে সমস্যাটি সন্ধান করতে সক্ষম হয়েছি।

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

দ্রষ্টব্য: ট্যাব বারের নীচে সুরক্ষিত অঞ্চলটির পরিবর্তে মূল দৃশ্যের নীচে থাকা দরকার এবং ট্যাব বারটির উচ্চতার সীমাবদ্ধতা থাকা উচিত নয়।


আমি যখন আমার কাস্টম ট্যাববারকন্ট্রোলারের মধ্যে ইউআইটিববারের ফ্রেমটি সেট করার চেষ্টা করছিলাম তখন আমার একই সমস্যা ছিল।

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

আমি যে সহজ সমাধানটি পেয়েছি তা হ'ল ট্যাব বারের নীচে এবং সেফআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআ।

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

ইউআইটিববার বাড়ির বোতাম / লাইনের ওপরে হতে উচ্চতায় বৃদ্ধি পাচ্ছে, তবে সংক্ষিপ্তসারটিকে তার মূল স্থানে অঙ্কন করছে এবং সংক্ষিপ্তসারটি থেকে ইউআইটিববার্টিমিটকে ওভারলেল করছে।

কার্যতালিকা হিসাবে আপনি আইফোনের এক্স সনাক্ত করতে পারেন এবং তারপরে হোম লাইনের উপরে নিরাপদ জায়গায় ট্যাব বারটি প্রদর্শিত হবে তা নিশ্চিত করতে 32px দ্বারা দৃশ্যের উচ্চতা সঙ্কুচিত করতে পারেন।

উদাহরণস্বরূপ, আপনি যদি নিজের ট্যাববারটি তৈরি করে থাকেন তবে প্রোগ্রামারিকভাবে প্রতিস্থাপন করুন

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

দ্রষ্টব্য: ভিউ আকার এবং ট্যাব বারের বিন্যাস ওএস দ্বারা সেট করা হওয়ায় এটি ত্রুটিযুক্ত হতে পারে। এটি সম্ভবত আইফোন এক্স হিউম্যান ইন্টারফেসের গাইডলাইনগুলিতে অ্যাপলের স্ক্রিনশট অনুযায়ী প্রদর্শিত হবে: https://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/


এই টিউটোরিয়াল থেকে:

https://github.com/eggswift/ESTabBarController

এবং ট্যাব বার প্রারম্ভিক ক্লাসে এই লাইনটি লিখতে শুরু করার পরে

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

আমার ট্যাব বারের সমস্যা সমাধান করে।

আশা করি এটি আপনার সমস্যার সমাধান করে

ধন্যবাদ


একটি কৌশল আছে যার মাধ্যমে আমরা সমস্যার সমাধান করতে পারি।

আপনার ইউআইটিববারকে কেবল একটি ইউআইভিউয়ের ভিতরে রাখুন।

এটি সত্যই আমার পক্ষে কাজ করছে।

অথবা আপনি আরও তথ্যের জন্য এই Link অনুসরণ করতে পারেন।


ট্যাব বারের জন্য আপনার যদি উচ্চতার কোনও সীমাবদ্ধতা থাকে তবে এটি সরিয়ে দেওয়ার চেষ্টা করুন।

একই সমস্যার মুখোমুখি হয়েছে এবং এটি সমস্যার সমাধান করেছে removing


ভয়েডলেসের সরবরাহিত উত্তর ট্যাববার সমস্যাগুলিকে কেবল আংশিকভাবে সমাধান করে। এটি ট্যাববারের মধ্যে লেআউট সমস্যাগুলি সমাধান করে তবে আপনি যদি ট্যাববারটি আড়াল করে এমন ভিউকন্ট্রোলার ব্যবহার করেন তবে ট্যাববারটি অ্যানিমেশনগুলির সময় ভুলভাবে রেন্ডার করা হয় (এটি পুনরুত্পাদন করার জন্য 2 টি সেগমেন্টের সেরা 2 টি রয়েছে - একটি মডেল এবং একটি ধাক্কা you ট্যাববারটি স্থানের বাইরে রেন্ডার করা দেখুন)। কোড বেলো উভয় সমস্যার সমাধান করে। ভাল কাজ আপেল।

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

UITabBar জন্য ইউআইটিববার sizeThatFits(_) ওভাররাইড UITabBar sizeThatFits(_)

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