我已经看到这个问题在SO处被解决了几次,例如
Problem with UIScrollView Content Offset,但我仍然无法解决它.
我的iPhone应用程序基本上是带导航栏的标签栏控制器.我有一个以编程方式制作的tableview控制器和一个DetailViewController,当我点击tableview控制器中的一个单元格时,它会滑入.
DetailViewController在IB中生成,具有以下层次结构:
顶视图=> UIScrollView => UIView => UIImage和UITextField.
我的目标是能够滚动图像和文本字段,这很有效.问题是我的UIScrollView总是位于底部而不是顶部.
在推荐她之后,我将UIScrollView设置为与顶视图相同的尺寸,而是使UIView具有我的变量内容的最大高度(1500).
在ViewDidLoad中,我为UIScrollView设置了contentSize(因为这不能从IB访问):
- (void)viewDidLoad {
[scrollView setContentSize:CGSizeMake(320, 1500)];
[scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
NSLog(@"viewDidLoad: contentOffset y: %f",[scrollView contentOffset].y);
}
具体设置contentOffset,我希望我的scrollView总是最终在顶部.相反,它总是走到最底层.在我看来,在这种方法之后,有一些超出我控制范围的自动滚动.
我对contentOffset的回读看起来不错.在我看来,可能存在一些与时间相关的问题,因为无论动画是YES还是NO,滚动结果都可能会有所不同.
我发现一个丑陋的解决方法是使用这个委托方法:
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrView {
NSLog(@"Prog. scrolling ended");
[scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
}
这使我的滚动视图位于顶部,但是它会像溜溜球一样向下和向上反弹
另一个线索可能是,虽然在推动视图控制器之前设置了IBOutlet的实例变量,但第一次出现了空图像和文本字段:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (!detailViewController) {
detailViewController = [[DayDetailViewController alloc] init];
}
// Pass dictionary for the selected event to next controller
NSDictionary *dict = [eventsDay objectAtIndex:[indexPath row]];
// This method sets values for the image and textfield outlets
[detailViewController setEventDictionary:dict];
// Push it onto the top of the navigation controller´s stack.
[[self navigationController] pushViewController:detailViewController animated:NO];
}
如果我将动画设置为YES,并切换IBOutlet设置和pushViewController的顺序,我可以避免初始化时的空虚.为什么?
对这些问题的任何帮助都非常感谢,因为这真的让我疯狂!
最佳答案 受Ponchotg对编程方法的描述的启发,我决定跳过界面构建器.结果在某种程度上令人失望:同样的问题,滚动视图最终位于不可预测的位置(主要是在底部),持续存在.
但是,我注意到滚动偏移误差要小得多.我认为这与ContentOffset现在的动态(通常更小)值有关.经过一些盲目的实验后,我最终设定了
[textView setScrollEnabled:YES];
之前设置为NO,因为UITextView放在scrollview中,它应该处理滚动. (在我最初的问题中,我错误地说它是UITextField,这是错误的)
有了这个改变,我的问题就消失了,我根本无法进入模拟器中出现在底部的scrollview的情况! (在我的3G设备上,我看到很少出现轻微的偏移,但这可以通过前面描述的scrollViewDidEndScrollingAnimation委托轻松修复).
我认为现在已经解决了这个问题,但如果有人理解为什么这个小细节搞砸了事情,我会很感激吗?