2012-06-07 4 views
3

----window1----- ----window2----- Может ли кто-нибудь помочь мне в этом сценарии?Вид слайдера для iOS

* Существует кнопка, при нажатии которой слайды открывают UIView, а нажатая кнопка остается слева.

* Эта кнопка при повторном нажатии делает снимок UIView назад.

ответ

5

То, что вы описали, легко. Давайте назовем представление, которое сместится справа от ящика («drawerView»). Настройте вид ящика как дочерний вид основного вида вашего контроллера.

Сделайте этот «выдвижной ящик» видом на контейнер. Поместите все, что вы хотите в него. (Ваш текстовый вид, кнопки и т. Д.) Также поместите свою кнопку в это представление. Подключите эту кнопку к действию «slideDrawer» в вашем контроллере просмотра.

Затем убедитесь, что «подпункты клипов» являются ложными, и переместите кнопку с левого края ящика с помощью клавиши со стрелкой влево. В IB он исчезнет, ​​но не беспокойтесь. IB не соблюдает флаг «clipviews», как ваша работающая программа.

Создайте розетку для вашего drawerView и привяжите ее к вашему коду.

Как только у вас есть вид вашего выдвижного ящика, который выглядит именно так, как вы этого хотите, обратите внимание, что это координата x в «инспекторе размеров». Назовем это значение kVisibleX. Затем перетащите этот вид вправо, пока он не закроется. Кнопка не будет видна в IB, но будет видна только на краю окна во время выполнения. (как показано на первом изображении)

Обратите внимание на координату x в представлении ящика, когда он выключен. Назовем это значение kOffscreenX.

Добавить логическую переменную экземпляра «drawerIsShowing» в контроллер вашего вида.

Теперь написать метод IBAction slideDrawer:

- (IBAction) slideDrawer: (id) sender; 

В этом методе проверки drawerIsShowing, чтобы увидеть, если ящик в настоящее время виден. Если это так, сдвиньте его за пределы экрана. Если это не так, сдвиньте его на экран.

- (IBAction) slideDrawer: (id) sender; 
{ 
    CGFloat newX; 
    if (drawerIsShowing) 
    newX = kOffscreenX; 
    else 
    newX = kVisibleX; 
    [UIView animateWithDuration: .25 
    animations: 
    ^{ 
    CGRect drawerFrame = drawerView.frame; 
    drawerFrame.origin.x = newX; 
    drawerView.frame = drawerFrame; 
    } 
drawerIsShowing = !drawerIsShowing; 
} 
+0

wow ! красивый ответ. Большое спасибо Дункан! :) – Breakpoint

0

У меня было бы окно 1 be view1 и окно 2 be view2. Заполните каждое из этих представлений тем, что должно быть в представлении. Если вы хотите, чтобы одна и та же кнопка находилась в обоих режимах, поместите кнопку в каждое представление с тем же текстом. Для пользователя это одна и та же кнопка. Сделайте действие кнопки на вид 1 нажмите для просмотра 2. View 2 будет инициализироваться с помощью того, что вы сказали ему. Нажатие кнопки на вид 2 вытолкнет вид и вернет его для просмотра 1 ...

Надеюсь, что это поможет. Если вам нужна более конкретная помощь, предоставьте дополнительную информацию, и я буду в состоянии помочь вам в дальнейшем.

+0

sunrize920, я хочу, чтобы представление открывалось и закрывалось в том же окне (RootView). так что не помогло бы – Breakpoint

+0

Если вы удалили переходную анимацию, это было бы похоже на то, что это один и тот же вид, используя код что-то в строках [self presentModalViewController: vc animated: NO]; поэтому в основном сделать два представления одинаковыми, кроме добавления всего остального в view2. Без анимации при переходе это создавало бы видимость. Вот как бы я это сделал ... но если вы настаиваете на том, что uiview появляется в том же окне, это отличная история – sunrize920

+0

, спасибо за это восход солнца, но я считаю, что его можно сделать в том же виде – Breakpoint

0

Объявить BOOL, чтобы проверить, что вид скрыт или нет.

В .h

BOOL _isContentVisible; 

В.m

-(IBAction)showHideContentView:(id)sender 
{ 
    //BOOL isContentVisible= CGRectIntersectsRect(self.view.bounds, _sideContentScrollView.frame); 

    [UIView animateWithDuration:1.0f 
          delay:0 
         options:UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ 
         //hide if visible else show 
         if (_isContentVisible) { // Hide 
          _isContentVisible = NO; 
          [_sideContentView setFrame:CGRectMake(-320, 0, 360, 748)];// 40 is assumed to button size 
         } 
         else { // Show 
          _isContentVisible = YES; 
          [_sideContentView setFrame:CGRectMake(0, 0, 360, 748)]; 
         } 
        } 
        completion:^(BOOL finished) { 
         if (finished) { 

         } 
        }]; 
} 
Смежные вопросы