Стили настроек iPhone для статической библиотеки / фреймворка - PullRequest
2 голосов
/ 02 октября 2009

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

Как я мог с какао включить систему, чтобы я мог установить определенные стили для этой библиотеки. Я посмотрел на библиотеку Three20 Джо Хьюитта http://github.com/joehewitt/three20, (посмотрите на TTStyleSheet.h и ее реализацию), здесь он делает то, о чем я думаю, но это кажется слишком сложным.

Интересно, есть ли у кого система получше ... с использованием глобального делегата?

Ответы [ 2 ]

1 голос
/ 02 октября 2009

На самом деле мне было проще подумать, что это класс, который я создал, чтобы сделать это на основе идеи таблиц стилей из Three20 без накладных расходов.

GNStyle.h

 /*
 ----------------------------------------------------------------------------------------------------

 GNStyle.h

 ----------------------------------------------------------------------------------------------------

 Created by Shane Saunders on 02/10/2009.
 2009 GNative.
 www.gnative.com

 This is a condensed Style Sheet idea.
 Its only in Beta form and might need some work.
 Any upgrades please contact me with your changes
 shane/gnative/com

 Credit to Joe Hewitt for his idea from the Three20 library



 ----------------------------------------------------------------------------------------------------
*/


#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

/*-----------------------------------------------------------------------------------------------------------------------
    Style
-----------------------------------------------------------------------------------------------------------------------*/
#define GNSTYLE(_SELECTOR) [[GNStyle globalStyleSheet] styleWithSelector:@#_SELECTOR]
#define GNSTYLESTATE(_SELECTOR, _STATE) [[GNStyle globalStyleSheet] styleWithSelector:@#_SELECTOR forState:_STATE]
#define GNSTYLEVAR(_VARNAME) [GNSTYLESHEET _VARNAME]
#define GNSTYLESHEET ((id)[GNStyle globalStyleSheet])


@interface GNStyle : NSObject {
    NSMutableDictionary* _styles;
}

+ (GNStyle*)globalStyleSheet;
+ (void)setGlobalStyleSheet:(GNStyle*)styleSheet;

- (id)styleWithSelector:(NSString*)selector;
- (id)styleWithSelector:(NSString*)selector forState:(UIControlState)state;


@end


/*
 ----------------------------------------------------------------------------------------------------

 Default Style Sheet

 ----------------------------------------------------------------------------------------------------
 */

@interface GNDefaultStyle : GNStyle {

}

@end

GNStyle.m

/*
 ----------------------------------------------------------------------------------------------------

 GNStyle.m

 ----------------------------------------------------------------------------------------------------

 Created by Shane Saunders on 02/10/2009.
 2009 GNative.
 www.gnative.com

 This is a condensed Style Sheet idea.
 Its only in Beta form and might need some work.
 Any upgrades please contact me with your changes
 shane/gnative/com

 Credit to Joe Hewitt for his idea from the Three20 library



 ----------------------------------------------------------------------------------------------------
 */


#import "GNStyle.h"


static GNStyle* gStyleSheet = nil;



@implementation GNStyle


+ (GNStyle*)globalStyleSheet {
    if (!gStyleSheet) {
        gStyleSheet = [[GNDefaultStyle alloc] init];
    }
    return gStyleSheet;
}

+ (void)setGlobalStyleSheet:(GNStyle*)styleSheet {
    [gStyleSheet release];
    gStyleSheet = [styleSheet retain];
}


/* ---------------------------------------------------------------------------------------------------- */

- (id)init {
    if (self = [super init]) {
        _styles = nil;
    }
    return self;
}

- (void)dealloc { 
    [super dealloc];
}

- (void)didReceiveMemoryWarning:(void*)object {

}

/* ---------------------------------------------------------------------------------------------------- */


- (id)styleWithSelector:(NSString*)selector {
    return [self styleWithSelector:selector forState:UIControlStateNormal];
}

- (id)styleWithSelector:(NSString*)selector forState:(UIControlState)state {
    NSString* key = state == UIControlStateNormal ? selector : [NSString stringWithFormat:@"%@%d", selector, state];
    GNStyle* style = [_styles objectForKey:key];

    if (!style) {
        SEL sel = NSSelectorFromString(selector);
        if ([self respondsToSelector:sel]) {
            style = [self performSelector:sel withObject:(id)state];
            if (style) {
                if (!_styles) {
                    _styles = [[NSMutableDictionary alloc] init];
                }
                [_styles setObject:style forKey:key];
            }
        }
    }
    return style;
}

@end


/*
 ----------------------------------------------------------------------------------------------------

 Default Style Sheet

 ----------------------------------------------------------------------------------------------------
*/


@implementation GNDefaultStyle


-(UIColor*)colorOne
{
    return [UIColor redColor];
}


-(UIColor*)stateColor:(UIControlState)state
{   
    if (state == UIControlStateHighlighted)
        return [UIColor yellowColor];
    else
        return [UIColor greenColor];

}

@end

Использование очень просто ..

#import GNStyle.h


UIColor *colorOne = GNSTYLE(colorOne);  
UIColor *normalColor = GNSTYLESTATE(stateColor:, UIControlStateNormal);
UIColor *highlightColor = GNSTYLESTATE(stateColor:, UIControlStateHighlighted);

Полагаю, есть некоторые изменения, которые можно было бы сделать, чтобы сделать это лучше ... если вы все-таки воспользуетесь этим и обновите его, вы можете связаться со мной.

Спасибо

1 голос
/ 02 октября 2009

Three20 работает довольно хорошо для меня на самом деле. Вы можете просто создать подкласс TTStyle и переопределить его drawStyle (или что-то подобное). Тогда подкласс TTDefaultStyleSheet и использовать [TTStyleSheet setGlobalStyleSheet:].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...