2011-07-17 79 views
3

我有一個應該顯示幾個子視圖的主視圖。那些子視圖是直接的上方和下方彼此(在z軸),並且將下拉(在y軸)和向上移動使用此代碼:以編程方式調整NSView

​​

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),但沒有任何工作。

我真的只是在尋找一種方法來以編程方式更改主視圖的大小。

+1

爲什麼不調整的'mainView',之前或向下移動'backgroundView'後? 「mainView」的框架大小與「backgroundView」的大小相同嗎?嘗試記錄幀大小。 – 2011-07-17 09:52:34

+0

我不知道如何調整視圖的大小。我嘗試製作一個新的矩形,除了略高一點的高度。設置我的視圖框架/邊界到那個新矩形,但它沒有改變大小。我不知道如何記錄幀大小。 – Elbimio

+1

嘗試'NSLog(@「view frame:%.2f,%.2f」,view.frame.size.width,view.frame.size.height);' – 2011-07-17 20:16:36

回答

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; 
           } 
    ]; 
} 
相關問題