我有一个应该显示多个子视图的主视图。这些子视图直接在彼此的上方和下方(在z轴上)并且将下拉(在y轴上)并使用此代码向上移动:
if (!CGRectIsNull(rectIntersection)) {
CGRect newFrame = CGRectOffset (rectIntersection, 0, -2);
[backgroundView setFrame:newFrame];
} else{
[viewsUpdater invalidate];
viewsUpdater = nil;
}
rectIntersection用于判断视图何时完全向下移动并且不再位于前一个视图之后(当它们不再重叠时,rectIntersection为null),它一次向下移动2个像素,因为这一切都在重复内部计时器。我希望我的主视图(包含这两个其他视图的视图)向下调整大小,以便在背景中的视图降低时扩展。这是我正在尝试的代码:
CGRect mainViewFrame = [mainView frame];
if (!CGRectContainsRect(mainViewFrame, backgroundFrame)) {
CGRect newMainViewFrame = CGRectMake(0,
0,
mainViewFrame.size.width,
(mainViewFrame.size.height + 2));
[mainView setFrame:newMainViewFrame];
}
我们的想法是检查mainView是否包含此背景视图。当backgroundView降低时,主视图不再包含它,它应该向下扩展2个像素。这将发生在背景视图停止移动并且mainView最终包含backgroundView之前。
问题是mainView根本没有调整大小。正在降低背景视图,我可以看到它直到它从mainView的底部消失。 mainView应该已调整大小,但它不会向任何方向改变。我尝试使用setFrame和setBounds(有和没有setNeedsDisplay)但没有任何效果。
我真的只是想找到一种以编程方式更改主视图大小的方法。
答案 0 :(得分:1)
我想我明白了,问题是什么。我仔细阅读了代码。
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
实际上是两个视图的交集,重叠,当backgroundView
向下移动时,矩形的高度会减小。
这样,mainView
只会调整一次。
除此之外,这是一个使用块语法的简单解决方案,为您的视图设置动画,此代码通常会在您的自定义视图控制器中进行。
// 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;
}
];
}