我正在使用PPRevealSideViewController。我有两个ViewControllers。中间的一个是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;
然而,它没有帮助。
答案 0 :(得分:7)
滚动到顶部仅当只有一个滚动视图(或滚动视图的任何子类。在您的情况下是表视图)时才可见。
即使有多个滚动视图可见,也只有一个应该设置此属性,然后才能使用。
此外,如果委托在scrollViewShouldScrollToTop中返回NO,则它将无效。
答案 1 :(得分: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
我在viewDidLoad
- 方法中调用这些新方法,然后我将所需UITableView
的属性设置为显式。
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view disableScrollsToTopPropertyOnMeAndAllSubviews];
self.myTableView.scrollsToTop = YES;
}
答案 2 :(得分:1)
如果你已经尝试过类似线程中提到的所有解决方案 并且没有成功进行“scrollsToTop修复”你只需要继承你的应用程序的主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的全局链接。
答案 3 :(得分:1)
我希望这堂课可以提供帮助。在我的应用中,我们有多个网页浏览量和滚动视图。这使得一切变得容易。 :)
祝你好运!答案 4 :(得分:0)
我以为我被乔布斯的鬼魂诅咒,因为我在StackOverflow上尝试了所有相关问题的所有可能的解决方案,而且我无法让我的滚动视图合作。
如果上述答案都不适合您 - 请确保您的tableview单元格中没有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
方法,并在重新加载后调用一个递归的scrollview-checking方法,就像上面列出的@Dominic_Sander一样,虽然我没有检查过这个解决方案因为我已经弄乱了这个问题。
答案 5 :(得分:0)
我知道这是一个古老的,但希望这可以帮助。遵循如下规则:如果多个UIScrollView或其子类将其设置为YES(默认值),则scrollsToTop不起作用,则可能需要进行健全性检查以确定实际上是否正在弄乱这个行为。下面的简单方法循环遍历视图的子视图,并在视图中记录所有UIScrollView的scrollsToTop值。最好在viewDidAppear方法中调用。
Intent intent = new Intent(this, UpdateLocation.class);
startService(intent);
这只是一个调试代码。一旦找到每个UIScrollView子类的scrollsToTop值,只需确保只有一个设置为YES。