Я пытаюсь понять, как использовать различные состояния UISegmentedControl для переключения представлений, подобно тому, как Apple делает это в App Store при переключении между «Top Paid» и «Top Free».Как использовать UISegmentedControl для переключения представлений?
ответ
Самый простой способ состоит в том, чтобы иметь два вида, которые вы можете переключить на их видимость, чтобы указать, какой вид был выбран. Вот некоторые примеры код на том, как это может быть сделано, безусловно, не оптимизированным способом справиться с видом, но только, чтобы показать, как вы можете использовать UISegmentControl для переключения видимого вида:
- (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];
}
}
Вы можете, конечно, еще раз изменить код, чтобы скрыть/показать правильный вид.
Или, если его таблица, вы можете перезагрузить таблицу и в cellForRowAtIndex, заполнить таблицу из разных источников данных на основе выбранной опции сегмента.
Идея состоит в том, чтобы иметь представление, в котором сегментированные элементы управления имеют вид контейнера, который вы заполняете различными подзонами (добавьте в качестве подошвы для представления контейнера при переключении сегментов). У вас могут быть отдельные контроллеры представлений для этих подзонов, хотя вам нужно пересылать важные методы, такие как «viewWillAppear» и «viewWillDisappear», если они вам понадобятся (и им нужно будет сообщить, какой контроллер навигации они находятся).
Как правило, это работает очень хорошо, потому что вы можете выложить основной вид с контейнером в IB, а subviews заполнит все пространство, которое контейнер позволяет им (убедитесь, что ваши маски авторезистирования настроены правильно).
В моем случае мои взгляды довольно сложны, и я не могу просто изменить скрытое свойство разных представлений, потому что это займет слишком много памяти.
Я пробовал несколько решений, и не из них работали для меня или выполнялись беспорядочно, особенно с titleView на navBar, который не всегда показывал segmentedControl при нажатии/просмотре представлений.
Я нашел это сообщение в блоге о проблеме, которая объясняет, как это сделать надлежащим образом. Кажется, он помог инженерам Apple на WWDC'2010, чтобы придумать это решение.
http://redartisan.com/2010/6/27/uisegmented-control-view-switching-revisited
Решение в этой ссылке руки вниз лучшее решение я нашел в этом вопросе до сих пор. С немного регулировки он также работал хорошо с TabBar в нижнем
Благодарим вас за отличную находку. Определенно хорошее и элегантное решение для этой методологии. – Shiun
Я попытался заставить это работать правильно с панелью инструментов внизу без успеха, http://stackoverflow.com/questions/4748120/uisegmentedcontroller-to-switch-between-uiviewcontrollers-calendar-app-style Можете ли вы, пожалуйста, помочь мне ? – Erik
Есть ли способ иметь горизонтальную флип-анимацию между представлениями. Или это работает без анимации? – aneuryzm
Попробуйте этот код, это поможет вам переключаться между различными видами на меняющихся сегментах сегмента КОнтроля
Open Different Views on selecting different segments of UISegmentControl
это приятное решение! –
Попробуйте использовать SNFSegmentedViewController
, компонент с открытым исходным кодом, который выполняет именно то, что вы ищете, с настройкой, например UITabBarController
.
Присвоить .Н в
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];
}
}
Из ответа @Ronnie Лью, я создаю это:
//
// 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
Быстрый Swift Версия:
@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {
if segmentControl.selectedSegmentIndex == 0 {
// do something
} else {
// do something else
}
}
«определенно не оптимизированный способ справиться с видом ' - Зачем? –
@AdamWaite, потому что все представления должны храниться в памяти постоянно. Если ваши взгляды слишком сложны и/или содержат много других элементов, это повлияет на общую производительность. Эта часть кода также может быть реорганизована. – Stas
@Stas Вы правы, лучше разделить логику между несколькими контроллерами представлений, каждый из которых отвечает за свои действия и поведение –