web-dev-qa-db-fra.com

Comment ajouter le UISegmentedControl dans UINavigationBar?

J'ai essayé d'ajouter UISegmentedControl au bas de UINavigationBar avec le titre. Mais je ne peux pas l'ajouter et je ne peux pas ajouter UISegmentedControl dans le tableView.headerView, car j'ai besoin de la barre de recherche dans le tableView.headerView, il n'y a donc qu'une solution pour laquelle j'ai besoin d'ajouter UISegmentedControl au bas de UINavigationBar. Quelqu'un a une autre idée que je peux résoudre cette situation?

Voici le code que j'ai essayé (avec Swift ):

        class searchingViewController: UITableViewController{ 
                override func viewDidLoad() {         
                    var items: [AnyObject] = ["Searching Method A", "Searching Method B"]
                    var searchSC:UISegmentedControl!
                    searchSC.frame = CGRectMake(0, 0, frame.width - 20, 30)
                    searchSC.selectedSegmentIndex = 1
                    searchSC.backgroundColor = UIColor(white: 1, alpha: 1)
                    searchSC.layer.cornerRadius = 5.0
                    navigateUIToolBar = UIToolbar(frame: CGRectMake(frame.minX + 10, ios7_8Info.getStatusBarHeight()+self.navigationController!.navigationBar.frame.height+frame.minY+(21/2),
                        frame.width - 20, 30))

                    navigateUIToolBar.addSubview(searchSC)
                    self.navigationController?.navigationBar.addSubview(navigateUIToolBar)
                  }
          }
12
Jacky Shek

Pour le mettre dans la barre de navigation, vous avez une vue à gauche et un titre pour de telles choses ... accessibles via ....

self.navigationItem.titleView = mySegmentedControl

pour référence future....

self.navigationItem.rightBarButtonItem
self.navigationItem.leftBarButtonItems // for adding an Array of items

Pour l'ajouter au-dessous de la vue de navigation mais en l'avoir statique, ajoutez-le à viewController.view ... Utilisez-vous un UITableViewController? Si c'est le cas, passez peut-être à un UIViewController et ajoutez une tableView, puis votre vue toolbar en tant que sous-vues à cette self.view.

17
Magoo

Pour ajouter le contrôle de segment dans UINavigationBar dans Swift 4

    let segment: UISegmentedControl = UISegmentedControl(items: ["First", "Second"])
    segment.sizeToFit()
    segment.tintColor = UIColor(red:0.99, green:0.00, blue:0.25, alpha:1.00)
    segment.selectedSegmentIndex = 0;
    segment.setTitleTextAttributes([NSAttributedStringKey.font : UIFont(name: "ProximaNova-Light", size: 15)!], for: .normal)
    self.navigationItem.titleView = segment
15
Hardik Thakkar

Je pense que vous cherchez ceci.

let searchVC = self.storyboard?.instantiateViewController(withIdentifier:"idofcontroller")
let searchController = UISearchController(searchResultsController: searchVC)
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.placeholder = "Search"
navigationItem.searchController = searchController
definesPresentationContext = true

searchController.searchBar.scopeButtonTitles = ["News", "Photos", "Videos"]
searchController.searchBar.delegate = self

 enter image description here

3
Abhishek

Voici comment je le fais dans l'Objectif C (désolé, je n'ai pas encore appris Swift):

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.viewControllers = [self segmentViewControllers];

    self.segmentedControl = [[UISegmentedControl alloc] initWithItems: [self.segmentedControl addTarget: self
                          action: @selector(segmentClicked:)
                forControlEvents: UIControlEventValueChanged];

    CGFloat topOffset = self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height;

    self.toolbar = [[UIToolbar alloc] initWithFrame: CGRectMake(0, topOffset, self.navigationController.navigationBar.frame.size.width, kDefaultViewHeight)];
    self.toolbar.delegate = self;

    self.navigationController.navigationBar.backgroundColor = [UIColor whiteColor];
    self.toolbar.backgroundColor = [UIColor whiteColor];
    self.toolbar.clipsToBounds = YES;

    UIBarButtonItem *segmentedControlItem = [[UIBarButtonItem alloc] initWithCustomView: self.segmentedControl];
    UIBarButtonItem *flexibleItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemFlexibleSpace
                                                                              target: nil
                                                                              action: nil];

    [self.toolbar setItems: @[flexibleItem, segmentedControlItem, flexibleItem] animated: YES];

    [self.navigationController.view addSubview: self.toolbar];

    self.segmentedControl.selectedSegmentIndex = 0;
}

Et dans UITableViewController (l'un des segmentViewControllers):

  self.tableView.contentInset = UIEdgeInsetsMake(topOffset, 0, 0, 0);

    CGRect currentFrame = self.tableView.frame;
    [self.tableView setFrame: CGRectMake(currentFrame.Origin.x,
                                     currentFrame.Origin.y,
                                     currentFrame.size.width,
                                     currentFrame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height)];
2
Koen

Vous pouvez également ajouter le contrôle de segment à une barre de recherche, pas à l'élément de navigation. Si vous êtes comme moi, il me fallait un grand titre + une barre de recherche + un élément de navigation, ce qui serait impossible avec la première réponse actuelle.

La réponse de @Abhishek est proche. Vous feriez quelque chose comme ce qui suit:

// Create the search controller
let searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.scopeButtonTitles = ["Option 1", "Option 2"]

// Make sure the scope bar is always showing, even when not actively searching
searchController.searchBar.showsScopeBar = true

// Make sure the search bar is showing, even when scrolling
navigationItem.hidesSearchBarWhenScrolling = false

// Add the search controller to the nav item   
navigationItem.searchController = searchController
definesPresentationContext = true

@Gurjit Singh, la ligne avec .showsScopeBar = true est la solution à votre problème.

0
Dominic Holmes

vous pouvez personnaliser le titleView de navigationItem, comme ceci:

self.navigationItem.titleView = segmentview

vous ne devez pas ajouter de sous-vue à la barre de navigation, car après le Push ou le pop-up UIViewcontroller, la sous-vue est toujours affichée dans la barre de navigation.

0
williamwu