Программно изменить размер NSView - PullRequest
3 голосов
/ 17 июля 2011

У меня есть основной вид, который должен отображать несколько подпредставлений.Эти подпредставления расположены непосредственно над и под друг другом (по оси 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 пикселя.Это будет происходить до тех пор, пока фоновое представление не перестанет двигаться и основной вид наконец не будет содержать backgroundView.

Проблема в том, что mainView вообще не изменяет размеры.фоновое представление опускается, и я могу видеть его, пока оно не исчезнет из нижней части основного вида.mainView должен был изменить размер, но он не изменяется ни в каком направлении.Я пытался использовать setFrame и setBounds (с setNeedsDisplay и без него), но ничего не получалось.

Я просто ищу способ программно изменить размер основного вида.

1 Ответ

1 голос
/ 18 июля 2011

Мне кажется, я понял, в чем проблема.Я внимательно прочитал код.

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;
                                 }
    ];
}
...