ইউআইএস সার্চবার আইওএস 11-তে নেভিগেশন বারের উচ্চতা বাড়ায়


89

আমার UISearchBarমতো নেভিগেশন বারের অংশ হচ্ছি :

 let searchBar = UISearchBar()
 //some more configuration to the search bar
 .....
 navigationItem.titleView = searchBar

iOS 11অদ্ভুত কিছু আপডেট করার পরে আমার অ্যাপ্লিকেশনটির অনুসন্ধান বারে ঘটেছে। উপর iOS 10এবং পূর্বে আমি আমার ন্যাভিগেশন বার মত খুঁজছি করেছেন:

এখানে চিত্র বর্ণনা লিখুন

এখন iOS 11আমার সাথে :

এখানে চিত্র বর্ণনা লিখুন

আপনি দেখতে পাচ্ছেন যে দুটি সার্চ বারের গোল করার মধ্যে পার্থক্য রয়েছে যা আমাকে বিরক্ত করে না। সমস্যাটি হ'ল অনুসন্ধান বারটি নেভিগেশন বারের উচ্চতা বৃদ্ধি করে। সুতরাং আমি যখন অন্য কোনও নিয়ামকের কাছে যাই তখন এটি খুব অদ্ভুত লাগে:

এখানে চিত্র বর্ণনা লিখুন

বাস্তবে যে অদ্ভুত কালো লাইনের উচ্চতা প্লাস বর্তমান নেভিগেশন বারের উচ্চতা দ্বিতীয় ছবিতে প্রদর্শিত নেভিগেশন বারের উচ্চতার সমান ...

কীভাবে কোনও ধারণা ব্ল্যাক লাইনের হাত থেকে মুক্তি পাবেন এবং সমস্ত দর্শনীয় নিয়ামক জুড়ে নিয়মিত নেভিগেশন বারের উচ্চতা থাকবে?


উত্তর:


67

আমি আইওএস 11-এ সার্চবারের সাহায্যে নেভিগেশনবারের নীচে ব্ল্যাক লাইন পেয়েছি দুটি ক্ষেত্রে:

  • আমি যখন ইউআইসোচবারের সাথে ভিউকন্ট্রোলার থেকে অন্য ভিউকন্ট্রোলারদের ঠেলে থাকি এখানে চিত্র বর্ণনা লিখুন

  • যখন আমি ইউআইসোচবারের সাথে ভিউকন্ট্রোলারকে "বরখাস্ত করতে ডানদিকে টানুন" দিয়ে বরখাস্ত করি এখানে চিত্র বর্ণনা লিখুন

আমার সমাধানটি ছিল: ইউআইসন্ধানবারের সাথে আমার ভিউকন্ট্রোলারে এই কোডটি যুক্ত করা:

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    [self.navigationController.view setNeedsLayout]; // force update layout
    [self.navigationController.view layoutIfNeeded]; // to fix height of the navigation bar
}

সুইফট 4 আপডেট

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.view.setNeedsLayout() // force update layout
    navigationController?.view.layoutIfNeeded() // to fix height of the navigation bar
}

4
সাবধানতার সাথে এটি ব্যবহার করুন কারণ আমার কাছে যখন পুরোপুরি
দৃশ্যাবলী

4
এই সমাধানটি আমাকে সত্যই একটি বড় স্বস্তি দিয়েছে ধন্যবাদ @ অ্যান্ড্রু
সাগর Daundkar

67

আপনি আইওএস 11 এর জন্য অনুসন্ধান বারে 44 উচ্চতার সীমাবদ্ধতা যুক্ত করতে পারেন।

// সুইফ্ট

if #available(iOS 11.0, *) {
    searchBar.heightAnchor.constraint(equalToConstant: 44).isActive = true
}

// উদ্দেশ্য গ

if (@available(iOS 11.0, *)) {
    [searchBar.heightAnchor constraintEqualToConstant:44].active = YES;
}

12
যদিও এটি উচ্চতাটিকে স্বাভাবিক অবস্থায় ফিরিয়ে আনতে কাজ করে, যদি আমি আমার সার্চবারে ট্যাপ করি তবে কোনও কারণে এটি অনুসন্ধানবারের নীচের অংশটি কেটে দেয়। কেন এমন ধারণা বা অন্য কারও কাছে এই সমস্যাটি রয়েছে?
ক্রিস্টোফার স্মিট

9
পুরোটাই অদ্ভুত কারণ এটা শুধু ন্যাভিগেশন বার narrows কিন্তু সার্চ বারের উচ্চতা এখনও 56. হয় যদি এই কোড ব্যবহার খুঁজছেন
OtakuFitness

4
অন্য কেউ সমাধান খুঁজে পেয়েছিল? এটি করা অনুসন্ধান বারের সাথে প্রচুর অদ্ভুত আচরণগত সমস্যা তৈরি করে।
গুস্তাভো_ফ্রিঞ্জ

15
এটি যথেষ্ট উত্তর নয়। আপনি যখন মাঠে ক্লিক করেন, আকারটি এখনও গণ্ডগোল করে।
রস

4
এটি আইওএস 13 এ কাজ করে না this
ভিভি 18

42

আমি আইওএস ১১-তে বিশ্বাস করি ইউআইসন্ধানবারের উচ্চতা এখন সমান 56 56 এবং সমানভাবে ইউআইএনএভিগেশনবার তার পঠনদর্শনগুলি ফিট করার জন্য অটোলেআউট ব্যবহার করে তাই এটি উচ্চতা বৃদ্ধি করে। আপনি যদি এখনও ইউআইএস সার্চবারকে আইওএস 11 পূর্বের মত শিরোনামভিউ হিসাবে দেখতে চান তবে এটি করার সর্বোত্তম উপায়টি আমি কাস্টম ভিউতে ইউআইসোচবারকে এম্বেড করা, এবং এই দৃশ্যের উচ্চতা 44 এ সেট করে, এবং এটিকে নেভিগেশন আইটেম.টাইটেলভিউতে নির্ধারিত করেছি do

class SearchBarContainerView: UIView {  

    let searchBar: UISearchBar  

    init(customSearchBar: UISearchBar) {  
        searchBar = customSearchBar  
        super.init(frame: CGRect.zero)  

        addSubview(searchBar)  
    }

    override convenience init(frame: CGRect) {  
        self.init(customSearchBar: UISearchBar())  
        self.frame = frame  
    }  

    required init?(coder aDecoder: NSCoder) {  
        fatalError("init(coder:) has not been implemented")  
    }  

    override func layoutSubviews() {  
        super.layoutSubviews()  
        searchBar.frame = bounds  
    }  
}  

class MyViewController: UIViewController {  

    func setupNavigationBar() {  
        let searchBar = UISearchBar()  
        let searchBarContainer = SearchBarContainerView(customSearchBar: searchBar)  
        searchBarContainer.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 44)  
        navigationItem.titleView = searchBarContainer  
    }  
} 

এটি সঠিকভাবে কাজ করে তবে সমস্যা রয়েছে যখন আপনি এটিকে প্রতিকৃতি থেকে ল্যান্ডস্কেপে পরিবর্তন করবেন।
মালভ সোনি

আপনি যদি স্বয়ংক্রিয় বিন্যাস ব্যবহার না করেন তবে দুর্দান্ত সমাধান। এখনও অবধি, এটি সিমুলেটারে ল্যান্ডস্কেপ মোডের জন্যও কাজ করে বলে মনে হচ্ছে।
রায়ান এইচ।

আমি একটি সমাধান পোস্ট করেছি যা ওরিয়েন্টেশন পরিবর্তনের সমস্যার সমাধান করে।
ডি।

এই উত্তরটি সমস্ত সমস্যার সমাধান করেছে। zgjie এর উত্তর দুর্দান্ত তবে অনুসন্ধান বারের ফ্রেমটি টেক্সটফিল্ডে আলতো চাপার পরেও পরিবর্তিত হয়েছে।
চার্লি হ্যাং

19

ভিউডিডলয়েডটিতে "ACKNOWLEDGMENTS" ভিউ কন্ট্রোলারটিতে এই কোডটি ব্যবহার করে দেখুন

self.extendedLayoutIncludesOpaqueBars = true

ধন্যবাদ! আমি এই সমাধানটিই শেষ করে দিয়েছি, যেহেতু আমি ਪਾਰবর্ণ বার ব্যবহার করছি না।
mmh02

আসলে এই উত্তর হওয়া উচিত। তবে আমি এই জায়গাটিতে কোডের এই অংশটি নিয়ামক উভয়তেই যোগ করতে চাই যা অনুসন্ধান বার নিয়ামকের উপরে এবং নীচে।
অমৃত সিধু

এটি আমার পক্ষে কাজ করেছে, তবে একটিতে ভিউইলডিস্পায়ারে নেভিগেশনকন্ট্রোলার? .ভিউ.এলআউটআউটসভিউ () যোগ করতে হয়েছিল।
ডগ্লাসড 3

এটি খুব ভালভাবে কাজ করে, আপনি যদি extendedLayoutIncludesOpaqueBars সম্পত্তিটি কী করেন তা যদি কেবল আমাদের জানান তবে আমি সত্যিই প্রশংসা করব ।
অনিরুদ্ধ মহলে 20'18

বাড়ানো লেআউটআইঙ্ক্লিউডস ওপেকবারগুলি নেভিগেশন এবং স্থিতি দণ্ডের নীচে আপনার দর্শন (স্ব.ভিউ )টি প্রসারিত করে। যদি আপনি দৃশ্যে একটি সাবউভি যোগ করেন (উদাহরণস্বরূপ, ইউআইআইমেজভিউ) এবং এটিকে দৃশ্যের উপরের-বামে সীমাবদ্ধ করে অ্যাপ্লিকেশন চালনা করেন, আপনি এই সম্পত্তিটিকে সত্য এবং মিথ্যাতে সেট করার সময় আপনি ভিন্ন দেখতে পাবেন।
সিলভারউইন্ড

7

সবাইকে ধন্যবাদ! অবশেষে আমি একটি সমাধান খুঁজে পেয়েছি।

ইউআইসোচবারের সাথে ভিউকন্ট্রোলারে নিম্নলিখিত কোড যুক্ত করা হচ্ছে।

  1. প্রথম ধাপ: viewDidLoad
-(void)viewDidLoad
{
    [super viewDidLoad];
    self.extendedLayoutIncludesOpaqueBars = YES;
    ...
}
override func viewDidLoad() {
    super.viewDidLoad()
    self.extendedLayoutIncludesOpaqueBars = true
}
  1. দ্বিতীয় ধাপ:viewWillDisappear
-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
     // force update layout
    [self.navigationController.view setNeedsLayout]; 
    // to fix height of the navigation bar
    [self.navigationController.view layoutIfNeeded];  
}
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.view.setNeedsLayout() // force update layout
        navigationController?.view.layoutIfNeeded() // to fix height of the navigation bar
    }

4

উদ্দেশ্য-সি

if (@available(iOS 11.0, *)) {
        [self.searchBar.heightAnchor constraintLessThanOrEqualToConstant: 44].active = YES;
}              

2

আমার সাথে এটিও ঘটে, সমস্ত আইওএস 12.4 এ ভাল চলছে এবং উপরের 13 টিতে অদ্ভুত হয়ে উঠছে। ইউআইভিউউকন্ট্রোলার থেকে লাফ দেওয়ার পরে আইওএস 13 নেভিগেশন বারের উচ্চতা 88 থেকে 100 এ বৃদ্ধি করা হয়েছে যা অনুসন্ধানবার প্রয়োগ করে।

এটি আপনার ইউআইভিউউকন্ট্রোলারে চেষ্টা করুন যা অনুসন্ধানবার প্রয়োগ করে।

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.view.setNeedsLayout()
    navigationController?.view.layoutIfNeeded()
}

ঠিক করার পরে পূর্বরূপ:

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

ঠিক করার আগে পূর্বরূপ:

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন


1

সম্পাদনা: @zgjie উত্তর এই সমস্যার জন্য আরও ভাল সমাধান: https://stackoverflow.com/a/46356265/1713123

দেখে মনে হচ্ছে এটি ঘটেছিল কারণ আইওএস 11-এ সার্চবারের ডিফল্ট উচ্চতার মানটি পূর্ববর্তী আইওএস সংস্করণগুলির পরিবর্তে 44 তে পরিবর্তিত হয়েছিল।

আপাতত, আমি এই বারটি প্রয়োগ করেছি, অনুসন্ধানবারের উচ্চতাটি 44 এ ফিরিয়ে দিচ্ছি:

let barFrame = searchController.searchBar.frame
searchController.searchBar.frame = CGRect(x: 0, y: 0, width: barFrame.width, height: 44)    

আর একটি সমাধান হ'ল আইওএস 11 এ নেভিগেশন আইটেমে নতুন অনুসন্ধানকন্ট্রোলার সম্পত্তিটি ব্যবহার করা যেতে পারে :

navigationItem.searchController = searchController

তবে এইভাবে দা সার্চবার নেভিগেশন শিরোনামের নীচে প্রদর্শিত হবে।


4
পরিবর্তনটি কোথাও নথিভুক্ত করা হয়েছে? আমি এখানে এটি খুঁজে পেল না ।
আইলিয়ান ওনোফ্রেই

4
এফওয়াইআই, আপনি ফ্রেমের জন্য পরিবর্তনশীল না করে পরিবর্তন করতে পারেন; CGRect().insetBy(dx:dy:)এবং CGRect().offsetBy(dx:dy:), এই ক্ষেত্রে -searchController.searchBar.frame = searchController.searchBar.frame.insetBy(dx: 0, dy: -12)
অস্কার অ্যাপল্যান্ড

এই সমাধানটি কাজ করেছে তবে আপনি যখন অনুসন্ধান বারটি ক্লিক করেন তখন উচ্চতাটি পুনরায় সেট করা হয়।
গুস্তাভো_ফ্রিঞ্জ

@ গুস্তাভো_ফ্রিঞ্জ আপনি কি এর জন্য কোনও সমাধান খুঁজে পেয়েছেন?
শিবাম পোখরিয়াল

1

সমস্ত সমাধান আমার পক্ষে কাজ করে না তাই এর আগে আমি দেখার নিয়ামককে ধাক্কা দেওয়ার আগে:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.navigationItem.titleView = UIView()
}

এবং ফিরে যাওয়ার সময় অনুসন্ধান বারটি উপস্থিত করতে:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    self.navigationItem.titleView = UISearchBar()
}

এটি নতুন ভিউকন্ট্রোলারের কালো দৃষ্টি সরিয়ে ফেলেছে তবে এই ভিউকন্ট্রোলারটিতে (সার্চবার রয়েছে এমন) ফিরে আসার সময়, রুটভিউ আসলে কিছুটা উপরে উঠেছিল।
latte

1

আমি নাভবারকে ৪৪-এ রাখার সমাধানটি ব্যবহার করতে পারিনি So সুতরাং এটি আমার একদিন সময় নিয়েছে তবে শেষ পর্যন্ত, আমি এমন একটি সমাধান পেয়েছি যা বারের উচ্চতা পরিবর্তন করে না এবং বারের মাঝখানে বোতামটি রাখে। সমস্যাটি হ'ল বোতামগুলি স্ট্যাক ভিউতে রাখা হয় যা অনুভূমিক স্ট্যাক ভিউ হিসাবে কনফিগার করা হয় এবং তাই উচ্চতা পরিবর্তনের সাথে সামঞ্জস্য করে না।

এটি init এ করা হয়:

UIBarButtonItem *cancelButton;
if (@available(iOS 11.0, *)) {
    // For iOS11 creating custom button to accomadate the change of navbar + search bar being 56 points
    self.navBarCustomButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [self.navBarCustomButton setTitle:@"Cancel"];
    [self.navBarCustomButton addTarget:self action:@selector(cancelButtonTapped) forControlEvents:UIControlEventTouchUpInside];
    cancelButton = [[UIBarButtonItem alloc] initWithCustomView:self.navBarCustomButton];
} else {
    cancelButton = [[UIBarButtonItem alloc] initWithTitle:MagicLocalizedString(@"button.cancel", @"Cancel")
                                                                                         style:UIBarButtonItemStylePlain
                                                                                        target:self
                                                                                        action:@selector(cancelButtonTapped)];
}

ভিউ উইলএপিয়ারে (বা যে কোনও সময় নেভিগেশন স্ট্যাকটিতে ভিউ যুক্ত হওয়ার পরে)

   if (@available(iOS 11.0, *)) {
        UIView *buttonsStackView = [navigationController.navigationBar subviewOfClass:[UIStackView class]];
        if (buttonsStackView ) {
            [buttonsStackView.centerYAnchor constraintEqualToAnchor:navigationController.navigationBar.centerYAnchor].active = YES;
            [self.navBarCustomButton.heightAnchor constraintEqualToAnchor:buttonsStackView.heightAnchor];
        }
    }

এবং সাবভিউঅফক্লাসটি ইউআইভিউতে একটি বিভাগ:

- (__kindof UIView *)subviewOfClass:(Class)targetClass {
     // base case
     if ([self isKindOfClass:targetClass]) {
        return self;
     }

     // recursive
    for (UIView *subview in self.subviews) {
        UIView *dfsResult = [subview subviewOfClass:targetClass];

        if (dfsResult) {
           return dfsResult;
       }
   }
   return nil;
}

1

আপনাকে যা করতে হবে তা হ'ল ইউআইসোচবারকে সাবক্লাস করা এবং "ইন্টার্নিসিক কনটেন্টসাইজ" ওভাররাইড করা:

@implementation CJSearchBar
-(CGSize)intrinsicContentSize{
    CGSize s = [super intrinsicContentSize];
    s.height = 44;
    return s;
}
@end

এখানে চিত্র বর্ণনা লিখুন


1

মন্তব্য করতে অক্ষম, তবে অন্যান্য সমাধানগুলির মধ্যে একটিরও ব্যবহার করার পরেও এই সমস্যার তলদেশে পৌঁছতে বেশ কয়েক ঘন্টা ব্যয় করার সময় আমি যে অতিরিক্ত কিছু সমস্যাগুলি ছড়িয়ে দিয়েছি তা ভাগ করে নিতে চেয়েছিলাম।

এটি অ্যান্ড্রুয়ের উত্তর ছিল আমার পক্ষে সেরা সমাধান :

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.view.setNeedsLayout() // force update layout
    navigationController?.view.layoutIfNeeded() // to fix height of the navigation bar
}

তবে, আইওএস 12.1 এ খুব কমপক্ষে , যদি আপনার UINavigationBar:

  • হয়েছে isTranslucentসেটfalse না দৃষ্টিভঙ্গি লেআউটের স্থায়ী ফিরে পেতে সার্চ বার প্রদর্শিত হয় সঙ্গে, দেখুন কন্ট্রোলার যখন ইন্টারেক্টিভ (কাজ ব্যাক বোতাম প্রদর্শিত হয় মাধ্যমে স্বাভাবিক খারিজ) খারিজ।
  • এটির ব্যাকগ্রাউন্ড ইমেজটি সেট করে রয়েছে setBackgroundImage(UIImage(), for: .default), ট্রানজিশন অ্যানিমেশনটি সঠিকভাবে কাজ করে না এবং সমাপ্তির পরে তার অবস্থানে ফিরে যাবে।

এই বিশেষ বৈশিষ্ট্যগুলি নেভিগেশন বারটিকে একটি নির্দিষ্ট উপায়ে হাজির করার জন্য সেট করা হয়েছিল, সুতরাং এটিকে ফিরে পাওয়ার জন্য আমাকে কিছু সামঞ্জস্য করা বা অদ্ভুত আচরণ সহ্য করতে হবে। আমি অন্য যে কোনও কিছুতে চালিয়ে গেলে বা অন্যান্য ওএস সংস্করণে অন্যান্য সমাধান বা পার্থক্য খুঁজে পাই তবে উপরেরটি আপডেট করার চেষ্টা করার চেষ্টা করবে।


0

আমার ক্ষেত্রে, বড় ইউআইএনএভিগেশন বারের উচ্চতা আমার পক্ষে কোনও সমস্যা ছিল না। আমার কেবল বাম এবং ডান বারের বোতামের আইটেমগুলিকে পুনরায় তৈরি করতে হবে। সমাধানটি আমি এনেছি:

- (void)iOS11FixNavigationItemsVerticalAlignment
{
    [self.navigationController.navigationBar layoutIfNeeded];

    NSString * currSysVer = [[UIDevice currentDevice] systemVersion];
    if ([currSysVer compare:@"11" options:NSNumericSearch] != NSOrderedAscending)
    {
        UIView * navigationBarContentView;
        for (UIView * subview in [self.navigationController.navigationBar subviews])
        {
            if ([subview isKindOfClass:NSClassFromString(@"_UINavigationBarContentView")])
            {
                navigationBarContentView = subview;
                break;
            }
        }

        if (navigationBarContentView)
        {
            for (UIView * subview in [navigationBarContentView subviews])
            {
                if (![subview isKindOfClass:NSClassFromString(@"_UIButtonBarStackView")]) continue;

                NSLayoutConstraint * topSpaceConstraint;
                NSLayoutConstraint * bottomSpaceConstraint;

                CGFloat topConstraintMultiplier = 1.0f;
                CGFloat bottomConstraintMultiplier = 1.0f;

                for (NSLayoutConstraint * constraint in navigationBarContentView.constraints)
                {
                    if (constraint.firstItem == subview && constraint.firstAttribute == NSLayoutAttributeTop)
                    {
                        topSpaceConstraint = constraint;
                        break;
                    }

                    if (constraint.secondItem == subview && constraint.secondAttribute == NSLayoutAttributeTop)
                    {
                        topConstraintMultiplier = -1.0f;
                        topSpaceConstraint = constraint;
                        break;
                    }
                }

                for (NSLayoutConstraint * constraint in navigationBarContentView.constraints)
                {
                    if (constraint.firstItem == subview && constraint.firstAttribute == NSLayoutAttributeBottom)
                    {
                        bottomSpaceConstraint = constraint;
                        break;
                    }

                    if (constraint.secondItem == subview && constraint.secondAttribute == NSLayoutAttributeBottom)
                    {
                        bottomConstraintMultiplier = -1.0f;
                        bottomSpaceConstraint = constraint;
                        break;
                    }
                }

                CGFloat contentViewHeight = navigationBarContentView.frame.size.height;
                CGFloat subviewHeight = subview.frame.size.height;
                topSpaceConstraint.constant = topConstraintMultiplier * (contentViewHeight - subviewHeight) / 2.0f;
                bottomSpaceConstraint.constant = bottomConstraintMultiplier * (contentViewHeight - subviewHeight) / 2.0f;
            }
        }
    }
}

মূলত, আমরা বার বোতাম আইটেম এবং তারপরে উপরের এবং নীচের সীমাবদ্ধতার মানগুলিকে ধারণ করে এমন স্ট্যাক দর্শনগুলি অনুসন্ধান করি। হ্যাঁ, এটি একটি ময়লা হ্যাক এবং আপনি যদি অন্য কোনও উপায়ে সমস্যার সমাধান করতে পারেন তবে এটি ব্যবহার করার পরামর্শ দিবেন না।


আমি আপনার মতো একই জিনিসটি করতে চাই, তবে আরও মার্জিত সমাধান না আসা পর্যন্ত আমি অপেক্ষা করব। যাইহোক ভাগ করে নেওয়ার জন্য ধন্যবাদ।
মাইকেল পিরোত্তে

0
//
//  Created by Sang Nguyen on 10/23/17.
//  Copyright © 2017 Sang. All rights reserved.
//

import Foundation
import UIKit

class CustomSearchBarView: UISearchBar {
    final let SearchBarHeight: CGFloat = 44
    final let SearchBarPaddingTop: CGFloat = 8
    override open func awakeFromNib() {
        super.awakeFromNib()
        self.setupUI()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
       // fatalError("init(coder:) has not been implemented")
    }
    func findTextfield()-> UITextField?{
        for view in self.subviews {
            if view is UITextField {
                return view as? UITextField
            } else {
                for textfield in view.subviews {
                    if textfield is UITextField {
                        return textfield as? UITextField
                    }
                }
            }
        }
        return nil;
    }
    func setupUI(){
        if #available(iOS 11.0, *) {
            self.translatesAutoresizingMaskIntoConstraints = false
            self.heightAnchor.constraint(equalToConstant: SearchBarHeight).isActive = true
        }
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        if #available(iOS 11.0, *) {
            if let textfield = self.findTextfield() {
                textfield.frame = CGRect(x: textfield.frame.origin.x, y: SearchBarPaddingTop, width: textfield.frame.width, height: SearchBarHeight - SearchBarPaddingTop * 2)`enter code here`
                return
            }
        }
    }
}

0

আমি মাই মাইয়ের সমাধানটি একমাত্র সত্যই ব্যবহারযোগ্য।
তবে এটি এখনও নিখুঁত নয়:
ডিভাইসটি ঘোরানোর সময়, অনুসন্ধান বারটি সঠিকভাবে পুনরায় আকার দেওয়া হয় না এবং ছোট মাত্রায় থাকে।

আমি এটির জন্য একটি সমাধান খুঁজে পেয়েছি। প্রাসঙ্গিক অংশগুলি সহ এনজেক্টেড সিতে আমার কোডটি এখানে রয়েছে:

// improvements in the search bar wrapper
@interface SearchBarWrapper : UIView
@property (nonatomic, strong) UISearchBar *searchBar;
- (instancetype)initWithSearchBar:(UISearchBar *)searchBar;
@end
@implementation SearchBarWrapper
- (instancetype)initWithSearchBar:(UISearchBar *)searchBar {
    // setting width to a large value fixes stretch-on-rotation
    self = [super initWithFrame:CGRectMake(0, 0, 4000, 44)];
    if (self) {
        self.searchBar = searchBar;
        [self addSubview:searchBar];
    }
    return self;
}
- (void)layoutSubviews {
    [super layoutSubviews];
    self.searchBar.frame = self.bounds;
}
// fixes width some cases of resizing while search is active
- (CGSize)sizeThatFits:(CGSize)size {
    return size;
}
@end

// then use it in your VC
@implementation MyViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.titleView = [[SearchBarWrapper alloc] initWithSearchBar:self.searchController.searchBar];
}
@end

এখন এখনও একটি মামলা বাকি আছে যা আমি এখনও বের করতে পারি নি। নিম্নলিখিতটি পুনরুত্পাদন করতে:
- প্রতিকৃতিতে শুরু করুন
- অনুসন্ধানের ক্ষেত্রটি সক্রিয় করুন
- ল্যান্ডস্কেপে ঘোরান
- ত্রুটি: বারটি পুনরায় আকার দেয় না


0

আমি অনুসন্ধানের বারটি এম্বেড করা হয়েছে এমন মানচিত্রের ভিউ কন্ট্রোলারে দর্শনের সীমাবদ্ধতা যোগ করে এটি ঠিক করেছি where

public override func viewDidAppear(_ animated: Bool) {
    if #available(iOS 11.0, *) {

        resultSearchController?.searchBar.heightAnchor.constraint(equalToConstant: 44).isActive = true
        // searchBar.heightAnchor.constraint(equalToConstant: 44).isActive = true
    }
}

4
আপনি সুপার.ভিউডিড অ্যাপিয়ার (অ্যানিমেটেড) এর কলিং হারিয়েছেন
রিকনকুইস্টোর

0

হাই যারা ব্যবহারের UISearchControllerএবং তারপর তার সংযোজনের UISearchBarজন্য navigationItem.titleView। এটি সমাধানের জন্য আমি আমার দিনের 4-5 ঘন্টা ব্যয় করেছি। আইওএস 11+ অনুসরণ পদ্ধতির সুপারিশ, যা নির্বাপণ করা হয় searchControllerথেকে navigation.searchControllerএকেবারে সঠিক আমার ক্ষেত্রে নয়। এই অনুসন্ধানকন্ট্রোলার / অনুসন্ধানবারের স্ক্রিনটির একটি ব্যাকবটন আছে, এটি একটি কাস্টম one

আমি এটি iOS 10, আইওএস 11 এবং 12 এ বিভিন্ন ডিভাইসে পরীক্ষা করেছি tested আমার শুধু ছিল। আমি এই অসুরকে সমাধান না করে বাড়িতে যেতে পারব না। আমার আঁটসাঁট সময়সীমার পরে, আমি আজকের পক্ষে এটি করতে সবচেয়ে নিখুঁত।

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

আমার প্রথম স্ক্রিনে (হোম স্ক্রিনটি বলুন, এতে এই অনুসন্ধানের নিয়ামক নেই), আমার এটি আমার আছে viewDidLoad()

self.extendedLayoutIncludesOpaqueBars = true

আমার দ্বিতীয় স্ক্রিনে, যা অনুসন্ধানকন্ট্রোলার রয়েছে, আমার এটি এটি রয়েছে viewDidAppear

ওভাররাইড ফানক ভিউডিডঅ্যাপার (_ অ্যানিমেটেড: বুল) {সুপার.ভিউডিড অ্যাপিয়ার (অ্যানিমেটেড)

    let systemMajorVersion = ProcessInfo.processInfo.operatingSystemVersion.majorVersion
    if systemMajorVersion < 12 {
        // Place the search bar in the navigation item's title view.
        self.navigationItem.titleView = self.searchController.searchBar
    }

    if systemMajorVersion >= 11 {

        self.extendedLayoutIncludesOpaqueBars = true

        UIView.animate(withDuration: 0.3) {
            self.navigationController?.navigationBar.setNeedsLayout()
            self.navigationController?.navigationBar.layoutIfNeeded()
        }

        self.tableView.contentInset = UIEdgeInsets(top: -40, left: 0, bottom: 0, right: 0)

        if self.viewHadAppeared {
            self.tableView.contentInset = .zero
        }
    }

    self.viewHadAppeared = true // this is set to false by default.
}

এবং এখানে আমার অনুসন্ধানকন্ট্রোলারের ঘোষণা:

lazy var searchController: UISearchController = {
    let searchController = UISearchController(searchResultsController: nil)
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.textField?.backgroundColor = .lalaDarkWhiteColor
    searchController.searchBar.textField?.tintColor = .lalaDarkGray
    searchController.searchBar.backgroundColor = .white
    return searchController
}()

সুতরাং আমি আশা করি এটি কোনও দিন কাউকে সহায়তা করবে।


-1

আকারটি আসল ৪৪-এ ফিরে পাওয়ার জন্য আমি বিভিন্ন জিনিস চেষ্টা করেছি, তবে তারপরে সার্চ বারটি সর্বদা অদ্ভুত দেখাচ্ছে y যেমনটি অনেকটা প্রসারিত, ওয়াই-অফসেট এবং একই রকম।

আমি এখানে একটি দুর্দান্ত সমাধান পেয়েছি (অন্য কিছু স্ট্যাকওভারফ্লো পোস্টের মাধ্যমে): https://github.com/DreamTravelingLight/searchBarDemo

সন্ধান ভিউকন্ট্রোলার থেকে আপনার ভিউকন্ট্রোলারটি সন্ধান করুন এবং আপনার প্রকল্পে অনুসন্ধানভিউ নিয়ন্ত্রণকারী এবং ডাব্লুএমএস অনুসন্ধানবার ক্লাসে অন্তর্ভুক্ত করুন। আমার জন্য কোনও কুৎসিত ছাড়াই বাক্সটির বাইরে কাজ করা (আইওএস 11) অন্য ... কদর্যতা।


-1

আমার ক্ষেত্রে, আমাকে পাঠ্যফিল্ডের উচ্চতা 36pt -> 28pt হ্রাস করতে হবে।

এখানে চিত্র বর্ণনা লিখুন

তাই আমি ফ্রেমের উচ্চতা, স্তরটির উচ্চতা পরিবর্তন করার চেষ্টা করেছি। তবে উপায়গুলি কার্যকর হয়নি।

অবশেষে, আমি একটি সমাধান পেয়েছি যা মুখোশ। আমি মনে করি, এটি কোনও ভাল উপায় নয় তবে এটি কাজ করে।

    let textField              = searchBar.value(forKey: "searchField") as? UITextField
    textField?.font            = UIFont.systemFont(ofSize: 14.0, weight: .regular)
    textField?.textColor       = #colorLiteral(red: 0.1960784314, green: 0.1960784314, blue: 0.1960784314, alpha: 1)
    textField?.textAlignment   = .left

    if #available(iOS 11, *) {
        let radius: CGFloat           = 5.0
        let magnifyIconWidth: CGFloat = 16.0
        let inset                     = UIEdgeInsets(top: 4.0, left: 0, bottom: 4.0, right: 0)

        let path = CGMutablePath()
        path.addArc(center: CGPoint(x: searchBar.bounds.size.width - radius - inset.right - magnifyIconWidth, y: inset.top + radius), radius: radius, startAngle: .pi * 3.0/2.0, endAngle: .pi*2.0, clockwise: false)                        // Right top
        path.addArc(center: CGPoint(x: searchBar.bounds.size.width - radius - inset.right - magnifyIconWidth, y: searchBar.bounds.size.height - radius - inset.bottom), radius: radius, startAngle: 0, endAngle: .pi/2.0, clockwise: false)  // Right Bottom
        path.addArc(center: CGPoint(x: inset.left + radius, y: searchBar.bounds.size.height - radius - inset.bottom), radius: radius, startAngle: .pi/2.0, endAngle: .pi, clockwise: false)                                                  // Left Bottom
        path.addArc(center: CGPoint(x: inset.left + radius, y: inset.top + radius),  radius: radius, startAngle: .pi, endAngle: .pi * 3.0/2.0, clockwise: false)                                                                             // Left top

        let maskLayer      = CAShapeLayer()
        maskLayer.path     = path
        maskLayer.fillRule = kCAFillRuleEvenOdd

        textField?.layer.mask = maskLayer
    }

আপনি যদি পাঠ্য ফিল্ডের ফ্রেম পরিবর্তন করতে চান তবে ইনসেটগুলি পরিবর্তন করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.