UISearchBar iOS 11 में नेविगेशन बार की ऊंचाई बढ़ाता है


89

मेरे पास UISearchBarनेविगेशन बार का हिस्सा है जैसे:

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

iOS 11कुछ अजीब करने के लिए अद्यतन करने के बाद मेरे ऐप में खोज बार में हुआ। पर iOS 10और पहले मैं अपने नेविगेशन पट्टी की तरह लग रही थी:

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

अब iOS 11मेरे पास है:

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

जैसा कि आप देख सकते हैं कि दो सर्च बारों की गोलाई में अंतर है जो मुझे परेशान नहीं करता है। समस्या यह है कि खोज बार नेविगेशन बार की ऊंचाई बढ़ाता है। इसलिए जब मैं किसी अन्य नियंत्रक पर जाता हूं तो यह भी अजीब लगता है:

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

वास्तव में है कि अजीब काली रेखा की ऊंचाई प्लस वर्तमान नेविगेशन बार की ऊंचाई दूसरी तस्वीर में दिखाए गए नेविगेशन बार की ऊंचाई के बराबर है ...

किसी भी विचार कैसे काली रेखा से छुटकारा पाने के लिए और सभी दृश्य नियंत्रकों में लगातार नेविगेशन बार ऊंचाई है?


जवाबों:


66

मुझे नेविगेशनबेर के तहत दो मामलों में iOS 11 में SearchBar के साथ काली रेखा मिली:

  • जब मैंने UISearchBar के साथ ViewController के एक और ViewControllers को धकेल दिया यहाँ छवि विवरण दर्ज करें

  • जब मैंने UISearchBar के साथ ViewController को खारिज कर दिया "खारिज करने के लिए खींचें सही" के साथ यहाँ छवि विवरण दर्ज करें

मेरा समाधान था: UISearchBar के साथ मेरे ViewController के लिए इस कोड को जोड़ना:

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

2
मेरे लिए सावधानी के साथ इसका उपयोग करें क्योंकि इसने पूरे ऐप को फ्रीज कर दिया है, जब इसे वापस देखने की कोशिश की गई है, जो कि
व्यापक

1
यह समाधान वास्तव में मेरे लिए एक बड़ी राहत देता है धन्यवाद @andrew
सागर

67

आप iOS 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
पूरी तरह से अजीब लग रहा है अगर आप इस कोड का उपयोग करते हैं क्योंकि यह सिर्फ नेविगेशन बार को
संकरा करता

4
क्या किसी और ने कोई हल निकाला? ऐसा करने से खोज बार के साथ कई अजीब व्यवहार के मुद्दे पैदा होते हैं।
गुस्तावो_फ्रिंग

15
यह पर्याप्त उत्तर नहीं है। जब आप फ़ील्ड पर क्लिक करते हैं, तो आकार अभी भी गड़बड़ है।
रोस

5
यह आईओएस में काम नहीं करता है। 13. इसके लिए कोई वर्कअराउंड?
वीवी

42

मेरा मानना ​​है कि iOS 11 UISearchBar में अब ऊँचाई 56 के बराबर हो गई है, और UINavigationBar अपने सब-वे को फिट करने के लिए ऑटोलयूट का उपयोग करता है इसलिए यह ऊंचाई को बढ़ाता है। यदि आप अभी भी UISearchBar को पूर्व-iOS 11 के शीर्षक के रूप में देखना चाहते हैं, तो मुझे यह करने का सबसे अच्छा तरीका पता चला कि यह एक कस्टम दृश्य में UISearchBar को एम्बेड करना है, और इस दृश्य की ऊँचाई को 44 पर सेट करना है, और इसे नेविगेशनItem.titleView पर असाइन करना है

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

वास्तव में यह उत्तर होना चाहिए। लेकिन मैं खोज बार नियंत्रक के ऊपर और नीचे दोनों नियंत्रक में कोड के इस टुकड़े को जोड़ना चाहता हूं।
अमृत ​​सिद्धू

वह मेरे लिए काम करता है, लेकिन एक नेविगेशन नेविगेशन जोड़ने की जरूरत थी।
douglasd3

यह बहुत अच्छी तरह से काम करता है, मैं वास्तव में सराहना करूंगा यदि आप हमें बताएं कि extendedLayoutIncludesOpaqueBars संपत्ति क्या करती है।
अनिरुद्ध महाले

ExtendedLayoutIncludesOpaqueBars नेविगेशन और स्टेटस बार के तहत आपके विचार (self.view) का विस्तार करता है। यदि आप दृश्य (उदाहरण के लिए, UIImageView) के लिए एक सबव्यू जोड़ते हैं और इसे देखने के शीर्ष-बाएँ में बाधा सेट करते हैं और अनुप्रयोग चलाते हैं, तो जब आप इस गुण को सही और गलत के बीच सेट करते हैं, तो आपको भिन्न दिखाई देगा।
सिल्वरविंड सेप

6

आप सभी को धन्यवाद! मैंने आखिरकार एक समाधान ढूंढ लिया।

UISearchBar के साथ ViewController के लिए निम्न कोड जोड़ना।

  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

मेरे साथ भी ऐसा होता है, सभी iOS 12.4 में अच्छी तरह से चल रहे हैं और ऊपर 13 में अजीब हो रहे हैं। समस्या यह है कि iOS 13 नेविगेशन बार में UIViewController से कूदने के बाद 88 से 100 की ऊंचाई बढ़ जाती है जो सर्चबार को लागू करती है।

अपने UIViewController में इसे आज़माएं जो searchBar को कार्यान्वित करता है।

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

फिक्सिंग के बाद पूर्वावलोकन:

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

फिक्सिंग से पहले पूर्वावलोकन करें:

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


1

EDIT: @zgjie उत्तर इस समस्या का बेहतर समाधान है: https://stackoverflow.com/a/46356265/1713123

ऐसा लगता है कि ऐसा इसलिए होता है क्योंकि iOS 11 में पिछले iOS वर्जन पर 44 के बजाय सर्चबेर की डिफॉल्ट हाइट वैल्यू को 56 में बदल दिया गया था।

अभी के लिए, मैंने इस वर्कअराउंड को लागू किया है, खोजबेर की ऊँचाई 44 पर सेट की है:

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

एक और समाधान iOS 11 में नेविगेशन इटेम पर नई खोजकंट्रोलर संपत्ति का उपयोग कर सकता है :

navigationItem.searchController = searchController

लेकिन इस तरह से दा सर्चबार नेविगेशन शीर्षक से नीचे दिखाई देता है।


1
क्या बदलाव कहीं दस्तावेज है? मैं इसे यहां नहीं पा सका ।
इयूलियन ओनोफ्रेई

1
FYI करें, आप इसके लिए एक चर बनाए बिना फ्रेम को संशोधित कर सकते हैं; CGRect().insetBy(dx:dy:)और CGRect().offsetBy(dx:dy:)इस मामले में -searchController.searchBar.frame = searchController.searchBar.frame.insetBy(dx: 0, dy: -12)
ऑस्कर अपलैंड

इस समाधान ने काम किया लेकिन जब आप खोज बार पर क्लिक करते हैं तो ऊंचाई रीसेट हो जाती है।
गुस्तावो_फ्रिंज

@Gustavo_fringe क्या आपको इसके लिए कोई समाधान मिला।
शिवम पोखरियाल

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

इसने नए दृश्य केंद्र में काले दृश्य को हटा दिया, लेकिन जब इस दृश्य-केंद्र पर वापस लौट रहा है (जिसमें सर्चबार शामिल है), तो rootView वास्तव में थोड़ा ऊपर चला गया।
code4latte

1

मैं 44 पर navBar रखने के समाधान का उपयोग नहीं कर सका। इसलिए मुझे एक दिन लगा लेकिन आखिरकार, मुझे एक ऐसा समाधान मिला, जो बार की ऊँचाई को नहीं बदलता है और बार के बीच में बटन को स्थिति देता है। मुद्दा यह है कि बटन एक स्टैक दृश्य में रखे गए हैं, जो क्षैतिज स्टैक दृश्य के रूप में कॉन्फ़िगर किया गया है और इसलिए ऊंचाई में परिवर्तन के लिए समायोजित नहीं होता है।

यह 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)];
}

viewWillApear पर (या किसी भी समय देखने के बाद नेविगेशन स्टैक में जोड़ा गया था)

   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

आपको केवल UISearchBar को उप-लिंक करना है और "intrinsicContentSize" को ओवरराइड करना है:

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

हालाँकि, iOS 12.1 में बहुत कम से कम , यदि आपका UINavigationBar:

  • के लिए isTranslucentसेट किया गया है false, खोज बार के साथ व्यू कंट्रोलर को यह देखने के लिए नहीं मिलता है कि यह इंटरएक्टिव तरीके से खारिज होने पर वापस समायोजित हो गया है (बैक बटन के माध्यम से सामान्य रूप से खारिज करना काम करता है)।
  • यह पृष्ठभूमि छवि का उपयोग कर सेट है setBackgroundImage(UIImage(), for: .default), संक्रमण एनीमेशन ठीक से काम नहीं करता है और परिष्करण के बाद अपनी स्थिति में वापस कूद जाएगा।

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


0

मेरे मामले में, बड़ा UINavigationBar की ऊंचाई मेरे लिए कोई समस्या नहीं थी। मुझे बस लेफ्ट और राइट बार बटन आइटम को पुन: डिज़ाइन करने की आवश्यकता थी। यही समाधान मैं लेकर आया हूँ:

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

मैंने पाया कि माई माई का समाधान एकमात्र ऐसा है जो वास्तव में प्रयोग करने योग्य है।
हालांकि यह अभी भी सही नहीं है:
डिवाइस को घुमाते समय, सर्च बार ठीक से आकार नहीं लेता है और छोटे आयाम में रहता है।

मैंने उसके लिए एक फिक्स पाया है। यहाँ मेरा कोड Objective C में संबंधित संबंधित एनोटेट के साथ है:

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

मैंने इसे खोज दृश्य नियंत्रक जहां खोज पट्टी एम्बेड किया गया है, मानचित्र दृश्य नियंत्रक पर बाधा को जोड़कर तय किया

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

1
आपको Super.viewDidAppear (एनिमेटेड)
Reconquistador

0

हाय जो लोग उपयोग करते हैं UISearchControllerऔर फिर इसके साथ संलग्न UISearchBarकरते हैं navigationItem.titleView। मैंने इसे हल करने के लिए अपने दिन के 4-5 घंटे पागल कर दिए हैं। आईओएस 11+ निम्नलिखित दृष्टिकोण की सिफारिश की है, जो रहा है searchControllerकरने के लिए navigation.searchControllerसिर्फ सही मेरे मामले के लिए नहीं है। स्क्रीन जिसमें यह सर्चकंट्रोलर / सर्चबार है बैकबटन, एक कस्टम एक है।

मैंने इसका परीक्षण iOS 10, iOS 11 और 12. विभिन्न उपकरणों में किया है। मुझे बस करना था। मैं इस दानव को हल किए बिना घर नहीं जा सकता। यह सबसे सही है जो मैं आज के लिए कर सकता हूं, मेरी तंग समय सीमा को देखते हुए।

तो मैं बस इस कड़ी मेहनत को साझा करना चाहता हूं जो मैंने किया था, यह आपके ऊपर है कि आप जहां चाहें वहां सब कुछ डाल दें (आपके दृश्यम में चर।) ये रहा:

मेरी पहली स्क्रीन में (होम स्क्रीन कहो, कि यह खोज नियंत्रक नहीं है), मेरे पास यह है viewDidLoad()

self.extendedLayoutIncludesOpaqueBars = true

मेरी दूसरी स्क्रीन में, जो सर्चकंट्रोलर है, मेरे पास यह है viewDidAppear

ओवरराइड func viewDidAppear (_ एनिमेटेड: बूल) {super.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

मैंने आकार को मूल 44 में वापस लाने के लिए विभिन्न चीजों की कोशिश की, लेकिन फिर खोज पट्टी हमेशा अजीब दिखती है और व्यवहार करती है - जैसे कि दूर तक फैली हुई, वाई-ऑफ और एक जैसे।

मुझे यहां एक अच्छा समाधान मिला (कुछ अन्य स्टैकओवरफ़्लो पोस्ट के माध्यम से): https://github.com/DreamTravelingLight/searchBarDemo

बस अपने व्यू कंट्रौलर को SearchViewController से प्राप्त करें और अपने प्रोजेक्ट में SearchViewController और WMSearchbar कक्षाओं को शामिल करें। बिना किसी बदसूरत के मेरे लिए बॉक्स से बाहर काम किया अगर (iOS11) बाकी ... बदसूरती।


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

आप इनसेट्स को बदल सकते हैं, अगर आप टेक्स्टफिल्ड के फ्रेम को बदलना चाहते हैं।

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