我正在开展一个项目,我有一个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被解除时,滚动再次运行。
答案 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];
}
视图再次向后滚动。 对此有任何解释都是受欢迎的。