只是试图围绕某些情况下的 ReactiveCocoa 方法。
我有一个段控制器换出子视图控制器的情况。我需要在这里完成几件事:
- 当移动到父控制器时,我必须更新 的
contentInset
,tableView
因为 iOS7 不使用自定义容器视图为我处理它 - 启动搜索时,我需要淡化导航栏,并更新
contentInset
动画 - 搜索结束时,我需要淡入
navigationBar
并重置contentInset
动画
这是以命令式样式完成此操作的当前代码:
- (void)didMoveToParentViewController:(UIViewController *)parent
{
[super didMoveToParentViewController:parent];
if (parent) {
CGFloat top = parent.topLayoutGuide.length;
CGFloat bottom = parent.bottomLayoutGuide.length;
if (self.tableView.contentInset.top != top) {
UIEdgeInsets newInsets = UIEdgeInsetsMake(top, 0, bottom, 0);
self.tableView.contentInset = newInsets;
self.tableView.scrollIndicatorInsets = newInsets;
}
}
}
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
[UIView animateWithDuration:.25 animations:^{
self.navigationController.navigationBar.alpha=0;
self.tableView.contentInset = UIEdgeInsetsMake([UIApplication sharedApplication].statusBarFrame.size.height, 0, 0, 0);
}];
return YES;
}
- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {
[UIView animateWithDuration:.25 animations:^{
self.navigationController.navigationBar.alpha=1;
CGFloat top = self.parentViewController.topLayoutGuide.length;
CGFloat bottom = self.parentViewController.bottomLayoutGuide.length;
if (self.tableView.contentInset.top != top) {
UIEdgeInsets newInsets = UIEdgeInsetsMake(top, 0, bottom, 0);
self.tableView.contentInset = newInsets;
self.tableView.scrollIndicatorInsets = newInsets;
}
}];
return YES;
}
可以对其进行重构以提取一些插入的内容,但在本练习中保持平整。
将在下面发布我的“非常不知道我在做什么”的方法作为答案。
部分回答
好的,所以我试图将信息流提取到相关信号中。
基本上我需要知道:
- 我现在在搜索吗
contentInset
在这种情况下,我的(顶部)的当前值
所以我的方法是
- 为我当前是否正在搜索创建一个 RACSubject
self.currentlySearchingSignal
。 - 把
top
my 的值tableView.contentInset
变成一个信号 sendNext:@(YES)
何时被调用(以及何时返回 YEScurrentlySearchingSignal
)searchBarShouldBeginEditing
sendNext:@(NO)
何时被调用(以及何时返回 YEScurrentlySearchingSignal
)searchBarShouldEndEditing
- ...
好吧,我被困住了。我知道我需要以某种方式组合/订阅这些,但试图以非状态方式考虑它。
- 当添加到父 VC 并且我
contentInset.top
的设置尚未正确时(topLayoutGuide
),我需要在没有动画的情况下设置它。 - 搜索并且我
contentInset.top
的设置不正确(状态栏框架)时,我需要执行动画(然后在我的动画完成之前不要再次更新) - 当不搜索并且我
contentInset.top
的设置不正确时(topLayoutGuide
)我需要执行动画(并且在动画完成之前不会再次更新)
试图解决它
这是我的开始。试图解决#1,但它还没有工作。
- (void)viewDidLoad
{
[super viewDidLoad];
@weakify(self);
self.currentlyInSearchMode = [RACSubject subject];
self.contentInsetTop = RACObserve(self.tableView, contentInset);
RACSignal *parentViewControllerSignal = RACObserve(self, parentViewController);
// setup the insets when added to parent and not correctly set yet
[[[RACSignal combineLatest:@[self.contentInsetTop, parentViewControllerSignal]] filter:^BOOL(RACTuple *value) {
return !((NSValue *)value.first).UIEdgeInsetsValue.top == ((UIViewController *)value.second).topLayoutGuide.length;
}]doNext:^(id x) {
@strongify(self);
CGFloat top = self.parentViewController.topLayoutGuide.length;
CGFloat bottom = self.parentViewController.bottomLayoutGuide.length;
if (self.tableView.contentInset.top != top) {
UIEdgeInsets newInsets = UIEdgeInsetsMake(top, 0, bottom, 0);
self.tableView.contentInset = newInsets;
self.tableView.scrollIndicatorInsets = newInsets;
}
}];
}