Iphone ScrollStopTop不使用UIViewController容器
使用SDK 6.1、Xcode 4.6.1,我制作了一个新的项目主控详细信息iOS应用程序ARC,无情节提要 然后在Iphone ScrollStopTop不使用UIViewController容器,iphone,ios,uiviewcontroller,Iphone,Ios,Uiviewcontroller,使用SDK 6.1、Xcode 4.6.1,我制作了一个新的项目主控详细信息iOS应用程序ARC,无情节提要 然后在DetailViewController中,在viewDidLoad中添加两个UITableViews(包含在UIViewControllers中),并确保第二个像这样隐藏: - (void)viewDidLoad { [super viewDidLoad]; UIViewController *lViewController1 = [[UIViewControl
DetailViewController
中,在viewDidLoad
中添加两个UITableView
s(包含在UIViewController
s中),并确保第二个像这样隐藏:
- (void)viewDidLoad
{
[super viewDidLoad];
UIViewController *lViewController1 = [[UIViewController alloc] init];
UITableView *lTableView1 = [[UITableView alloc] initWithFrame: self.view.frame];
lTableView1.scrollsToTop = YES;
[lViewController1.view addSubview: lTableView1];
lTableView1.dataSource = self;
[self.view addSubview: lViewController1.view];
[self addChildViewController: lViewController1];
UIViewController *lViewController2 = [[UIViewController alloc] init];
UITableView *lTableView2 = [[UITableView alloc] initWithFrame: self.view.frame];
lTableView2.scrollsToTop = YES;
[lViewController2.view addSubview: lTableView2];
lTableView2.dataSource = self;
[self.view addSubview: lViewController2.view];
[self addChildViewController: lViewController2];
// now hide the view in view controller 2
lViewController2.view.hidden = YES;
}
(我确保DetailViewController
是一个返回100行UITableViewCell
s的数据源,其中textlab.text
设置为@“hello”
)
第二个视图控制器的存在使得滚动STOTOP
(点击状态栏)不再工作。如果我不使用UIViewController
containment,只需添加两个UITableView
s并将第二个设置为隐藏,scrollsToTop
就可以工作了
我做错了什么?
ScrollStop
仅在单个可见视图上工作。从:
此手势适用于单个可见的滚动视图;如果有多个滚动视图(例如,日期选择器)设置了此属性,或者如果委托在scrollViewShouldScrollToTop:
中返回NO
,UIScrollView
将忽略该请求。滚动视图滚动到内容视图的顶部后,它会向代理发送一条scrollViewDidScrollToTop:
消息
您可以尝试手动调用每个表(或滚动)视图上的[tableView setContentOffset:CGPointZero animated:YES]
。为此,在UIScrollViewDelegate
协议中实现scrollViewShouldScrollToTop:
方法:
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
[lTableView1 setContentOffset:CGPointZero animated:YES];
[lTableView2 setContentOffset:CGPointZero animated:YES];
return NO;
}
您只能使用属性为每个ViewController设置1个ScrollView。scrollsToTop=YES。
如果将2 scrollview.scrollsTopTop设置为YES,它将停止工作
ie: your sample project (DetailViewController.m) update following lines,
line48: lTableView1.scrollsToTop = YES;
line56: lTableView2.scrollsToTop = NO;
然后,scrollsToTop可以正常工作。如果有多个scrollview要同时设置ScrollStop,请继续挖掘。祝你好运 在测试了几个选项和各种点击并尝试之后,我最终确定了一个最终解决方案,即
设置:
滚动视图的(在您的情况下是表格视图
),效果很好。不过,你必须为动画付出额外的努力
CGRect frame = scrollView.frame;
frame.origin.x = 0;
frame.origin.y = 0;
[scrollView setBounds:frame];
顺便说一下,在您的情况下,请尝试将YES
返回到
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;
虽然没有定义,但假设是。我已经使用过这个,现在它可以正常工作了
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIViewController *lViewController1 = [[UIViewController alloc] init];
UITableView *lTableView1 = [[UITableView alloc] initWithFrame: self.view.frame];
lTableView1.scrollsToTop = YES;
[lViewController1.view addSubview: lTableView1];
lTableView1.dataSource = self;
[self.view addSubview: lViewController1.view];
[self addChildViewController: lViewController1];
lTableView1.tag=1;
UIViewController *lViewController2 = [[UIViewController alloc] init];
UITableView *lTableView2 = [[UITableView alloc] initWithFrame: self.view.frame];
lTableView2.scrollsToTop = NO;
[lViewController2.view addSubview: lTableView2];
lTableView2.dataSource = self;
[self.view addSubview: lViewController2.view];
[self addChildViewController: lViewController2];
lTableView2.tag=2;
// now hide the view in view controller 2
lViewController2.view.hidden = YES;
}
- (NSUInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSUInteger)section {
return 50;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString * const kCellIdentifier = @"MyCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier];
}
cell.textLabel.text = [NSString stringWithFormat:@"hello %d %d",indexPath.row, tableView.tag];
return cell;
}
我目前正在试验你的项目。什么时候
lViewController2.view.hidden = YES;
被替换为
lTableView2.hidden = YES;
然后滚动工作,即使控制器包含
我试图在控制器的视图和表之间插入一个视图,然后隐藏这个视图,但是表没有滚动
我试图通过试验shouldAutomaticallyForwardAppearanceMethods
来隐藏控制器,但表没有滚动
结果:根据我的实验,在视图层次结构中只能看到一个滚动视图,并且父视图的hidden
属性未检出<代码>隐藏
必须在所有其他滚动视图上设置为否
,而不是它们的父视图。只有一个可见的滚动视图(请参见viewDidLoad中代码的最后一行)。在我的dropbox上放置一个可下载的存档:我假设在滚动到顶部事件之前,您将隐藏
设置为否
。无论如何,在模拟器和iPhone4上,在Xcode 4.6.1+iOS SDK 6.1上尝试了您的测试项目,并且两种方法都有效。您查看了详细视图了吗?主视图有效,但局部视图无效。下载项目:我猜苹果的代码在搜索带有“scrollsToTop”的视图时,不会检查视图是否隐藏。是否有理由使用“隐藏”而不是将子视图删除/添加到superview?它会检查。如果您不使用视图控制器包含,它可以工作。除非其中一个表视图被隐藏,否则它们可以将两个ScrollStop都设置为YES。除非您使用视图控制器包含,否则它将不再工作,这是我正在寻求答案的问题。您可以将其设置为隐藏:、从SuperView中移除或设置为CrollStotop:否,只要只设置了1个scrollView来响应ScrollsToTop:scrolling事件。下载示例代码,您就会发现不使用视图控制器包含(将define view\u CONTROLLERS in DetailViewController设置为0),拥有两个ScrollsToTop表视图没有问题。我不太确定是否理解您的答案。你是在建议ScrollStop的自定义实现吗?好的,但在我的项目中,这不是一个选项,也不是问题的答案。谢谢:)我问这个问题是因为市场上现有项目中存在一个bug,我们希望最大限度地减少对现有版本的更改。这就是我迄今为止忽略的问题:父视图的隐藏属性未检出。通过使用视图控制器包含,我在视图层次结构中添加了一个额外的级别,并更改了父视图而不是表视图的隐藏属性。我想苹果可以更好地记录这一点(如果它不是一个bug的话)。很好的一个——我使用了“隐藏的滚动视图,甚至不包含自己的手势识别器,它只是用来滚动其他内容”的技术,而这个问题是因为我隐藏了它。那么你只是在更改一个ScrollStop属性?这不是我想要的答案(同时苏丹的答案也被接受了)。