Sto cercando di capire come utilizzare i diversi stati di un UISegmentedControl per cambiare visualizzazione, in modo simile a come Apple fa nell'App Store quando si cambia tra 'Top pagato' e 'Top Free'.Come utilizzare un UISegmentedControl per cambiare visualizzazione?
risposta
L'approccio più semplice consiste nell'avere due viste che è possibile alternare la loro visibilità per indicare quale vista è stata selezionata. Ecco alcuni esempi di codice su come si può fare, sicuramente non un modo ottimizzato per gestire i punti di vista, ma solo per dimostrare come è possibile utilizzare il UISegmentControl per attivare o disattivare la visualizzazione visibile:
- (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];
}
}
Ovviamente è possibile ridimensionare ulteriormente il codice per nascondere/mostrare la vista corretta.
Oppure se è una tabella, è possibile ricaricare la tabella e in cellForRowAtIndex, popolare la tabella da diverse origini dati in base all'opzione di segmento selezionata.
Un'idea è di avere la vista con i controlli segmentati con una vista contenitore che si riempie con le diverse visualizzazioni secondarie (aggiungere come unica sottoview della vista contenitore quando i segmenti sono attivati). Puoi anche avere controller di vista separati per tali sottoview, anche se devi inoltrare metodi importanti come "viewWillAppear" e "viewWillDisappear" se ne hai bisogno (e ti verrà detto che controller di navigazione sono sotto).
genere che funziona abbastanza bene, perché è possibile tracciare la visualizzazione principale con il contenitore in IB, e le subviews riempirà tutto lo spazio che il contenitore permette loro di avere (assicurarsi che le maschere AutoResize sono impostati correttamente).
Nel mio caso le mie visualizzazioni sono piuttosto complesse e non posso semplicemente modificare la proprietà nascosta di viste diverse perché richiederebbe troppa memoria.
Ho provato diverse soluzioni e non ha funzionato per me, o eseguito in modo irregolare, specialmente con il titoloView della barra di navigazione non mostra sempre il segmentedControl quando si spinge/popping le viste.
Ho trovato questo post sul blog che spiega come farlo nel modo corretto. Sembra che abbia avuto l'aiuto degli ingegneri Apple al WWDC'2010 per trovare questa soluzione.
http://redartisan.com/2010/6/27/uisegmented-control-view-switching-revisited
La soluzione in questo link è senza dubbio la soluzione migliore che ho trovato sulla questione finora. Con un po 'di regolazione anche funzionato benissimo con un TabBar in fondo
Grazie per l'ottima scoperta. Sicuramente una soluzione bella ed elegante per questa metodologia. – Shiun
Ho provato a farlo funzionare correttamente con la barra degli strumenti in basso senza successo, http://stackoverflow.com/questions/4748120/uisegmentedcontroller-to-switch-between-uiviewcontrollers-calendar-app-style Puoi aiutarmi per favore ? – Erik
C'è un modo per avere un'animazione di flip orizzontale tra le viste. Oppure funziona solo senza animazione? – aneuryzm
provare questo codice, questa volontà l'aiuta a passare da una vista su come cambiare i segmenti del segmento di controllo
Open Different Views on selecting different segments of UISegmentControl
questa è una bella soluzione! –
Provare a utilizzare SNFSegmentedViewController
, un componente open source che fa esattamente quello che stai cercando con una configurazione come UITabBarController
.
Assegna .H in
UISegmentedControl *lblSegChange;
- (IBAction)segValChange:(UISegmentedControl *) sender
Declare.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];
}
}
Dalla risposta di @Ronnie Liew, creo questo:
//
// 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
Un rapido Versione Swift:
@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {
if segmentControl.selectedSegmentIndex == 0 {
// do something
} else {
// do something else
}
}
- 1. Come cambiare colore del carattere di UISegmentedControl
- 2. Scorri per cambiare visualizzazione
- 3. Come disabilitare un UISegmentedControl?
- 4. Come interrompere l'annuncio di VoiceOver per UISegmentedControl?
- 5. Come personalizzare UISegmentedControl in iOS?
- 6. UISegmentedControl Best Practice
- 7. UISegmentedControl tintColor
- 8. Come cambiare Wcf per utilizzare un serializzatore diverso?
- 9. Come impostare UISegmentedControl Tinta per singolo segmento
- 10. UISegmentedControl nell'app Mail
- 11. Utilizzo di UISegmentedControl come pulsante
- 12. Come utilizzare un UISplitViewController come controller di visualizzazione modale?
- 13. UISegmentedControl con numero distintivo
- 14. UISegmentedControl immagine di sfondo personalizzata
- 15. Posso mostrare un oggetto UISegmentedControl in verticale?
- 16. UISegmentedControl senza angolo arrotondato?
- 17. cornice di UISegmentedControl
- 18. Personalizzazione dei colori di un UISegmentedControl
- 19. UISegmentedControl delegate/Touch Events
- 20. UISegmentedControl e aggiunta di obiettivi
- 21. Cambiare nome del parametro in un LambdaExpression solo per la visualizzazione
- 22. UISegmentedControl setTitleTextAttributes non funziona
- 23. Come posso impostare lo stato predefinito di un UISegmentedControl?
- 24. UISegmentedControl, UIToolbar e UINavigationItem
- 25. come cambiare il nome di visualizzazione dell'applicazione PhoneGap
- 26. Come utilizzare 2 UIPickerView in un controller di visualizzazione?
- 27. come cambiare la lingua di visualizzazione in eclissi
- 28. Come cambiare la lingua di visualizzazione di javac in inglese?
- 29. Come impostare l'immagine su UISegmentedControl in iphone?
- 30. Come utilizzare layout.Grid in visualizzazione XML SAPUI5?
'sicuramente non un modo ottimizzato per gestire i punti di vista ' - perché? –
@AdamWaite perché tutte le viste devono essere memorizzate in modo permanente nella memoria. Se le tue visualizzazioni sono troppo complicate e/o contengono molti altri elementi, ciò influenzerà le prestazioni generali. Quel pezzo di codice potrebbe essere anche rifattorizzato. – Stas
@Stas Hai ragione, è meglio dividere la logica tra più controller di visualizzazione, ciascuno responsabile delle proprie azioni e comportamenti –