我有一个在更大的视图中显示的视图,并且将始终保持在同一个位置。当提供一些用户输入时,第二个视图将出现在第一个视图下方。希望这是一个稍微平滑的过渡,所以我所做的是将第二个视图直接放在第一个视图的后面,然后启动一个计时器,检查视图是否使用它们的交叉点重叠,如果重叠,第二个视图会稍微降低,并再次检查重叠,直到视图不再重叠,并且计时器停止。
我希望过渡看起来像是第二个视图在第一个视图之后,现在正在从下面滑出。出于这个原因,我创建了一个“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];
谢谢您的帮助!