Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS UITableViewCell内容在第一次滚动时移动_Ios_Uitableview_Autolayout - Fatal编程技术网

iOS UITableViewCell内容在第一次滚动时移动

iOS UITableViewCell内容在第一次滚动时移动,ios,uitableview,autolayout,Ios,Uitableview,Autolayout,您可以在下面的gif中看到,UITableView单元格的第一个滚动条上的内容移动了一点点。你几乎看不到,边距变宽了1像素。我以前从未遇到过这种情况。看起来在第一个卷轴之前有一些布局问题,它会在事实发生后自行解决。XCode中没有警告,这些自定义单元格非常简单,没有布局代码覆盖 我不知道从哪里开始,我如何抓住这个小故障 更新。我现在已经实施了一个明显的解决方法: - (void)scrollTableToFixGlitch { [self.tableView setContentOffs

您可以在下面的gif中看到,UITableView单元格的第一个滚动条上的内容移动了一点点。你几乎看不到,边距变宽了1像素。我以前从未遇到过这种情况。看起来在第一个卷轴之前有一些布局问题,它会在事实发生后自行解决。XCode中没有警告,这些自定义单元格非常简单,没有布局代码覆盖

我不知道从哪里开始,我如何抓住这个小故障

更新。我现在已经实施了一个明显的解决方法:

- (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];