ContainerView это не правильно расположен - PullRequest
4 голосов
/ 17 января 2020

У меня есть установка, в которой я использую контроллер навигации, который включает в себя представление контейнера, в которое встроен контроллер представления страницы и его содержимое.

enter image description here Слева: UINavigationController, мой класс MTNewsViewController, наследующий от UIViewController и реализующий UIPageViewControllerDataSource (содержащий представление контейнера), UIPageViewController, мой класс MTNewsContentController, который наследуется от UIViewController. с пользовательским текстом и изображением. Но, проблема заключается в положении и размере представления контейнера . Он расположен не так, как предлагает раскадровка изображения, а в левом верхнем углу и другого размера. Вот так:

enter image description here

Я не уверен насчет того, чего не хватает.

Вот некоторые фрагменты кода. Есть ли у вас какие-либо предложения о том, что может быть не так? Я подозреваю, что мне нужно где-то установить размер.

MTNewViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // Create page view controller
    self.pageViewController.dataSource = self;

    [self loadNews];

    MTNewsContentController *startingViewController = [self viewControllerAtIndex:0];
    NSArray *viewControllers = @[startingViewController];
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

    [self addChildViewController:_pageViewController];
    [self.view addSubview:_pageViewController.view];
    [self.pageViewController didMoveToParentViewController:self];

    UIPageControl* pageControlDots = [UIPageControl appearanceWhenContainedInInstancesOfClasses:@[[MTNewsViewController class]]];
    pageControlDots.pageIndicatorTintColor = [UIColor lightGrayColor];
    pageControlDots.currentPageIndicatorTintColor = [UIColor blackColor];
    pageControlDots.hidesForSinglePage = YES;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    self.pageViewController = segue.destinationViewController;
    self.pageViewController.view.frame = segue.destinationViewController.view.frame;
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    NSUInteger index = [self getCurrentPageIndex:viewController];

    if ((index == 0) || (index == NSNotFound)) {
        return nil;
    }

    return [self viewControllerAtIndex:--index];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    NSUInteger index = [self getCurrentPageIndex:viewController];

    if (index == NSNotFound) {
        return nil;
    }

    if (++index == news.size()) {
        return nil;
    }

    return [self viewControllerAtIndex:index];
}

- (MTNewsContentController *)viewControllerAtIndex:(NSUInteger)index
{
    if ((news.size() == 0) || (index >= news.size())) {
        return nil;
    }

    // Create a new view controller and pass suitable data.
    MTNewsContentController *newPage = [self.storyboard instantiateViewControllerWithIdentifier:@"NewsPageContentController"];
    newPage.imagePath = [NSString stringWithCString:news[index].kImagePath.c_str() encoding:NSUTF8StringEncoding];
    newPage.textDescription = [NSString stringWithCString:news[index].kDescription.c_str() encoding:NSUTF8StringEncoding];
    newPage.pageIndex = index;

    return newPage;
}

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
    return news.size();
}

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{
    return 0;
}

- (NSUInteger)getCurrentPageIndex:(UIViewController *)viewController {
    return ((MTNewsContentController*) viewController).pageIndex;
}

MTNewsContentController

Ничего особенного здесь , Просто добавьте изображение и текст программно.

Ограничения ContainerView

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Не похоже, что вы устанавливаете некоторые ограничения автоматического размещения в любом месте. Откройте раскадровки -> выберите вид контейнера -> выберите вариант макета, выделенный на изображении enter image description here -> установите ограничения сверху, слева, справа и снизу в соответствии с вашими требованиями и нажмите кнопку добавления / сохранения. Это должно быть все, что вам нужно.

0 голосов
/ 20 января 2020

Я думаю, что, скорее всего, вы не наложили ограничения макета на свой контейнерный вид. В результате он может не отображаться во время выполнения так же, как в вашей раскадровке. Этот вид контейнера должен быть ограничен как по горизонтали, так и по вертикали. Вы можете выбрать вид контейнера, а затем перетащить его в родительский вид, удерживая клавишу Ctrl. Затем появится меню ограничений. Удерживая клавишу Shift, выберите четыре верхние опции, которые ведут и закрывают пространство в безопасную зону, а верхнее и нижнее пространство - в безопасную зону. Обязательно поставьте галочку рядом с каждым из них. А затем попробуйте снова запустить приложение.

...