我已经在SO处多次看过这个问题,例如Problem with UIScrollView Content Offset,但我仍然无法解决。
我的iphone应用程序基本上是带导航栏的标签栏控制器。我有一个以编程方式制作的tableview控制器和一个DetailViewController,当我点击tableview控制器中的一个单元格时,它会滑入。
DetailViewController在IB中制作,具有以下层次结构:
top view => UIScrollView => UIView => UIImage和UITextField。
我的目标是能够滚动图像和文本字段,这很有效。问题是我的UIScrollView总是位于底部而不是顶部。
在SO推荐她之后,我使我的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的回读看起来不错。在我看来,可能存在一些与时间相关的问题,因为无论动画是“是”还是“否”,滚动结果都可能会有所不同。
我找到的一个丑陋的解决方法是使用此委托方法:
- (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的顺序,我可以避免初始化时的空虚。为什么呢?
对这些事项的任何帮助都非常感谢,因为这真的让我疯狂!
答案 0 :(得分:2)
受Ponchotg对编程方法的描述的启发,我决定跳过界面构建器。结果在某种程度上令人失望:同样的问题,滚动视图最终位于不可预测的位置(主要是在底部),持续存在。
但是,我注意到滚动偏移误差要小得多。我认为这与ContentOffset现在的动态(通常更小)值有关。经过一些盲目的实验后,我最终设置了
[textView setScrollEnabled:YES];
之前设置为NO,因为UITextView放在scrollview中,它应该处理滚动。 (在我最初的问题中,我错误地说它是UITextField,这是错误的)
随着这个改变,我的问题消失了,我根本无法进入滚动视图出现在模拟器底部的情况! (在我的3G设备上,我看到很少出现轻微偏移,但可以使用之前描述的scrollViewDidEndScrollingAnimation委托轻松修复。)
我认为现在已经解决了这个问题,但如果有人理解为什么这个小细节弄乱了什么,我会很感激吗?
答案 1 :(得分:0)
OK!在我能给出正确答案之前我有一个问题。
为什么在UIView
内使用Scrollview
?
您始终只能将UIImageView
和UITextField
放在UIScrollView
内而不包含UIView
并根据文字的大小动态设置contentSize
。
给你一个例子我是怎么做的:
int contSize = 0;
imageView.frame = CGRectMake(10, 0, 300, 190);
imageView.image = [UIImage imageNamed:@"yourimage"];
contSize = 190 //or add extra space if you dont want your image and your text to be so close
[textField setScrollEnabled:NO];
textField.font = [UIFont systemFontOfSize:15];
textField.textColor = [UIColor grayColor];
textField.text = @"YOUR TEXT";
[textField setEditable:NO];
textField.frame = CGRectMake(5, contSize, 310, 34);
CGRect frameText = textField.frame;
frameText.size.height = textField.contentSize.height;
textField.frame = frameText;
contSize += (textField.contentSize.height);
[scrollView setScrollEnabled:YES];
[scrolView setContentSize:CGSizeMake(320, contSize)];
在上面的示例中,我首先创建一个int来跟踪我的视图的y
大小,然后将设置和图像提供给我的UIImageView
并将该数字添加到我的int
然后我给我的UITextField
提供设置和文字,然后我根据文字的长度和字体的大小计算文字的大小,然后将其添加到我的int
,最后分配我的contentSize
ScrollView
与int
匹配。
这样滚动视图的大小将始终与您的视图匹配,并且scrollView将始终位于顶部。
但如果你不想做所有这些,你可以一直只是:
[scrollView setContentOffset:CGPointMake(0, 0) animated:NO];
在您设置图片和文字的代码的末尾,以及NO
以避免弹跳。
希望这有帮助。