web-dev-qa-db-ja.com

UINavigationBarにUISegmentedControlを追加する方法

タイトルを付けてUISegmentedControlUINavigationBarの末尾に追加しようとしました。しかし、私はそれを追加できず、tableView.headerViewUISegmentedControlを追加できません。tableView.headerViewに検索バーが必要なため、追加する必要がある解決策は1つだけですUISegmentedControlUINavigationBarの末尾に追加します。誰かがこの状況を解決できるという別のアイデアがありますか?

これが私が試したコードです(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)
                  }
          }
16
Jacky Shek

それをnavigationBarに配置するには、そのようなもののために右左とタイトルビューがあります...を使用してアクセスします...

self.navigationItem.titleView = mySegmentedControl

今後の参考のために....

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

ナビゲーションビューの下に追加しますが、静的にします。viewController.viewに追加します... UITableViewControllerを使用していますか?もしそうなら、UIViewControllerに切り替えてtableViewを追加し、ツールバービューをそのself.viewのサブビューとして追加します。

18
Magoo

Swift 5のUINavigationBarにセグメントコントロールを追加するには==

    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([NSAttributedString.Key.font : UIFont(name: "ProximaNova-Light", size: 15)!], for: .normal)
    self.navigationItem.titleView = segment
25
Hardik Thakkar

あなたはこれを探していると思います。

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

6
Abhishek

これは私がObjective Cでそれを行う方法です(申し訳ありませんが、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;
}

そしてUITableViewController(segmentViewControllersの1つ)で:

  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)];
3
koen

ナビゲーション項目ではなく、検索コントロールにセグメントコントロールを追加することもできます。私と同じように、大きなタイトル+検索バー+ナビゲーションアイテムが必要でしたが、これは現在のトップの回答では不可能です。

@Abhishekの回答は間近です。次のようにします。

// 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、.showsScopeBar = trueの行が問題の解決策です。

1
Dominic Holmes

次のように、navigationItemのtitleViewをカスタム化できます。

self.navigationItem.titleView = segmentview

ナビゲーションバーにサブビューを追加しないでください。プッシュまたはポップUIViewcontrollerの後、サブビューはナビゲーションバーにまだ存在します。

1
williamwu