1

我有一个在更大的视图中显示的视图,并且将始终保持在同一个位置。当提供一些用户输入时,第二个视图将出现在第一个视图下方。希望这是一个稍微平滑的过渡,所以我所做的是将第二个视图直接放在第一个视图的后面,然后启动一个计时器,检查视图是否使用它们的交叉点重叠,如果重叠,第二个视图会稍微降低,并再次检查重叠,直到视图不再重叠,并且计时器停止。

我希望过渡看起来像是第二个视图在第一个视图之后,现在正在从下面滑出。出于这个原因,我创建了一个“imaginaryRect”,它代表第二个视图(称为progressBarView)的确切位置如果它被完全显示,并在我向下移动imaginaryRect时使用它来检查交叉点。但我随后将交叉点下方的矩形(即 imaginaryRect 减去交叉点高度)设为实际显示第二个视图的矩形,该矩形称为 newFrame。

除了第二个视图的动画方式之外,这一切都完美无缺。我希望它看起来从顶部下方滑出,这意味着当视图开始出现在顶部下方时,用户将首先看到第二个视图的底部出现,因为它进一步向下滑动他' d 看到中间部分,最后顶部完成,它们都是可见的。实际发生的是,当视图开始出现时,它是自上而下出现的。首先出现顶部,然后出现中间,然后出现底部。它不会给人以从顶部滑出的印象。事实上,它看起来并没有移动,而是给人一种盖在它上面的东西正在滑落的印象。

从前天开始我就一直在这,我认为问题与框架的起源有关。但就是这样。

这是我正在使用的代码:

CGRect imaginaryRect = NSMakeRect(progressBarView.frame.origin.x,progressBarView.frame.origin.y, view.frame.size.width, view.frame.size.height);

CGRect rectIntersection = CGRectIntersection (view.frame,
                                              imaginaryRect);

//if view and imaginary progress bar view frame intersect, the view is lowered
//the second condition prevents one drop too many at the end
if (!CGRectIsNull(rectIntersection) && (rectIntersection.size.height!=0)) {
    CGRect offsetFrame = CGRectOffset (imaginaryRect, 0, -1);
    imaginaryRect = offsetFrame;

    //rectIntersection is recalculated after the offset, so it's height is subtracted for newFrame
    rectIntersection = CGRectIntersection(view.frame, imaginaryRect);

    //the rect below the area of intersection
    CGRect newFrame = CGRectMake(imaginaryRect.origin.x, imaginaryRect.origin.y, view.frame.size.width, view.frame.size.height-rectIntersection.size.height); 

    //move the PBview to the new, slightly lowered frame (this is the frame that's located below the front view, but subtracts the intersection)
    [progressBarView setFrame:newFrame];

谢谢您的帮助!

4

0 回答 0