Как добавить представление за другим представлением в iOS - PullRequest
44 голосов
/ 20 марта 2012

Я хочу добавить представление под аналогом панели вкладок в iOS, а затем показать его с анимацией, идущей из-за него. Но когда я использую свой код, представление, которое должно появиться из-за моей панели вкладок, некоторое время перекрывает мою панель вкладок.

tab bar and a view that shows when tab bar button pressed

Это мой код:

- (void)handlePressedButton {
if (pressedButton.selected) {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    CGAffineTransform transform1 = CGAffineTransformMakeTranslation(-196.0, 0.0);
    CGAffineTransform transform2 = CGAffineTransformMakeTranslation(0.0, 0.0);
    [leftPanelView setTransform:transform1];
    [movedView setTransform:transform2];
    [UIView commitAnimations];
    pressedButton.selected = NO;
}
else {
    pressedButton.selected = YES;
    if (leftPanelView) {
        [leftPanelView removeFromSuperview];
        leftPanelView = nil;
    }
    CGRect viewFrame = CGRectMake(-196, 0, 236, 748);
    leftPanelView = [[UIView alloc] initWithFrame:viewFrame];
    leftPanelView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"left-nav-content.png"]];

    // Code to populate leftPanelView according to what button is pressed.
    [self populateLeftPanelView];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    [self.view addSubview:leftPanelView];
    CGAffineTransform transform1 = CGAffineTransformMakeTranslation(236.0, 0.0);
    CGAffineTransform transform2 = CGAffineTransformMakeTranslation(112.0, 0.0);
    [leftPanelView setTransform:transform1];
    [movedView setTransform:transform2];
    [UIView commitAnimations];
}

}

Здесь leftPanelView - это представление, которое должно находиться под панелью вкладок. Перемещенный вид - это другой вид, который находится справа от левой панели (не обращайте на это внимания)

Ответы [ 7 ]

118 голосов
/ 20 марта 2012

Помимо addSubview, есть и другие методы, на которые можно положиться, чтобы добавить свое представление:

– insertSubview:aboveSubview:
– insertSubview:belowSubview:
– insertSubview:atIndex:

Используя эти методы, вы можете управлять индексом (фактически z-index или порядком слоя) представления.

52 голосов
/ 20 марта 2012

try sendSubviewToBack

[self.view sendSubviewToBack:leftPanelView];
9 голосов
/ 04 июля 2018

Swift 5

Вставка представление ниже другое представление в иерархии представлений:

view.insertSubview(subview1, belowSubview: subview2)

Вставка представление выше другое представление в иерархии представлений:

view.insertSubview(subview1, aboveSubview: subview2)

Вставка подпредставление по указанному индексу :

view.insertSubview(subview, at: index)

Переместить указанное подпредставление так, чтобы оно оказалось позади его братьев и сестер:

subview1.sendSubviewToBack(subview2)

Переместить указанное подпредставлениетак что он появляется поверх его братьев и сестер:

subview1.bringSubviewToFront(subview2)

Обмен подпредставления по указанным индексам :

view.exchangeSubview(at: index1, withSubviewAt: index2)
5 голосов
/ 20 марта 2012

О, я сам нашел решение.Я добавил после этого:

[UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5];
    [self.view addSubview:leftPanelView];

эта строка:

[self.view sendSubviewToBack:leftPanelView];
2 голосов
/ 14 ноября 2018

In Swift 5

self.view.sendSubviewToBack(leftPanelView)
0 голосов
/ 09 июня 2019

Objective-C

Вставить представление ниже другое представление в иерархии представлений:

- (void)insertSubview:(UIView *)subview1 
         belowSubview:(UIView *)subview2;

Вставка представление над другое представление в иерархии представлений:

- (void)insertSubview:(UIView *)subview1 
         aboveSubview:(UIView *)subview2;

Вставить подпредставление по указанному индексу :

- (void)insertSubview:(UIView *)view 
              atIndex:(NSInteger)index;

Переместить указанное подпредставление, чтобы оно оказалось позади его братьев и сестер:

- (void)sendSubviewToBack:(UIView *)view;

Переместить указанное подпредставление так, чтобы оно отображалось поверх его родных элементов:

- (void)bringSubviewToFront:(UIView *)view;

Обмен подпредставления по указанным индексам :

- (void)exchangeSubviewAtIndex:(NSInteger)index1 
            withSubviewAtIndex:(NSInteger)index2;
0 голосов
/ 14 мая 2019

Еще одна хорошая идея - дать метке Subviews .

Swift

mainView.addSubView(topView)
mainView.addSubView(bottomView)

topView.tag = 2

mainView.insertSubview(bottomView, belowSubview: mainView.viewWithTag(2))
...