Подтвердить что ты не робот

Настройка 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-мя диспетчерами. Как мне это сделать?

4b9b3361

Ответ 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)
}