我正在一个项目中,我有一个tableview和uitextfield。

当uitextfield获得/失去焦点时,我正在应用以下方法:

-(void)enableInset {

CGFloat offSet = -30.0f;
UIEdgeInsets inset = UIEdgeInsetsMake(placesMapView.frame.size.height - offSet, 0.0f, 0.0f, 00.f);

// Updating the tableView position.
placesTableView.contentInset = inset;
placesTableView.contentOffset = CGPointMake(0.0f, -(placesMapView.frame.size.height - offSet));
placesTableView.scrollIndicatorInsets = inset;
}


- (void)disableInset {
CGFloat offset = self.navigationController.navigationBar.frame.size.height  + [UIApplication sharedApplication].statusBarFrame.size.height;
UIEdgeInsets inset = UIEdgeInsetsMake(offset, 0.0f, 0.0f, 00.f);
placesTableView.contentInset = inset;
placesTableView.contentOffset = CGPointMake(0.0f, -offset);
placesTableView.scrollIndicatorInsets = inset;
}

在viewDidLayoutSubviews中调用enableInset方法。
然后,当我调用disableInset和enableInset时,无法再滚动UITableView。

我做错了什么?知道我在哪里可以找到答案吗?

编辑:
如果有帮助,我在github上添加了该项目:

https://github.com/Loadex/PlaceViewer

重现该错误:
滚动列表,点击搜索栏,点击取消,尝试再次滚动列表。

奇怪地单击筛选器按钮,当关闭UIActionSheet时,滚动再次起作用。

最佳答案

在寻找问题的解决方案时,我注意到placesTableView的contentInset的底部在不同状态下不断变化。在初始状态下可以看到地图,并且它的状态为0,并且tableView的行为符合预期。点击搜索字段后出现键盘时,它设置为216。我认为这是tableView和键盘之间的一些自动通信(通过Notifications或您在PlacesQueryTableViewController中所做的事情)。这很好,因为我们希望将底部插图设置为出现时的键盘顶部。现在,这里是越野车的一部分。当我点击“取消”按钮时,contentInset.bottom设置为-216。

我无法完全解释为什么会发生这种情况,但我怀疑这与插图的自动更改的实现方式有关。我怀疑它会执行类似于tableView.contentInset.bottom -= heightOfKeyboard的操作,并且可能会在动画完成而不是之前完成。问题的根源在于,您在动画制作完成之前更改了contentInset的底部,因此在自动更改发生之前。因此,一旦用户点击“取消”,就将底数设置为0。然后系统进入,并通过键盘高度减小它的高度,原来是216。这就是我认为正在发生的事情。

要解决此问题,请避免更改contentInset的底部,而只需更改顶部。 placesTableView.contentInset.top是readOnly,但是如果您像下面的代码那样进行操作,则可以解决此问题。我刚刚在每种方法中更改了两行代码,这些行与inset有关。希望你明白我的所作所为。

-(void)enableInset {
NSLog(@"Enabling insets");
// Setting the tableView to overlay the map view
CGFloat offSet = [placestableViewController tableView:placestableViewController.tableView heightForRowAtIndexPath:nil] - 30.0f;
UIEdgeInsets inset = placesTableView.contentInset; // UIEdgeInsetsMake(placesMapView.frame.size.height - offSet, 0.0f, 0.0f, 0.0f);
inset.top = placesMapView.frame.size.height - offSet;

// Updating the tableView position.
placesTableView.contentInset = inset;
placesTableView.contentOffset = CGPointMake(0.0f, -(placesMapView.frame.size.height - offSet));
placesTableView.scrollIndicatorInsets = inset;

placesMapView.hidden = NO;
[placestableViewController loadObjects];}


- (void)disableInset {
NSLog(@"Disable insets");
CGFloat offset = self.navigationController.navigationBar.frame.size.height  + [UIApplication sharedApplication].statusBarFrame.size.height;
UIEdgeInsets inset = placesTableView.contentInset;// UIEdgeInsetsMake(offset, 0.0f, 0.0f, 0.0f);
inset.top = offset;

placesTableView.contentInset = inset;
placesTableView.contentOffset = CGPointMake(0.0f, -offset);
placesTableView.scrollIndicatorInsets = inset;

// Hidding the map while in search
placesMapView.hidden = YES;}



顺便说一句,如果您想知道如何在不同状态下找到contentInset值,这非常简单。我所做的是将自己设置为- (void)viewDidLoad这样的placesTableView.delegate = self;中的placesTableView的委托。我还必须将@interface语句更改为@interface KrackMapViewController () <UITableViewDelegate>,以说我们符合UITableViewDelegate。现在,这就是窍门:UITableViewDelegate符合UIScrollViewDelegate。这意味着我们可以实现滚动视图委托的方法。一个特别有趣的是这个:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ NSLog(@"Did scroll with insetTop: %f, insetBottom: %f, contentOffset: %f", placesTableView.contentInset.top, placesTableView.contentInset.bottom, placesTableView.contentOffset.y);}
这使我们知道何时开始拖动tableView,然后在那里简单地NSLog列出不同的参数。

我希望这可以帮到你。让我知道这是否适合您。

10-08 05:55