iphone – 为什么UIScrollView总是滚动到底部?

我已经看到这个问题在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委托轻松修复).

我认为现在已经解决了这个问题,但如果有人理解为什么这个小细节搞砸了事情,我会很感激吗?

点赞