Как создать разделенное представление, в котором верхняя панель в XCode является разборной? - PullRequest
3 голосов
/ 07 апреля 2011

У меня есть UINavigationController, который содержит несколько UIViewController.Я хотел бы создать общую «панель», которая отображается в верхней части каждого представления.Кроме того, я бы хотел, чтобы эта панель расширялась и сворачивалась, перекрывая вид при нажатии.

View1

-Top Panel (складная)

-Основная панель

View2

-Верхняя панель (складная)

-Основная панель

Это будет похоже на то, как панель инструментов или панель навигации скрываются / отображаются дляконтроллер камеры, но это будет пользовательский вид.Это приложение для iPhone.

Будучи новым разработчиком XCode, я был бы признателен за понимание того, как к этому следует подходить с архитектурной точки зрения.

1 Ответ

1 голос
/ 12 апреля 2011

Создайте подкласс UIViewController, скажем, с именем PanelStyleUIViewController, который будет суперклассом для всех представлений, которые будут иметь панель.Суперкласс реализует логику контроллера панели, а также расширение и сжатие представления, которое всегда происходит над логикой обычного представления дочернего контроллера.

Это будет скромно сложный проект для нового разработчика iOS / какао, потому что:

  • Возможно, в конечном итоге вам придется написать большую часть кода вида складной панели программным способом.Его можно спроектировать в конструкторе интерфейсов, используя более продвинутые методы, но основное использование IB - это проектирование одного контроллера представления за раз.Вам необходимо спроектировать частичный родительский контроллер представления, который затем наследуется нескольким различным.
  • Необходимо убедиться, что складываемое представление всегда выше (по z-index) содержимого обычного представленияклассы контроллера представления более низкого уровня.Это, вероятно, что-то, что можно решить, выполнив вызов метода takeSubviewToFront в представлении панели, скажем, с помощью метода viewDidAppear.
  • Вы «ушли с дороги» от того, как ведут себя стандартные приложения iPhone.Всякий раз, когда вы делаете это, вы делаете головные боли для себя и можете оказаться в тупике.Я бы порекомендовал оставаться на месте в течение некоторого времени, пока вы не будете достаточно уверены в цели C, прикосновении какао и т. Д.редактор переполнения, который должен дать вам представление о том, что я имею в виду для этого дизайна суперкласса:
    // PanelStyleUIViewController.h
    @interface PanelStyleUIViewController : UIViewController {
        UIView *panelView;
    }
    @property (nonatomic, retain) UIView *panelView;
    
    // PanelStyleUIViewController.m
    
    @implementation PanelStyleUIViewController
    
    @synthesize panelView;
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // setup geometry, contents, etc of panelView programmatically...
        self.panelView = [[[UIView alloc] init] autorelease];
        panelView.frame = CGRectMake(0,0,320,200);
        // set resizing mask appropriately for landscape support
        panelView.autoresizingMask = UIViewAutoresizingMaskFlexibleWidth | UIViewAutoresizingMaskFlexibleBottomMargin;
        // put a button on the panel view so it can be tapped to slide down
        UIButton *slidePanelButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        slidePanelButton.frame = CGRectMake(0,160,320,40);
        [slidePanelButton addTarget:self action:@selector(slidePanel) forControlEvents:UIControlEventTouchUpInside];
        [panelView addSubview:slidePanelButton];
        // set panelView with a transform offset to slide it up under the top of the screen
        panelView.transform = CGAffineTransformMakeTranslation(0, -160);
        // add panelView to regular view controller's view
        [self.view addSubview:panelView];
    }
    
    - (void)viewWillAppear {
        // make sure the panel shows up on top, z-index wise, since subclasses might have created views that overlap it.
        [self.view bringSubviewToFront:panelView];
    }
    
    - (void)slidePanel {
        // remove the panel transform in an animated fashion (slide down).
        // TODO: some button or action needs to slide the panel back up...
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.3];
        [panelView setTransform:CGAffineTransformMakeTranslation(0,0)];
        [UIView commitAnimations];
    }
    
    - (void)viewDidUnload {
        [super viewDidUnload];
        // always make sure you clean up progammatically-retained views here
        self.panelView = nil;
    }
    
    - (void)dealloc {
        // and here too
        self.panelView = nil;
        [super dealloc];
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...