Créer un thème de nuit pour mon application

Je suis nouveau sur le développement iOS et je me demandais comment append un thème de nuit similaire à tweetbot 3 et clair. De mes searchs, je n'ai pas vraiment réussi à find quoi que ce soit sur les applications iOS à thème.

Aurais-je refaire l'application dans un autre storyboard spécifique au thème?

Merci.

Pour append à ce que d'autres ont dit, il y a une video WWDC sur le thème de votre code. J'ai pris un peu plus loin et créé un cadre léger pour les thèmes que j'utilise dans quelques-unes de mes applications. L'essentiel est comme suit.

Chaque fois que vous créez une label, un button, etc. (ou quand ils vont apparaître à l'écran, si vous utilisez le constructor d'interface), vous les passez à une instance de thème qui définit leur apparence. Si plusieurs composants de l'interface user fonctionnent set, utilisez le model de design de facade pour les combiner en un seul object (par exemple, si vous avez un button avec un wrapper client, une label et une image dans un endroit particulier, enveloppez-les une seule class appelée – par exemple – WrappedButton).

Je trouve parfois plus facile de communiquer en uml, alors …

Diagramme UML de thème

Le protocole thématique pourrait ressembler à ceci.

@protocol Theme <NSObject> - (void)themeHeadingLabel:(UILabel *)headingLabel; - (void)themeBodyLabel:(UILabel *)bodyLabel; - (void)themeNavigationButton:(UIButton *)navigationButton; - (void)themeActionButton:(UIButton *)actionButton; @end 

Incidemment, je mets généralement le code là-bas pour permettre aux buttons, labels, etc., de répondre aux changements de taille du text (à partir de l'application Paramètres) dans iOS7. Donc, il pourrait aussi y avoir des methods comme,

 - (void)respondToTextSizeChangeForHeadingLabel:(UILabel *)headingLabel; - (void)respondToTextSizeChangeForBodyLabel:(UILabel *)bodyLabel; // and do the same for buttons 

Ensuite, bien sûr, vous aurez une ou plusieurs implémentations de ce protocole . C'est là que vos thèmes vont vivre. Voici quelques extraits de ce que cela peut ressembler.

 #import "Theme.h" @interface LightTheme : NSObject <Theme> @end @implementation LightTheme - (void)themeHeadingLabel:(UILabel *)headingLabel { headingLabel.backgroundColor = [UIColor lightTextColor]; headingLabel.textColor = [UIColor darkTextColor]; headingLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; } // the rest of your theming @end 

Et vous pourriez avoir un thème sombre dont la mise en œuvre ressemble à quelque chose comme ça.

 @implementation DarkTheme - (void)themeHeadingLabel:(UILabel *)headingLabel { headingLabel.backgroundColor = [UIColor darkGrayColor]; headingLabel.textColor = [UIColor lightTextColor]; headingLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; } // the rest of your theming @end 

J'emballe toujours cela dans un ThemeManager pour m'aider à garder une trace du thème . Cela peut ressembler à ceci.

 #import "Theme.h" @interface ThemeManager : NSObject + (id <Theme>)theme; @end #import "LightTheme.h" #import "DarkTheme.h" @implementation ThemeManager + (id <Theme>)theme { // here you'd return either your light or dark theme, depending on your program's logic } @end 

Maintenant, pour lier le tout, vous pouvez soit l' utiliser directement ou dans une usine.

 UILabel* headingLabel = [[UILabel alloc] init]; headingLabel.text = @"My Heading"; [[ThemeManager theme] themeHeadingLabel:myHeading]; // use the label 

Ou en tant qu'usine, la mise en œuvre ressemblerait à ceci .

 - (UILabel *)buildLabelWith:(NSSsortingng *)text { UILabel* headingLabel = [[UILabel alloc] init]; headingLabel.text = text; [[ThemeManager theme] themeHeadingLabel:myHeading]; return headingLabel; } 

J'espère que cela pourra aider. Si vous avez des questions dites le moi.