在contentInset之后UITableView不滚动

时间:2014-05-19 06:42:41

标签: ios objective-c uitableview ios7

我正在开展一个项目,我有一个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被解除时,滚动再次运行。

2 个答案:

答案 0 :(得分:2)

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

我无法解释为什么会发生这种情况,但我怀疑这与插件的自动更改是如何实现有关。我怀疑它有点像tableView.contentInset.bottom -= heightOfKeyboard,这可能发生在动画结束时,而不是之前。您的问题的根源是您在动画完成之前更改了contentInset的底部,因此在发生自动更改之前。因此,一旦用户点击取消,您就将底部设置为0。然后系统进入并通过键盘的高度减小它,结果是216.这就是我认为正在发生的事情。

要解决此问题,请避免更改contentInset的底部,只需更改顶部。 placesTableView.contentInset.top只是读取,但是如果你在下面的代码中这样做,你可以解决这个问题。我刚刚在每个方法中更改了两行代码,这些代码与插件有关。希望你看到我做了什么。

-(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的委托,如placesTableView.delegate = self;。我还必须将@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出不同的参数。

我希望这很有帮助。如果这对您有用,请告诉我。

答案 1 :(得分:1)

经过一些研究后,我注意到了这一点:

释放键盘时的TableView不会滚动,因为tableview似乎认为它显示在整个屏幕上。我试图在tableview中添加更多数据,我们可以看到视图滚动了一点。

我认为发生的事情是,当键盘被隐藏时,会进行一些自动调用并弄乱我在enableInset方法中设置的内容。这是我的工作解决方案:

我注册了hideKeyboard事件:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardDidHide:)
                                             name:UIKeyboardDidHideNotification
                                           object:nil];

在回调中我调用了enableInset:

- (void)keyboardDidHide: (NSNotification *) notif{
    [self enableInset];
}

视图再次向后滚动。 对此有任何解释都是受欢迎的。