子视图控制器向下移动
Child View Controller shifts down
我有一个 TutorialsViewController,它有一个以编程方式添加的 PageViewController:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
// Create page view controller
self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"TutorialsPageViewController"];
self.pageViewController.dataSource = self;
TutorialsContentViewController *startingViewController = [self viewControllerAtIndex:0];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
[self.pageViewController didMoveToParentViewController:self];
}
然后我使用委托方法将 TutorialsContentViewController 添加到 PageViewController:
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
NSUInteger index = ((TutorialsContentViewController*) viewController).pageIndex;
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
return [self viewControllerAtIndex:index];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
NSUInteger index = ((TutorialsContentViewController*) viewController).pageIndex;
if (index == NSNotFound) {
return nil;
}
index++;
if (index == [self.tutorialsArray count]) {
return nil;
}
return [self viewControllerAtIndex:index];
}
- (TutorialsContentViewController *)viewControllerAtIndex:(NSUInteger)index {
if (([self.tutorialsArray count] == 0) || (index >= [self.tutorialsArray count])) {
return nil;
}
// Create a new view controller and pass suitable data.
TutorialsContentViewController *tutorialsContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"TutorialsContentViewController"];
tutorialsContentViewController.imageName = [self.tutorialsArray objectAtIndex:index];
tutorialsContentViewController.pageIndex = index;
return tutorialsContentViewController;
}
现在,当我 运行 在模拟器中执行此操作时,我可以看到一切正常,只是下一个子视图控制器似乎位于状态栏上方,并且在我滚动时向下移动。
我在父视图控制器中尝试了 self.automaticallyAdjustsScrollViewInsets = false,但子视图仍然向下移动。子视图控制器有一个 ImageView,它的前导、尾随、顶部、底部约束最初设置为 0(这会导致移位)。
当我将图像水平和垂直居中并为其指定固定的高度和宽度时,它工作正常。但我希望图像完全填满子视图控制器。
如何解决这个视图偏移问题?请帮忙
谢谢。
我似乎找到了解决方法,它与我设置的自动布局约束有关。我的子视图控制器包含一个完全填充它的图像视图。所以我给图像视图以下约束:
- 在容器中水平居中
- 在容器中垂直居中
- 等宽(容器视图)
- 等高(容器视图)
这将停止视图 shifting/flickering 问题。
我已经在这个答案的帮助下解决了这个问题:
iOS 8 UIPageViewController Applying Constraints After Transitions
通过在 PageViewController 的子项中将 top layout guide 上的所有约束替换为 view.
我有一个 TutorialsViewController,它有一个以编程方式添加的 PageViewController:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
// Create page view controller
self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"TutorialsPageViewController"];
self.pageViewController.dataSource = self;
TutorialsContentViewController *startingViewController = [self viewControllerAtIndex:0];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
[self.pageViewController didMoveToParentViewController:self];
}
然后我使用委托方法将 TutorialsContentViewController 添加到 PageViewController:
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
NSUInteger index = ((TutorialsContentViewController*) viewController).pageIndex;
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
return [self viewControllerAtIndex:index];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
NSUInteger index = ((TutorialsContentViewController*) viewController).pageIndex;
if (index == NSNotFound) {
return nil;
}
index++;
if (index == [self.tutorialsArray count]) {
return nil;
}
return [self viewControllerAtIndex:index];
}
- (TutorialsContentViewController *)viewControllerAtIndex:(NSUInteger)index {
if (([self.tutorialsArray count] == 0) || (index >= [self.tutorialsArray count])) {
return nil;
}
// Create a new view controller and pass suitable data.
TutorialsContentViewController *tutorialsContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"TutorialsContentViewController"];
tutorialsContentViewController.imageName = [self.tutorialsArray objectAtIndex:index];
tutorialsContentViewController.pageIndex = index;
return tutorialsContentViewController;
}
现在,当我 运行 在模拟器中执行此操作时,我可以看到一切正常,只是下一个子视图控制器似乎位于状态栏上方,并且在我滚动时向下移动。
我在父视图控制器中尝试了 self.automaticallyAdjustsScrollViewInsets = false,但子视图仍然向下移动。子视图控制器有一个 ImageView,它的前导、尾随、顶部、底部约束最初设置为 0(这会导致移位)。
当我将图像水平和垂直居中并为其指定固定的高度和宽度时,它工作正常。但我希望图像完全填满子视图控制器。
如何解决这个视图偏移问题?请帮忙
谢谢。
我似乎找到了解决方法,它与我设置的自动布局约束有关。我的子视图控制器包含一个完全填充它的图像视图。所以我给图像视图以下约束:
- 在容器中水平居中
- 在容器中垂直居中
- 等宽(容器视图)
- 等高(容器视图)
这将停止视图 shifting/flickering 问题。
我已经在这个答案的帮助下解决了这个问题: iOS 8 UIPageViewController Applying Constraints After Transitions 通过在 PageViewController 的子项中将 top layout guide 上的所有约束替换为 view.