iOS UITableViewCell内容在第一次滚动时移动
您可以在下面的gif中看到,UITableView单元格的第一个滚动条上的内容移动了一点点。你几乎看不到,边距变宽了1像素。我以前从未遇到过这种情况。看起来在第一个卷轴之前有一些布局问题,它会在事实发生后自行解决。XCode中没有警告,这些自定义单元格非常简单,没有布局代码覆盖 我不知道从哪里开始,我如何抓住这个小故障 更新。我现在已经实施了一个明显的解决方法:iOS UITableViewCell内容在第一次滚动时移动,ios,uitableview,autolayout,Ios,Uitableview,Autolayout,您可以在下面的gif中看到,UITableView单元格的第一个滚动条上的内容移动了一点点。你几乎看不到,边距变宽了1像素。我以前从未遇到过这种情况。看起来在第一个卷轴之前有一些布局问题,它会在事实发生后自行解决。XCode中没有警告,这些自定义单元格非常简单,没有布局代码覆盖 我不知道从哪里开始,我如何抓住这个小故障 更新。我现在已经实施了一个明显的解决方法: - (void)scrollTableToFixGlitch { [self.tableView setContentOffs
- (void)scrollTableToFixGlitch {
[self.tableView setContentOffset:CGPointMake(0, 1)];
[self.tableView setContentOffset:CGPointMake(0, -1)];
}
- (void)viewDidLoad {
[super viewDidLoad];
[self scrollTableToFixGlitch];
}
仍在调查这个问题。我尝试了通用UITableViewCells,没有任何更改。这似乎是视图控制器的根视图或表视图布局的问题,而不是表单元格的问题
更新2。
我排除了所有的动画的问题,问题在于在不同的地区。这个小故障很容易在一个简化的项目上重现。我的选项卡栏控制器基于自定义序列和一些其他附加项。以下是如何重现故障。在导航控制器中嵌入初始VC的位置设置项目。下一个控制器MHCustomTabBarController或子类被推送到导航堆栈。选项卡栏中第一个可见的VC是通用表视图控制器。就这样。只有在导航堆栈中按下选项卡栏控制器时,才会出现此故障
以下是一些我认为与选项卡栏控制器有关的代码:
-(void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (self.childViewControllers.count < 1) {
[self performSegueWithIdentifier:@"viewController1" sender:[self.buttons objectAtIndex:0]];
}
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if (![segue isKindOfClass:[MHTabBarSegue class]]) {
[super prepareForSegue:segue sender:sender];
return;
}
self.oldViewController = self.destinationViewController;
//if view controller isn't already contained in the viewControllers-Dictionary
if (![self.viewControllersByIdentifier objectForKey:segue.identifier]) {
[self.viewControllersByIdentifier setObject:segue.destinationViewController forKey:segue.identifier];
}
[self.buttons setValue:@NO forKeyPath:@"selected"];
[sender setSelected:YES];
self.selectedIndex = [self.buttons indexOfObject:sender];
self.destinationIdentifier = segue.identifier;
self.destinationViewController = [self.viewControllersByIdentifier objectForKey:self.destinationIdentifier];
[[NSNotificationCenter defaultCenter] postNotificationName:MHCustomTabBarControllerViewControllerChangedNotification object:nil];
}
更新3
在我的研究中,我发现-viewWillAppear在第一次出现子控制器时不会被调用。但它在以后的所有时间都会被调用
可能scrollView
contentSize
比scrollView的边框宽(在本例中为宽度),导致双向滚动。
您可以尝试将contentSize
宽度减小到scrollView的宽度,然后
self.scrollView.alwaysBounceHorizontal = NO;
如果这不起作用,解决方案是在UIScrollView
委托的帮助下以编程方式禁用水平滚动
self.scrollView.delegate = self;
[self.scrollView setShowsHorizontalScrollIndicator:NO];
//for the below UIScrollView delegate function to work do the necessary step in the bottom of my answer.
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.x > 0)
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
}
在.h文件中,您应该通过添加UIScrollViewDelegate
@interface ViewController : UIViewController <UIScrollViewDelegate>
@界面ViewController:UIViewController
您很可能非常了解此学员部分,但对于其他学员,可能需要:D原始答案 啊,我终于找到了这种行为的根源。我几乎可以肯定这是由于一些准备方法没有被正确调用。正如我在更新3中所说的,我发现当我的TabBarController被推到导航面板时,TableViewController中没有调用-viewWillAspect方法。我已经找到了大量关于这件事的报道,这显然是一个众所周知的问题 我添加了一个简单的修复程序,只是为了检查我的自定义序列是否正确:
//added this line
[destinationViewController viewWillAppear:YES];
[tabBarViewController.container addSubview:destinationViewController.view];
它就像一个符咒,没有闪烁!现在我必须为这个调用找到一个更合适的位置,因为对这样的方法的显式调用会破坏很多东西
最好的地方可能是在-navigationController:willShowViewController:animated:UINavigationControllerDelegate的方法中
不管怎样,问题解决了。希望它能帮助有同样问题的人
更新事实上,我并不是完全正确的-当视图被推送到导航堆栈时,它将在我的选项卡栏控制器上调用。它没有被转换为TableViewController。所以不需要访问NavigationControllerDelegate。对自定义序列进行简单的修复就足够了。谢谢您的建议,但我的示例中没有水平滚动。表视图可以正确滚动。内容视图的布局有问题。当我在gif中看到
UISegmentedControl
时,我认为TableView在UIScrolViewah中,我明白了。实际上,它不是一个UISegmentedControl,它有点像我从头制作的选项卡栏控制器。因为我刚刚用通用UITableViewCell测试了这个案例,但问题仍然存在,我相信问题源于这个选项卡控制器和它的自定义动画。我现在正在调查,我明白。自定义选项卡栏实现看起来不错。祝你好运找到故障。如果您发布一些代码,我将尝试调试。
//added this line
[destinationViewController viewWillAppear:YES];
[tabBarViewController.container addSubview:destinationViewController.view];