DHSidebarViewController: an open source sidebar navigation controller for iOS

July 24, 2013

We recently released a new iOS app for organizing workout timers called Extimer. The app design called for a menu that the user could access by sliding the main view away or tapping a button. This type of navigation is becoming increasingly common because it allows an app to present a set of menu options in a place that is quick to get to when you need it but stays out of the way the rest of the time.

iOS Sliding Sidebar Menu Requirements

Our requirements for the slider were somewhat specific. It had to:

  • Support any type of view in the root or sidebar (e.g. not just a TableView)
  • Support opening and closing with both a tap and a swipe gesture
  • Be extremely responsive, even on older devices and when the views contained animation or transparency
  • Follow Apple's guidelines for container views

I looked around for an existing open source component which would do all of those things but was ultimately unsatisfied with the available options. Typically the deal breaker involved some kind of restriction on the content of the views or an inability to include our own custom view controllers. We already had much of the functionality for the menu and main view controllers built, we just wanted to display them in a sliding sidebar. It would have been very messy to repurpose one of the existing components to do this. So, I spent some time creating a new reusable sidebar container which would meet all of the requirements above.

Handling iOS Container Views Gracefully

There are two primary components:

The first is DHSidebarViewController which is responsible for managing the view controller hierarchy and handling user interaction. It provides methods for setting and changing the root view controller (on top) and the sidebar view controller (on the bottom). It also manages the gesture recognizers which respond to the user's swiping and tapping actions.

The second component is DHSidebarLayoutView. This is the primary view of DHSidebarViewController. The root and sidebar views are added as children of this view. DHSidebarLayoutView's primary job is to position its child views based on the current offset value. The offset represents how far to the right the root view should be moved. The sidebar view will also be moved slightly creating a parallax effect.

With these two components it is possible to compose any two custom view controllers into a sliding sidebar experience. Rather than keep this to ourselves, we decided to share it with anyone who might find it useful. You can download DHSidebarViewController on GitHub. It is licensed under the MIT Open Source license.

Contributions are welcome and we'd love to know what you think of this.

Tech Tip: If you use view.layer.shadowOffset to create a drop shadow for a view you will almost certainly experience a soul-crushing performance hit if you try to move that view around or animate on top of it. The secret is to supply a shadow path based on the view's bounds like so:

// Add left side drop shadow newRootViewController.view.layer.shadowOffset = CGSizeMake(-3, 0); newRootViewController.view.layer.shadowOpacity = 0.3f; UIBezierPath *path = [UIBezierPath bezierPathWithRect:newRootViewController.view.bounds]; newRootViewController.view.layer.shadowPath = path.CGPath;

Of course, this is mentioned in the documentation for shadowPath but I missed it on my first read-through so hopefully this will help someone else. ;)


Comments

Hey Jay,

Your component looks very good - but I have one question..
Why does every side bar open source component requires the Side bar to be the application's root view controller?

I have a login flow that supposed to be finished before I can go to the side bar container VC.

Thanks,
Guy

Hi Guy, think of it like the sidebar controller is taking the place of a tab bar controller. When it's being used it will always sit at the top of the view controller hierarchy. Also, due to how the controller is responsible for actually laying our multiple contained views, it isn't necessarily sensible for it to be contained within other views itself.

That is likely why you see that as a common pattern.

That being said, there is nothing stopping you from making your login view controller the root view controller at app launch and then later replacing it with a sidebar view controller.

Great! Thanks for that Jay!
I'll try it on your component and hope it'll go smooth.

Just want to report back that you pretty much solved all my problems with the Sidebar!
Still has more testing to do but so far so good...

and didn't to assign key window's rootVC at all... :)

Thanks a lot!!

Aumenta libido e desejo sexual feminino. http://rhino.im/61qd

Então, emagrecer velozmente é um objetivo relativo. http://bechloo.com/user/profile/21852

Como Utilizar E Contra Indicações Da Maca Peruana

Medicamento natural para impotência sexual masculina os populares afrodisíacos
naturais para tratar a disfunção erétil. Percebe-se na história
da cidadania, que desde a antiguidade as diferenças na ordem das sociedades entre senhores e também escravos, nobres e servos,
patrão e empregado, ricos e pobres, geram um contexto de antagonismo conflituoso a classes onde se busca superar as injustiças e as desigualdades sociais.

È constituído de um ambulatório especializado em Saúde Mental
e uma item assistencial de cuidado secundária,
CAPS III, destinada ao atendimento multiprofissional (farmacêutico, médicos clínicos, psiquiatras,
psicólogos, assistentes sociais, sociólogos, enfermeiros, terapeutas ocupacionais, entre outros profissionais de nível médio
e técnico) dos pacientes neuróticos graves e psicóticos, que permite tanto um sistema de
referência na atenção com os gastos hospitalares quanto determinado incipiente deslocamento do financiamento no saúde
intelectual.

Se desejo é por estética, fazer uso da maca peruana inclusive
é benéfico: ela ajuda a tratar problemas relacionados à casca,
como no tratamento da acne e também manchas ,
além de diminuir a sensibilidade à temperaturas
baixas de outra maneira muito altas.

Quando voltam à escola muitos deles com idade vanguarda, desmotivado, e com um vasta lista de fracassos aluno,
com isso projeto tem a finalidade de desenvolver múltiplas habilidades
nesses alunos, que não foram adquiridas entre
elas a principal é a leitura e a escrita,ou
seja a alfabetização.

Essa planta é muito conhecida por causa de realizar
com que lípido sexual venha aumentar, a catuaba acaba ajudando e muito
as pessoas que desejam ter as suas vidas sexuais restabelecidas novamente, e por causa disso que muitas indivíduos acabam optando
por tomar dese chá.

Seus sintomas são humor polarizado para stress, falta de interesse a realizar atividades, perde personalidade de sentir
prazer em qualquer atividade que seja capaz
realizar, fumaçada a ter um guardar diferente sobre si mesmo
e mundo, se acha triste e infeliz.

E tudo começa no principio da relação porque ela quer tiver cara a fim de sempre e infelizmente entre
tantos sacrificios e artimanhas para manter preso parceiro inclue tb este dai as queixas dos homens que no principio estava tudo bem
mas neste momento tudo mudou.

Sendo assim, essa experiência nasceu a partir da
tentação na educação de jovens e adultos de adquirir competências na
aprendizagem com os apetrechos concretos, convida educador a ativar todas as suas percepções, uma vez
que os alunos se manifestam por meio de técnicas de ensino para
desenvolver a capacidade de abstração com relação entre a teoria e a prática de forma a facultar ao aluno resolver situações do cotidiano.

Dawkins nos apresenta, a seguir, alguns exemplos de comportamentos egoístas, por exemplo os guinchos (uma espécie de ave) e a predação
de filhotes por parte de outras fêmeas da espécie,
canibalismo das fêmeas de louva-a-deus que obtém assim uma fonte
de comida próxima (benefício primário) bem como uma melhor performance sexual por parte do parceiro semi-devorado (benefício secundário), e comportamento covarde dos pingüins-imperadores (que chegam a empurrar
um companheiro a fim de dentro da água para afirmar a presença
ou não a predadores).

Com uma obsessão que se trairia de imediato para alguma psicólogo moderno, texto concentra-se
na idéia da cópula diabólica e a várias outras formas de
experiência erótica e atividade sexual atribuíveis pela
imaginação contaminada pela força demoníaca. https://anaturezacura.com/power-blue-comprar

Thanks for this code.

I have a problem now with the Status Bar color. i have a solid green background and before adding the sidebar, the status bar has white text as i expect it to be. But after making the DHSidebarViewController the rootViewController, the status bar text turns black... i have tried many combinations of configurations in my views, and i cant get it to work!!
I would appreciate any tips on this...

Thanks!

Perder barriga envolve 80% uma dieta saudável. http://vw88vn.com/forum/profile.php?id=153740

Nem sei como vim parar nesse lugar, mas oloko, que
—tima surpresa, achei algumas respostas interessantes,
boa! :-) http://www.jimandsherry.org/jaspwiki/index.php/Como_Trabalhar_Na_Web

Olá , você se importa se eu publicar este blog no meu linkedin ? https://elearning.Med.Monash.edu.au/elearning-services?page=1025

Really nno matter if someone doesn't know after
that its up to other viewers that they will help, so here it occurs. http://freespaceway.com/lamoosh/2017/12/19/cell-casino-games-testing-knowledge/

Hi Juan,

The DHSidebarViewController works with the standard way of customizing the status bar text color. You can simply implement preferredStatusBarStyle in DHSidebarViewController or a subclass and return a value of UIStatusBarStyleLightContent. That works with the provided code.

See here for an example: http://www.doubleencore.com/2013/09/developers-guide-to-the-ios-7-status...

At this moment I am g᧐іng away to doo myy bгeakfast, afterward һaving my
breakfast coming over again tto read more newѕ. https://hddvdfreak.com/upcoming-movies/

Hi Jay,

I like your approach and try to implement it within my app. I face the problem that I have 2 Storyboards, the first.storyboard do some login-action and switches then to the second.storyboard, where your sidebar controller should be available.

Adding your code into the application:didFinishLaunchingWithOptions: leads to wired errors as the first.storyboard has no sidebar view controller, as this is first in the second.storyboard available.

Do you have a hint how I could solve this issue? In my opinion I should active your code, if the user enters the second.storyboard but I do not have a glue how I could do that...

cheers -- jerik

Pão Francês Para Diabéticos

Confira diversas opções de sucos para incrementar a sua dieta.
É preferível que as frutas para diabéticos sejam consumidas ao natural, sem adição a
outros alimentos. Quitoplan tem êxito porque trabalha em
todas as vertentes do emagrecimento. Daí, concluímos que uma Dieta Com Receitas
Para Emagrecer prevê muita dedicação e força
de vontade.

Não adianta só eu chegar aqui e expressar que FUNCIONA SIM, é muito legal
quando recebo emails com depoimentos de pessoas que compraram
Quitoplan através da minha indicação, olha que bom nascente texto da Marina, ela me enviou ontem.

Nessa etapa, você vai continuar aplicando a Dieta Detox,
mas vai poder variar seu variar seu cardápio, tornando mais agradável a experiência de emagrecer.

Fiz muitas pesquisas dentro de sites de reclamações para saber se Quitoplan funciona antes de realizar minha
compra, e no principal registrador de opiniões da internet,
RECLAME AQUI, nã encontrei nenhuma reclamaçã sobre nascente emagrecedor.

Ele é 100% aprovado pela anvisa, produto é comercializado em território nacional com aprovação do Ministério da saúde e da anvisa, era totalmente seguro
e natural.

Então evite estes alimentos que são muito densos em carboidratos enquanto precisa produzir um gás no
seu emagrecimento ( 12 ). Nunca saia da sua casa para fazer exercícios bem como não
tenha que deixar seu filho com outras pessoas para ter que ir
treinar na academia.

Essa característica de bebida, pode ser feito tanto com
abacaxi, como com uva, com limão, de espinafre,
de couve, de melancia, com gengibre para complementar suco e muitos outros alimentos podem ser
usados, tendo como exemplo coentro, a linhaça e melão.

Este programação não se trata se uma formula mágica e
sim de um cronograma alimentar que irá fazer você perder no mínimo 21 kg em 60 dias.

Pensado no cliente a equipe do projeto fit 60d lançou 4 ebooks de bônus Receitas,
simples e fáceis para se fazer no dia a dia que é tão corrido.

Minha família enfrentava dificuldades financeira mas nunca abriu mão de minha educação, embora sempre estudei em academia publica,
tive uma boa base escolar, estudei no colégio Satiro Dias e na escola Polivalente
de Amaralina, quanto fiz concurso pára a Academia prática Federal da Bahia.

Alguns diziam engorda”, outros que diabético não pode
comer”, porém, sabemos hoje que principalmente feijão é um dos alimentos mais riqueza em
fibras solúveis, mais do amido resistente (outro tipo de fibra) e faz parte do hábito alimentar do
brasilense.

Chamada de atenção: Se você tem problemas de estômago ou outros problemas de saúde,
deve consultar um médico para saber se pode efetuar este
desintoxicação do organismo. Há uma jovem lista com alguns
alimentos proibidos e também permitidos durante uma
dieta detox e também após concluir período a adaptação.

As lesões do pé diabético resultam da combinação de 2 ou mais fatores de risco, tais como características sócio-econômico-culturais, genéticas, duração da doença, falta
de acesso ao função de saúde e hábitos de vida deletérios à saúde que atuam simultaneamente
e podem ser desencadeadas tanto por traumas intrínsecos como extrínsecos (9,
10).

Se você percebe que sô corpo não esta bem, ou que você não esta
prazeroso se sentindo inflação, é um
sinal de que seu estrutura física pode estar intoxicado, e
é por isso que suco detox faz tanto sucesso, por ser um antioxidante natural para seu corpo através
de suas varias vitaminas que ajudam a combater a oxidação
como, vitamina C, A e todos nutrientes que auxiliam na
fabricação corporal de antioxidantes. http://www.southlincsrspb.org.uk/most-readily-useful-way-to-eliminate-fat-quickly-ideas-to-help-you-get-began-today/

Hi Jay, thanks for your work.
I'm new to iOS and i'm trying to implement your sidebar, but i'm not sure how to do it. Maybe a more elaborated example on github would be great.

Anyway, the sidebar is working, but when i click on a sidebar button to go to another section of my app, it doesn't work as i expected.

My code is:

-(void)openMainWindow:(NSString *)windowID
{
DHSidebarViewController *rootController = //some long line to get the controller
UIStoryboard* mainStoryboard = //getting the storyboard
rootController.rootViewController = [mainStoryboard instantiateViewControllerWithIdentifier:windowID];
}

that only changes the rootView but does not close the sidebar. I tried with a [rootController closeSidebar] at the end but it get a really weird effect.

Can you help me?
Thanks in advance

COMO EMAGRECER ATÉ 5 QUILOS EM UMA SEMANA! http://Niconicowiki.ckwng.com/wiki/DICAS_Para_EMAGRECER_Velozmente

E com a tiara de flores não está sendo dissemelhante. http://www.okeyfans.com/home.php?mod=space&uid=25472&do=profile&from=space

Add new comment