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.