我有一个应该显示几个 subview 的主 View 。这些 subview 直接位于彼此的上方和下方(在 z 轴上),并将使用以下代码下拉(在 y 轴上)并向上移动:
if (!CGRectIsNull(rectIntersection)) {
CGRect newFrame = CGRectOffset (rectIntersection, 0, -2);
[backgroundView setFrame:newFrame];
} else{
[viewsUpdater invalidate];
viewsUpdater = nil;
}
rectIntersection 用于判断 View 何时完全向下移动并且不再位于前面(当它们不再重叠时 rectIntersection 为空),它一次向下移动 2 个像素,因为这都在重复计时器内。我希望我的主 View (包含这两个其他 View 的 View )向下调整大小,以便在背景中的 View 降低时扩展。这是我正在尝试的代码:
CGRect mainViewFrame = [mainView frame];
if (!CGRectContainsRect(mainViewFrame, backgroundFrame)) {
CGRect newMainViewFrame = CGRectMake(0,
0,
mainViewFrame.size.width,
(mainViewFrame.size.height + 2));
[mainView setFrame:newMainViewFrame];
}
这个想法是检查 mainView 是否包含这个背景 View 。当 backgroundView 被降低时,主 View 不再包含它,它(应该)向下扩展 2 个像素。这将发生直到背景 View 停止移动并且 mainView 最终包含 backgroundView。
问题是 mainView 根本没有调整大小。背景 View 正在降低,我可以看到它,直到它从 mainView 的底部消失。 mainView 应该调整大小,但它不会向任何方向改变。我尝试使用 setFrame 和 setBounds(有和没有 setNeedsDisplay)但没有任何效果。
我真的只是在寻找一种以编程方式更改主 View 大小的方法。
最佳答案
我想我明白了,问题是什么。我仔细阅读了代码。
if (!CGRectIsNull(rectIntersection)) {
// here you set the wrong frame
//CGRect newFrame = CGRectOffset (rectIntersection, 0, -2);
CGRect newFrame = CGRectOffset (backgroundView.frame, 0, -2);
[backgroundView setFrame:newFrame];
} else{
[viewsUpdater invalidate];
viewsUpdater = nil;
}
rectIntersection
实际上是两个 View 的交集,重叠,并且随着 backgroundView
向下移动,该矩形的高度减小。这样
mainView
只会调整一次大小。此外,这里有一个使用块语法的简单解决方案,为了动画您的 View ,此代码通常发生在您的自定义 View Controller 中。
// eventually a control action method, pass nil for direct call
-(void)performBackgroundViewAnimation:(id)sender {
// first, double the mainView's frame height
CGFrame newFrame = CGRectMake(mainView.frame.origin.x,
mainView.frame.origin.y,
mainView.frame.size.width,
mainView.frame.size.height*2);
// then get the backgroundView's destination rect
CGFrame newBVFrame = CGRectOffset(backgroundView.frame,
0,
-(backgroundView.frame.size.height));
// run the animation
[UIView animateWithDuration:1.0
animations:^{
mainView.frame = newFrame;
backgroundView.frame = newBVFrame;
}
];
}