4

我正在使用 PPRevealSideViewController。我里面有两个 ViewController。中间是 SideSwipeTableViewController 的子类,左边是 UIViewController 的子类,里面有一个 tableView。PPRevealSideViewController 和 SideSwipeTableViewController 的示例应用程序都支持 UITableView 的 scrollsToTop 属性,至少对于 PPRevealSideViewController 中间的 TableView 而言。但是当我同时使用这两个类时,scrollsToTop 停止工作。

我知道这是类似的问题,但我已经尝试了一切,我已经阅读了所有帖子,谷歌给了我关于这个问题的信息,但仍然无法解决它。所以我决定在这里问它,我什至不知道该怎么做才能使 scrollsToTop 工作。

self.window.rootViewController = self.revealSideViewController;

在哪里

- (PPRevealSideViewController *)revealSideViewController
{
    if (! _revealSideViewController) {
        _middleTableViewController = [MiddleTableViewController new];
        UINavigationController *middleNavController = [[UINavigationController alloc] initWithRootViewController:_middleTableViewController];
        _revealSideViewController = [[PPRevealSideViewController alloc] initWithRootViewController:middleNavController];
        _revealSideViewController.delegate = self;
    }

    return _revealSideViewController;
}

    - (void) preloadSidePanel
{
    AppDel.systemTableViewController = [SystemTableViewController new];
    AppDel.systemTableViewController.parent = self;
    [self.revealSideViewController preloadViewController:AppDel.systemTableViewController
                                                 forSide:isLeftHanded ? PPRevealSideDirectionLeft : PPRevealSideDirectionRight
                                              withOffset:_offset];
}

我在这个 systemTableViewController 中设置了这个:

_tableView = [[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain];
[self.view addSubview:_tableView];
 _tableView.scrollsToTop = NO;

但是,它没有帮助。

4

6 回答 6

8

仅当只有一个滚动视图(或滚动视图的任何子类。在您的情况下是表格视图)可见时,滚动到顶部才有效。

即使有多个可见的滚动视图,也只有一个应该设置此属性,然后它才会起作用。

此外,如果委托在 scrollViewShouldScrollToTop 中返回 NO,它将不起作用。

于 2013-01-24T15:41:57.207 回答
5

通过以下小扩展,UIView我解决了同样的问题。因为这些属性不仅存在于 上UITableView,还存在于UIScrollView和祖先(例如UICollectionView)上。

@implementation UIView (UIViewPimp)

- (void) disableScrollsToTopPropertyOnMeAndAllSubviews {
    if ([self isKindOfClass:[UIScrollView class]]) {
        ((UIScrollView *)self).scrollsToTop = NO;
    }
    for (UIView *subview in self.subviews) {
        [subview disableScrollsToTopPropertyOnMeAndAllSubviews];
    }
}
@end

我在 -Method 中调用这些新方法viewDidLoad,然后设置所需的UITableView显式属性。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.view  disableScrollsToTopPropertyOnMeAndAllSubviews];
    self.myTableView.scrollsToTop = YES;
}
于 2013-01-24T16:07:22.753 回答
1

如果您已经尝试了此处类似线程中提到的所有解决方案并且没有成功“scrollsToTop 修复”,您只需要子类化您的 App 的主 UIWindow。

@interface CustomWindow : UIWindow
@end

@implementation CustomWindow

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    if (point.y <= 20) {
        //do something to scroll appropriate UIScrollView to top
    }
    return YES;
}

在 AppDelegate 中使用它:

#import "CustomWindow.h"

@interface AppDelegate : UIResponder

@property (nonatomic,strong) CustomWindow *window;

@end

此解决方案允许将应用程序的任何 UIScrollView 设置为滚动到顶部,而忽略一般的 scrollsToTop 机制。

您现在需要的只是一个指向“活动” UIScrollView 的全局链接。

于 2013-03-11T18:22:52.083 回答
1

我希望这堂课能有所帮助。在我的应用程序中,我们有多个 webviews 和 scrollviews。这使这一切变得容易得多。:)

https://gist.github.com/hfossli/6776203

祝你好运!

于 2013-10-01T09:59:54.677 回答
0

我以为我被乔布斯的幽灵诅咒了,因为我尝试了 StackOverflow 上所有相关问题的所有可能解决方案,但我无法让我的滚动视图配合。

如果上述答案都不适合您 - 请确保您UIScrollView的表格视图单元格中没有子类或子类。scrollsToTop如果您的 tableView 尚未加载它的子视图,则循环浏览视图的子视图并禁用将无济于事。

对我有用的解决方案是在我的 UITableViewCell 子类上创建一个公共disableScrollsToTop方法,将scrollsToTop其滚动子视图的属性设置为NO.

我使用的代码(名称通用):

MYViewController.m

- (void)viewDidLoad
{
    // ... your initialization code
    [self setupScrollViewScrolling];
}

- (void)setupScrollViewScrolling
{
    self.horizontalScrollView.scrollsToTop = NO;
    self.tableView.scrollsToTop = YES;
}

// Note that I am using Xibs here, and your implementation for storyboards/xibless will be slightly different. 
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:
    MyTableViewCell *cell;
    static NSString *identifier = @"IdentifierForCell";
    if (!(cell = [self.tableView dequeueReusableCellWithIdentifier:identifier])) 
    {
        [[NSBundle mainBundle] loadNibNamed:@"MYTableViewCell" owner:self options:nil];
        cell = self.tableViewCell;
        self.tableViewCell = nil;
        // ... cell initialization code
        [cell disableScrollsToTop];
    }

    return cell;
}

当然,disableScrollsToTop只是

MYTableViewCell.m

- (void)disableScrollsToTop
{
    self.subviewThatScrolls.scrollsToTop = NO;
}

另一种方法(可以说更可扩展)可以做到这一点是包装UITableView's reloadData方法,并在重新加载后调用递归滚动视图检查方法,如上面列出的@Dominic_Sander,虽然我没有检查这个解决方案,因为我已经搞砸了这个问题.

于 2014-02-03T16:32:22.863 回答
0

我知道这是一个相当古老的,但希望这可以帮助。如果多个 UIScrollView 或其子类将其设置为 YES(默认值),则 scrollsToTop 不起作用的规则遵循这样的规则,健全性检查可能值得检查谁实际上在搞乱这种行为。下面的简单方法遍历视图的子视图并记录视图中所有 UIScrollView 的 scrollsToTop 值。最好在您的 viewDidAppear 方法中调用。

- (void)checkForScrollViewInView:(UIView *)view {
    for (UIView *subview in [view subviews]) {
        if ([subview isKindOfClass:[UIScrollView class]]) {
            NSLog(@"scrollsToTop enabled: %i in scroll view %@", ((UIScrollView *)subview).scrollsToTop, subview);
        }
        if (subview.subviews.count > 0) {
            [self checkForScrollViewInView:subview];
        }
    }
}

这确实只是一个调试代码。一旦找到每个 UIScrollView 子类的 scrollsToTop 值,只需确保只有一个设置为 YES。

于 2015-08-21T04:05:18.193 回答