Настройка UIScrollView для прокрутки между 3-мя диспетчерами
Я пытаюсь настроить UIScrollView, чтобы я мог прокручивать между моими 3-мя контроллерами. Это мой код в AppDelegate.m:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.;
UIScrollView *sv = [[UIScrollView alloc] init];
BarsViewController *bvc = [[BarsViewController alloc] init]; // Create BarsViewController
StopwatchViewController *svc = [[StopwatchViewController alloc] init]; // Create StopwatchViewController
TimerViewController *tvc = [[TimerViewController alloc] init]; // Create TimerViewController
[sv addSubview:bvc.view];
[sv addSubview:svc.view];
[sv addSubview:tvc.view];
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; // Hide status bar
self.window.rootViewController = sv;
[self.window makeKeyAndVisible];
return YES;
}
Он дает ошибку в этой строке:
self.window.rootViewController = sv;
говоря: "Несовместимые типы указателей, назначающие" UIViewController * "из UIScrollView *".
Однако не существует такой вещи, как UIScrollViewController, поэтому я не знаю, что делать.
В принципе, я просто хочу, чтобы весь экран представлял собой вид прокрутки, который позволяет мне пронестись между моими 3-мя диспетчерами. Как мне это сделать?
Ответы
Ответ 1
UPD: июнь, 2015
Swift
Концепция остается той же, что описано ниже в разделе Objective-C. В синтаксисе мало изменений. Чтобы добавить childviewcontroller, используйте следующий фрагмент:
let aViewController = storyboard.instantiateViewControllerWithIdentifier("A") as! AViewController;
addChildViewController(aViewController);
scrollView!.addSubview(aViewController.view)
aViewController.didMoveToParentViewController(self)
Проверьте Образец кода Swift Github
Objective-C
Создайте свой собственный пользовательский контроллер представления контейнеров (я буду называть его объединеннымViewController), который будет удерживать ваши три контроллера в режиме прокрутки.
Наследовать, как вы всегда делаете UIViewController, а затем использовать общедоступный API addChildViewController в вашем новом объединенномViewController -viewDidLoad:
следующим образом:
[self addChildViewController:aViewController];
[self.scrollView addSubview:aViewController.view];
[aViewController didMoveToParentViewController:self];
Вот что делает код:
- Он вызывает контейнеры addChildViewController: метод для добавления дочернего элемента.
- Он обращается к свойству представления childs для извлечения представления и добавляет его в свою собственную иерархию представлений. Контейнер устанавливает размер и положение дочерних элементов перед добавлением вида; контейнеры всегда выбирают, где появляется дочерний контент.
- Он явно вызывает childs didMoveToParentViewController: метод, чтобы сигнализировать о завершении операции.
Выполняйте эту операцию с каждым из ваших диспетчеров просмотра. Впоследствии, установите combViewController как rootViewController.
если вам нужно дополнительное объяснение, не стесняйтесь спрашивать.
Ссылка: Разработка пользовательского контроллера контейнера
Здесь вы видите Objective-C пример кода Github
UPD: Спасибо @Oliver Atkinson за разъяснение, что метод addChildViewController:
также автоматически вызывает метод childs willMoveToParentViewController:
.
Результаты:
![введите описание изображения здесь]()
Ответ 2
Попробуйте выполнить это git repo, используя это репо, вы можете создать навигацию по представлению, такую как главные страницы Snapchat/Tinder.
https://github.com/goktugyil/EZSwipeController
Ответ 3
let obj1 = self.storyboard?.instantiateViewControllerWithIdentifier("DocumentsVC") as! DocumentsVC
let obj2 = self.storyboard?.instantiateViewControllerWithIdentifier("AppointmentsVC") as! AppointmentsVC
let obj3 = self.storyboard?.instantiateViewControllerWithIdentifier("DashboardVC") as! DashboardVC
self.containerScrollView.frame = obj2.view.frame
self.containerScrollView.addSubview(obj2.view)
obj2.willMoveToParentViewController(self)
self.addChildViewController(obj2)
self.containerScrollView.addSubview(obj1.view)
obj1.willMoveToParentViewController(self)
self.addChildViewController(obj1)
self.containerScrollView.addSubview(obj3.view)
obj3.willMoveToParentViewController(self)
self.addChildViewController(obj3)
self.containerScrollView.contentSize = CGSizeMake(3*UIScreen.mainScreen().bounds.width, 0)
obj1.view.frame.origin = CGPointMake(0, 0)
obj2.view.frame.origin = CGPointMake(UIScreen.mainScreen().bounds.width, 0)
obj3.view.frame.origin = CGPointMake(2*UIScreen.mainScreen().bounds.width, 0)
Ответ 4
Swift 3.0
На основе ответа Sachin - бит более общий - просто добавьте следующий элемент в массив views
var views = [ViewController(), ViewController2(), ViewController3(), ViewController4()]
func setupScrollView() {
scrollView.frame = views.first!.view.frame
scrollView.contentSize = CGSize(width: CGFloat(views.count) * width, height: 0)
_ = views.map({ addViewToScrollView($0) })
_ = views.map({ $0.view.frame.origin = CGPoint(x: CGFloat(views.index(of: $0)!) * width, y: 0) })
}
func addViewToScrollView(_ viewController: UIViewController) {
scrollView.addSubview(viewController.view)
views.willMove(toParentViewController: self)
addChildViewController(viewController)
}