UISearchBar збільшує висоту навігаційної панелі в iOS 11


89

У мене UISearchBarє частина навігаційної панелі, як:

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

Після оновлення до iOS 11чогось дивного сталося з рядком пошуку в моєму додатку. Раніше iOS 10і раніше у мене була панель навігації, яка виглядала так:

введіть тут опис зображення

Тепер у iOS 11мене є:

введіть тут опис зображення

Як бачите, є різниця в округленні двох пошукових рядків, що мене не турбує. Проблема в тому, що рядок пошуку збільшує висоту панелі навігації. Тому, коли я переходжу до іншого контролера, це теж дивно виглядає:

введіть тут опис зображення

Насправді ця дивна висота чорної лінії плюс висота поточної навігаційної панелі дорівнює висоті навігаційної панелі, показаної на другому малюнку ...

Будь-які ідеї, як позбутися чорної лінії та мати стабільну висоту навігаційної панелі на всіх контролерах перегляду?


Можливий дублікат iOS 11 SearchBar у
панелі

Відповіді:


66

Я отримав чорну лінію під навігаційною панеллю з SearchBar в iOS 11 у двох випадках:

  • коли я штовхнув інший ViewControllers з ViewController за допомогою UISearchBar введіть тут опис зображення

  • коли я відхиляв ViewController за допомогою UISearchBar з "перетягуванням праворуч, щоб звільнити" введіть тут опис зображення

Моє рішення: додавання цього коду до мого ViewController за допомогою UISearchBar:

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

Оновлення Swift 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
Sagar Daundkar

67

Ви можете додати обмеження висоти 44 до рядка пошуку для iOS 11.

// Стрімкий

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
Зовсім дивно, якщо ви використовуєте цей код, оскільки він просто звужує панель навігації, але висота панелі пошуку все ще 56.
OtakuFitness

4
Хтось ще знайшов рішення? це створює багато дивних поведінкових проблем із рядком пошуку.
Gustavo_fringe

15
Відповіді недостатньо. Коли ви натискаєте на поле, розмір все ще псується.
Росс

5
Це не працює в iOS 13. Будь-яке обхідне рішення для цього?
В. В.

42

Я вважаю, що в iOS 11 UISearchBar тепер має висоту, рівну 56, а UINavigationBar використовує авторозкладку, щоб відповідати своїм підпроглядам, отже збільшує висоту. Якщо ви все ще хочете мати UISearchBar як titleView, як у iOS 11, я виявив, що найкращий спосіб зробити це - вбудувати UISearchBar у власному поданні та встановити висоту цього подання на 44 та призначити його для navigationItem.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  
    }  
} 

Це працює правильно, але виникає проблема, коли ви змінюєте його на альбомний із книжкового.
Malav Soni

Чудове рішення, якщо ви не використовуєте автоматичне розміщення. Поки що, здається, це працює і в альбомному режимі, в симуляторі.
Райан Х.

Я опублікував рішення, яке виправляє проблеми зі зміною орієнтації.
де.

Ця відповідь вирішила всі проблеми. Відповідь zgjie чудова, але кадр рядка пошуку все ще змінився після натискання текстового поля.
Charlie Hung

19

спробуйте цей код на контролері перегляду "ПОДЯКИ" у viewDidLoad

self.extendedLayoutIncludesOpaqueBars = true

Дякую! Це рішення, з яким я в підсумку пішов, оскільки я не використовую напівпрозорі бруски.
mmh02,

Дійсно, це має бути відповіддю. Але я хотів би додати, що цей фрагмент коду розміщується як у контролері, так і над контролером рядка пошуку.
Амріт Сідху

Це працювало для мене, але мені довелося додати NaviController? .View.layoutSubviews () у viewWillDisappear.
douglasd3

Це працює дуже добре, я був би дуже вдячний, якщо б ви просто сказали нам, чим extendedLayoutIncludesOpaqueBars займається майно.
Анірудха Махале

ExtendedLayoutIncludesOpaqueBars розширює ваш вигляд (self.view) під навігаційною панеллю та рядком стану. Якщо ви додасте підзагляд до подання (наприклад, UIImageView) і встановите його обмеження вгорі ліворуч від подання та запустите програму, ви побачите різне, якщо встановите цю властивість між істинною та хибною.
Silverwind

6

Дякую вам всім! Нарешті я знайшов рішення.

Додавання наступного коду до ViewController за допомогою UISearchBar.

  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

У Objective-C

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

2

Це трапляється і зі мною, все добре працює в iOS 12.4 і стає дивним у 13 вище. Проблема полягає у збільшенні висоти навігаційної панелі iOS 13 з 88 до 100 після переходу з UIViewController, що реалізує searchBar.

Спробуйте це у своєму 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 значення висоти SearchBar за замовчуванням було змінено на 56, а не на 44 у попередніх версіях iOS.

На даний момент я застосував цей обхідний шлях, встановивши висоту searchBar назад до 44:

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

Іншим рішенням може бути використання нової властивості searchController на навігаційному елементі в iOS 11 :

navigationItem.searchController = searchController

Але таким чином da searchBar з'являється під заголовком навігації.


1
Зміни десь задокументовані? Я не міг його знайти тут .
Юліан Онофрей

1
FYI, ви можете змінити кадр, не створюючи для нього змінної; CGRect().insetBy(dx:dy:)і CGRect().offsetBy(dx:dy:), в даному випадку -searchController.searchBar.frame = searchController.searchBar.frame.insetBy(dx: 0, dy: -12)
Оскар Апеленд

Це рішення спрацювало, але після натискання рядка пошуку висота скидається.
Gustavo_fringe

@Gustavo_fringe Чи знайшли ви якесь рішення для цього.
Шівам Pokhriyal

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

Я не міг використати рішення збереження navBar на рівні 44. Тож це зайняло у мене день, але, нарешті, я знайшов рішення, яке не змінює висоту стовпчика і не розташовує кнопку посередині панелі. Проблема полягає в тому, що кнопки розміщуються у поданні стека, який налаштовано як горизонтальний вигляд стека, і тому не пристосовується до зміни висоти.

Це робиться на 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)];
}

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

А subviewOfClass - це категорія на UIView:

- (__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, в View Controller з з'являється панель пошуку , щоб не отримати макет регулюється підперти його Висловитися, коли в інтерактивному режимі звільнення (нормальний , відмовили через спину з'являється кнопка для роботи).
  • якщо встановлено фонове зображення 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;
            }
        }
    }
}

По суті, ми шукаємо подання стека, які містять елементи кнопок панелі, а потім змінюємо їх значення верхнього та нижнього обмежень. Так, це брудний хакер, і я не рекомендую використовувати його, якщо ви можете вирішити проблему будь-яким іншим способом.


Я хочу зробити те саме, що і ви, але я зачекаю, поки не з’явиться більш елегантне рішення. Дякуємо, що все одно поділились.
Michael Pirotte,

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

Я знайшов рішення Mai Mai єдиним, що справді придатне для використання.
Однак це все ще не ідеально:
під час обертання пристрою панель пошуку не змінюється належним чином і залишається в меншому розмірі.

Я знайшов це виправлення. Ось мій код у 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

Я виправив це, додавши обмеження на viewDidAppear на контролері перегляду карти, де вбудований рядок пошуку

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 (анімований)
Реконкістадор

0

Привіт людям, які використовують, UISearchControllerа потім додають його UISearchBarдо navigationItem.titleView. Я витратив на це божевільні 4-5 годин дня, щоб це вирішити. Після КСН 11+ рекомендується підхід, який є прийняття searchControllerвnavigation.searchController це не просто підходить для мого випадку. Екран, на якому є цей searchController / searchBar, має спеціальну кнопку backButton.

Я тестував це на iOS 10, iOS 11 та 12. На різних пристроях. Я просто мусив. Я не можу повернутися додому, не вирішивши цього демона. Це найдосконаліше, що я міг зробити на сьогодні, враховуючи мій обмежений термін.

Тож я просто хочу поділитися цією важкою працею, яку я зробив, це від вас залежить, щоб ви розмістили все туди, куди завгодно (наприклад, змінні у вашому viewModel). Ось справа:

На моєму першому екрані (скажімо, на головному екрані, який не має цього контролера пошуку), я маю це в своєму viewDidLoad().

self.extendedLayoutIncludesOpaqueBars = true

На моєму другому екрані, на тому, який має searchController, я маю це в своєму viewDidAppear .

перевизначити функцію viewDidAppear (_ анімований: Bool) {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.
}

і ось декларація мого searchController:

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, але тоді рядок пошуку завжди виглядає і поводиться дивно - як би бути набагато розтягнутим, зміщеним у та ін.

Я знайшов тут гарне рішення (через інший пост stackoverflow): https://github.com/DreamTravelingLight/searchBarDemo

Просто отримайте свій контролер перегляду з SearchViewController і включіть у свій проект класи SearchViewController та WMSearchbar. Працював нестандартно для мене без жодної потворної, якщо (iOS11) ще ... потворності.


-1

У моєму випадку мені доводиться зменшувати висоту textField на 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
    }

Ви можете змінити вставки, якщо хочете змінити рамку textField.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.