点击状态栏时,UIPageViewController可防止我的表格视图滚动到顶部

 sasame 发布于 2023-02-04 18:13

我在发布这个问题之前搜索过,但找不到任何东西.

我有一个很大的问题.我有一个滚动类型UIPageViewController作为我的应用程序的基础,有3个视图控制器.

其中一个视图控制器(listTableView)具有表视图和搜索显示控制器.

问题是,当像状态表视图一样点击状态栏时,我无法滚动到表格视图的顶部.我相信UIPageViewController正在干扰这个,但我不知道如何修复它,但我知道我需要让我的应用程序不会感到破碎.

我感谢任何提供的帮助.

我知道有人会要求代码,即使在这种情况下它是无关紧要的,但这里是为了创建UIPageViewController:

#import "MainViewController.h"

@interface MainViewController ()

@property (nonatomic, strong) UIPageViewController *pageViewController;
@property (nonatomic, strong) NSArray *contentViewControllers;

@end

@implementation MainViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageView"];
    self.pageViewController.dataSource = self;

    UIViewController *settings = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings"];

    UIViewController *listTableView = [self.storyboard instantiateViewControllerWithIdentifier:@"List"];

    UIViewController *first = [self.storyboard instantiateViewControllerWithIdentifier:@"First"];

    self.contentViewControllers = [NSArray arrayWithObjects:settings,listTableView,first,nil];

    [self.pageViewController setViewControllers:@[first] direction:UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];

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

    self.view.backgroundColor = [UIColor colorWithRed:(248.0/255.0) green:(248.0/255.0) blue:(248.0/255.0) alpha:1.0];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
  viewControllerBeforeViewController:(UIViewController *)viewController {

    NSUInteger index = [self.contentViewControllers indexOfObject:viewController];

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

    return self.contentViewControllers[index - 1];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
   viewControllerAfterViewController:(UIViewController *)viewController {

    NSUInteger index = [self.contentViewControllers indexOfObject:viewController];

    if (index >= self.contentViewControllers.count - 1) {
        return nil;
    }

    return self.contentViewControllers[index + 1];
}

Leo Natan--r.. 30

聊天后,我们发现了一些有趣的东西 页面视图控制器将其他视图控制器的视图保留在视图层次结构中,因此它们还捕获scrollsToTop行为并进行干扰.这意味着您需要为消失的视图控制器scrollsToTopviewWillDisappear:的每个可滚动视图禁用(并再次启用viewWillAppear:).


原始调查

快速简便的方法:scrollview是视图的唯一子UIPageViewController视图:

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

在调试器中检查:

(lldb) po [self.pageViewController.view recursiveDescription]
<_UIPageViewControllerContentView: 0x8d7c390; frame = (0 0; 320 480); clipsToBounds = YES; opaque = NO; autoresize = W+H; layer = >
   | <_UIQueuingScrollView: 0xa912800; frame = (0 0; 320 480); clipsToBounds = YES; gestureRecognizers = ; layer = ; contentOffset: {320, 0}>
   |    | >
   |    | >
   |    | >

您可以使用多种方法来访问该滚动视图.最简单的是迭代 self.pageViewController.view.subviews并找到作为子类的子类UIScrollView.由于它是唯一的子视图,因此循环将在一次迭代后结束.

这个解决方案最佳吗?不.它容易出错吗?理论上,当然.它有可能改变吗?不太可能,因为视图层次结构非常合乎逻辑.它至少可以为您提供快速修复,而不必由于Apple的小疏忽(允许用户访问scrollview)来处理更改整个应用程序结构.

您应该通过https://bugreport.apple.com向Apple打开功能请求.

1 个回答
  • 聊天后,我们发现了一些有趣的东西 页面视图控制器将其他视图控制器的视图保留在视图层次结构中,因此它们还捕获scrollsToTop行为并进行干扰.这意味着您需要为消失的视图控制器scrollsToTopviewWillDisappear:的每个可滚动视图禁用(并再次启用viewWillAppear:).


    原始调查

    快速简便的方法:scrollview是视图的唯一子UIPageViewController视图:

    self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
    

    在调试器中检查:

    (lldb) po [self.pageViewController.view recursiveDescription]
    <_UIPageViewControllerContentView: 0x8d7c390; frame = (0 0; 320 480); clipsToBounds = YES; opaque = NO; autoresize = W+H; layer = <CALayer: 0x8d7c4a0>>
       | <_UIQueuingScrollView: 0xa912800; frame = (0 0; 320 480); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x8d7cc90>; layer = <CALayer: 0x8d7c7e0>; contentOffset: {320, 0}>
       |    | <UIView: 0x8d7da00; frame = (0 0; 320 480); layer = <CALayer: 0x8d7da60>>
       |    | <UIView: 0x8d7dab0; frame = (320 0; 320 480); layer = <CALayer: 0x8d7db10>>
       |    | <UIView: 0x8d7db40; frame = (640 0; 320 480); layer = <CALayer: 0x8d7dba0>>
    

    您可以使用多种方法来访问该滚动视图.最简单的是迭代 self.pageViewController.view.subviews并找到作为子类的子类UIScrollView.由于它是唯一的子视图,因此循环将在一次迭代后结束.

    这个解决方案最佳吗?不.它容易出错吗?理论上,当然.它有可能改变吗?不太可能,因为视图层次结构非常合乎逻辑.它至少可以为您提供快速修复,而不必由于Apple的小疏忽(允许用户访问scrollview)来处理更改整个应用程序结构.

    您应该通过https://bugreport.apple.com向Apple打开功能请求.

    2023-02-04 18:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有