拖动相关视图时动态更改视图约束

时间:2014-10-27 21:48:35

标签: ios cocoa-touch uitableview uiviewcontroller nslayoutconstraint

我有两个相互重叠的视图。向上拖动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高度。

这里发生了什么?我们非常欢迎您的想法!

0 个答案:

没有答案