我有两个相互重叠的视图。向上拖动viewA
时,viewB
变为可见。将viewA
一直拖到顶部时,这两个视图排成一行,以便viewA.bottom == viewB.top
。这是通过使用自动布局/约束来实现的,并且在4英寸屏幕上工作得非常好,但是对齐会突破4,7“和5,5”屏幕。
我需要在运行时调整viewB
上的高度或顶部空间约束,使其与viewA.bottom
值匹配。
到目前为止,我一直在玩KVO来监听viewB.frame
更改(臭)并直接操纵scrollview框架,但没有运气。以下代码片段是最有希望的,但我不能让它在“实时”工作。 recognizer.view
是infoCenterView。
UIView *infoCenterView; // viewA
UIScrollView *scrollView; // viewB
UITableView *tableView; // child of viewB
NSLayoutConstraint *scrollViewTopSpaceConstraint;
- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
CGPoint center = recognizer.view.center;
CGPoint translation = [recognizer translationInView:self.view];
if (recognizer.state == UIGestureRecognizerStateChanged) {
[recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
center.y += translation.y;
// Don't allow translation outside screen frame
if (center.y < self.yMin || center.y > self.yMax)
return;
recognizer.view.center = center; // (1)
self.scrollViewTopSpaceConstraint.constant += translation.y; // (2)
}
else if (recognizer.state == UIGestureRecognizerStateEnded) {
if (center.y > self.yMin && center.y < ((self.yMax + self.yMin) / 2)) {
center.y = self.yMin; // Move to top
}
else if (center.y >= ((self.yMax + self.yMin) / 2) && center.y < self.yMax) {
center.y = self.yMax; // Move to bottom
}
[UIView animateWithDuration:0.2
delay:0
options:UIViewAnimationOptionTransitionNone
animations:^{
recognizer.view.center = center;
}
completion:^(BOOL finished){
// (3)
self.scrollViewTopSpaceConstraint.constant = 200;
}];
}
//(1)和(2)
如果同时执行这两行,则只能在“实时”中调整tableView高度,并且infoCenterView不会移动。但是,如果注释掉(2),则可以移动infoCenterView。
//(3)
如果(2)被注释掉并且(3)被执行,并且如果将infoCenterView拖到屏幕顶部,它将无意中掉到底部并正确设置tableView高度。
这里发生了什么?我们非常欢迎您的想法!