Wie verwende ich einen UISegmentedControl Ansichten zu wechseln?
-
20-08-2019 - |
Frage
Ich versuche, herauszufinden, wie man die verschiedenen Zustände eines UISegmentedControl verwenden Ansichten zu wechseln, ähnlich wie Apple-tut es im Store App, wenn zwischen ‚Top Paid‘ und ‚Top Free‘ switiching.
Lösung
Der einfachste Ansatz ist zwei Ansichten zu haben, dass Sie ihre Sichtbarkeit umschalten kann, um anzuzeigen, welche Ansicht gewählt wurde. Hier ist ein Beispielcode, wie es getan werden kann, auf keinen Fall eine optimierte Art und Weise die Ansichten zu handhaben, aber nur um zu zeigen, wie Sie verwenden können, die UISegmentControl die sichtbare Ansicht wechseln:
- (IBAction)segmentSwitch:(id)sender {
UISegmentedControl *segmentedControl = (UISegmentedControl *) sender;
NSInteger selectedSegment = segmentedControl.selectedSegmentIndex;
if (selectedSegment == 0) {
//toggle the correct view to be visible
[firstView setHidden:NO];
[secondView setHidden:YES];
}
else{
//toggle the correct view to be visible
[firstView setHidden:YES];
[secondView setHidden:NO];
}
}
Sie können den Code natürlich weiter erneut Faktor, der die rechte Ansicht aus- / eingeblendet.
Andere Tipps
In meinem Fall sind meine Ansichten ziemlich komplex, und ich kann nicht nur die verborgene Eigenschaft ändern verschiedener Ansichten, weil es zu viel Speicher benötigen würde.
Ich habe versucht, verschiedene Lösungen und nicht von ihnen für mich gearbeitet, oder erratisch durchgeführt, speziell mit dem Titleview des navBar nicht immer die segmentedControl zeigt, wenn Schiebe- / popping Ansichten.
Ich fand diese Blog-Post über das Problem, das erklärt, wie es in der richtigen Art und Weise zu tun. Scheint er die Hilfe von Apple Ingenieure bei WWDC'2010 hatte mit dieser Lösung zu kommen.
http://redartisan.com/2010/6/ 27 / uisegmented-control-view-switching-revisited
Die Lösung in diesem Link ist zweifellos die beste Lösung, die ich bisher über das Thema gefunden habe. Mit einem wenig Anpassungs arbeitete sie auch mit einem tabBar am Boden fein
oder wenn sie ein Tisch, können Sie die Tabelle und in cellForRowAtIndex, füllen Sie die Tabelle aus unterschiedlichen Datenquellen auf der Basis des Segments Option neu zu laden.
Eine Idee ist, die Ansicht mit den segmentierten Kontrollen haben hat einen Container Ansicht, die Sie mit den verschiedenen Subviews füllen (als einziger subview der Behälter Ansicht hinzufügen, wenn die Segmente umgeschaltet werden). Sie können sogar separate Ansicht-Controller für die Subviews haben, obwohl Sie über wichtige Methoden wie „viewWillAppear“ zu übermitteln haben und „viewWillDisappear“, wenn Sie sie benötigen (und sie werden müssen gesagt, was Navigation-Controller sind sie unter).
Im Allgemeinen, das ziemlich gut funktioniert, weil Sie die Hauptansicht mit Behälter in IB auslegen kann und die Subviews füllen, was Raum der Behälter ihnen (stellen Sie sicher, Ihre Autoresize Masken eingerichtet sind richtig) können.
Versuchen Sie diesen Code, dieser Wille hilft Ihnen, zwischen verschiedenen Ansichten auf wechselnden Segmenten Segmentsteuerung wechseln
öffnen verschiedene Ansichten auf verschiedenen Segmenten UISegmentControl Auswahl
Versuchen Sie es mit SNFSegmentedViewController
, eine Open-Source-Komponente, die genau das tut, was Sie suchen mit Setup wie UITabBarController
.
Aus der Antwort von @Ronnie Liew, schaffe ich dies:
//
// ViewController.m
// ResearchSegmentedView
//
// Created by Ta Quoc Viet on 5/1/14.
// Copyright (c) 2014 Ta Quoc Viet. All rights reserved.
//
#define SIZE_OF_SEGMENT 56
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize theSegmentControl;
UIView *firstView;
UIView *secondView;
CGRect leftRect;
CGRect centerRect;
CGRect rightRect;
- (void)viewDidLoad
{
[super viewDidLoad];
leftRect = CGRectMake(-self.view.frame.size.width, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT);
centerRect = CGRectMake(0, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT);
rightRect = CGRectMake(self.view.frame.size.width, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT);
firstView = [[UIView alloc] initWithFrame:centerRect];
[firstView setBackgroundColor:[UIColor orangeColor]];
secondView = [[UIView alloc] initWithFrame:rightRect];
[secondView setBackgroundColor:[UIColor greenColor]];
[self.view addSubview:firstView];
[self.view addSubview:secondView];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)segmentSwitch:(UISegmentedControl*)sender {
NSInteger selectedSegment = sender.selectedSegmentIndex;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.2];
if (selectedSegment == 0) {
//toggle the correct view to be visible
firstView.frame = centerRect;
secondView.frame = rightRect;
}
else{
//toggle the correct view to be visible
firstView.frame = leftRect;
secondView.frame = centerRect;
}
[UIView commitAnimations];
}
@end
zuordnen · H in
UISegmentedControl *lblSegChange;
- (IBAction)segValChange:(UISegmentedControl *) sender
Deklarieren .M
- (IBAction)segValChange:(UISegmentedControl *) sender
{
if(sender.selectedSegmentIndex==0)
{
viewcontroller1 *View=[[viewcontroller alloc]init];
[self.navigationController pushViewController:view animated:YES];
}
else
{
viewcontroller2 *View2=[[viewcontroller2 alloc]init];
[self.navigationController pushViewController:view2 animated:YES];
}
}
Swift-Version:
Die Eltern-View-Controller ist verantwortlich für die Größe und die Position der Ansicht jedes Kind-View-Controller einstellen. Der Blick des Kindes View-Controller wird ein Teil der Ansichtshierarchie übergeordneten View-Controller.
definiert faul Eigenschaften:
private lazy var summaryViewController: SummaryViewController = {
// Load Storyboard
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
// Instantiate View Controller
var viewController = storyboard.instantiateViewController(withIdentifier: "SummaryViewController") as! SummaryViewController
// Add View Controller as Child View Controller
self.add(asChildViewController: viewController)
return viewController
}()
private lazy var sessionsViewController: SessionsViewController = {
// Load Storyboard
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
// Instantiate View Controller
var viewController = storyboard.instantiateViewController(withIdentifier: "SessionsViewController") as! SessionsViewController
// Add View Controller as Child View Controller
self.add(asChildViewController: viewController)
return viewController
}()
Show / Hide Child View-Controller:
private func add(asChildViewController viewController: UIViewController) {
// Add Child View Controller
addChildViewController(viewController)
// Add Child View as Subview
view.addSubview(viewController.view)
// Configure Child View
viewController.view.frame = view.bounds
viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// Notify Child View Controller
viewController.didMove(toParentViewController: self)
}
private func remove(asChildViewController viewController: UIViewController) {
// Notify Child View Controller
viewController.willMove(toParentViewController: nil)
// Remove Child View From Superview
viewController.view.removeFromSuperview()
// Notify Child View Controller
viewController.removeFromParentViewController()
}
Manage SegmentedControl tapEvent
private func updateView() {
if segmentedControl.selectedSegmentIndex == 0 {
remove(asChildViewController: sessionsViewController)
add(asChildViewController: summaryViewController)
} else {
remove(asChildViewController: summaryViewController)
add(asChildViewController: sessionsViewController)
}
}
Und natürlich können Sie in Ihren Kind-View-Controller-Klassen verwenden:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("Summary View Controller Will Appear")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("Summary View Controller Will Disappear")
}
Referenz: https://cocoacasts.com/managing-view-controllers-with -container-view-Controller /
Eine schnelle Swift Version:
@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {
if segmentControl.selectedSegmentIndex == 0 {
// do something
} else {
// do something else
}
}