Mam kilka żółtych przycisków utworzonych za pomocą narzędzia Inteface Builder. Wszystkie mają ten sam kolor. Obecnie deklaruję kolor w każdym Xib. Czy mogę zadeklarować to globalnie i ponownie wykorzystać we wszystkich wersjach xibs?Czy mogę ponownie użyć kolorów w programie Interface Builder?
Odpowiedz
Zdecydowanie!
Utwórz singleton przedmiot (można nazwać to OksanaColor
, aby być cool) ...
... lub, jeśli naprawdę jesteś leniwy, tylko do odczytu UIColor
właściwość, że można uzyskać dostęp z delegacja aplikacji.
Możesz również dodać kategorię na UIColor, dzięki czemu można jej używać tak samo, jak podczas korzystania z UIColor. Na przykład w mojej aplikacji dodaję nowy plik o nazwie ApplicationColors, który zawiera wszystkie moje kolory aplikacji.
@interface UIColor (ApplicationColours)
+(UIColor *)savaColor;
@end
Realizacja:
@implementation UIColor (ApplicationColours)
+(UIColor *)savaColor
{
return [UIColor colorWithRed:228.0f/255.0f green:86.0f/255.0f blue:86.0f/255.0f alpha:1.0f];
}
@end
Potem go używać w moim app, mam importować ApplicationColours.h i używać tak samo jak każdy inny UIColor. tj:
label.textColor = [UIColor savaColor];
Możesz chcieć, aby + savaColor zachowała zmienną statyczną dla tego koloru, tak aby za każdym razem nie tworzyła nowej instancji. – NSResponder
Tak dobre myślenie @NSResponder nigdy o tym nie myślałem :) –
Nie chcę tego robić w kodzie. Chcę ustawić wewnątrz konstruktora interfejsu. – Oksana
Oto bardzo prosta implementacja nazwie kategorii kolory dla UIColor
. Z tego kodu w swoim projekcie, UIColor
zapamięta jakieś kolory, które chcesz zapisać, a pozwoli Ci uzyskać dostęp do własnych kolorów lub kolorów systemowych za pomocą +colorWithName:
@interface UIColor (namedColors)
+ (UIColor *) colorWithName:(NSString *) name;
+ (void) setColor:(UIColor *) color forName:(NSString *) name;
@end
static NSMutableDictionary *colorStorage;
@implementation UIColor (namedColors)
+ (NSMutableDictionary *) colorStorage
{
if (!colorStorage)
colorStorage = [[NSMutableDictionary alloc] initWithCapacity:10];
return colorStorage;
}
+ (UIColor *) colorWithName:(NSString *) name
{
UIColor *result =[[self colorStorage] valueForKey:name]; // See if we have a color with this name in the colorStorage.
if (result) return result;
SEL selector = NSSelectorFromString(name); // look for a class method whose selector matches the given name, such as "blueColor" or "clearColor".
if ([self respondsToSelector:selector] && (result = [self performSelector:selector]))
if ([result isKindOfClass:[self class]])
return result;
return nil;
}
+ (void) setColor:(UIColor *) color forName:(NSString *) name
{
[[self colorStorage] setValue:color forKey:name];
}
@end
Może zbyt skomplikowane? Proste '[UIColor myRedColor]' lub '[UIColor anotherRedColor]' byłoby wystarczające i prostsze, nie? – Tricertops
Tak, można to zrobić.
U dołu wyskakującego selektora kolorów w programie Interface Builder znajduje się rząd kwadratów, które można wykorzystać do przechowywania kolorów do późniejszego wykorzystania. Przeciągnij kolor do niego z prostokąta, w którym bieżący kolor jest wyświetlany u góry selektora kolorów, aby go zapisać, a następnie po prostu kliknij zapisany kolor później, aby go użyć.
To nie pozwoli ci ponownie zastosować koloru, gdy zdecydujesz się go zmienić. Jest to jednak jedyny prymitywny sposób zapisywania kolorów w celu ręcznego ponownego użycia. – Tricertops
@ iMartin Masz rację, że to jest problem, a ja o tym nie pomyślałem. W przypadku niektórych hackery nadal możesz zmienić kolor globalnie, używając tej metody. Jeśli chcesz zmienić kolor w swoim scenorysie, po prostu znajdź i zamień wszystkie wystąpienia znacznika reprezentującego ten kolor w bazowym pliku XML Storyboard (lub wszystkich XIB w twoim projekcie). To hack, ale zadziała, i nie jest to coś, co musisz zrobić często. –
Niemożliwe w konstruktorze Interface. Zrób to w kodzie, na przykład tworząc specjalną podklasę przycisku.
Możesz użyć systemowej palety kolorów, aby zapisać kolor, ale nadal musisz zastosować go do wszystkich przycisków za każdym razem, gdy zdecydujesz się go zmienić. Lub możesz po prostu użyć ostatnio używanych kolorów w selektorze kolorów, ale żadna z metod nie jest wystarczająca dynamicznie.
Dziękuję za faktyczne udzielenie odpowiedzi na pytanie. – KPM
Nie wierzę, że istnieje sposób, aby to zrobić całkowicie w konstruktorze interfejsów, niestety. Możesz jednak przyjść całkiem blisko z odrobiną kodu. Najlepszym sposobem znalazłem, aby móc zmieniać kolory w całej aplikacji za jednym zamachem jest do podklasy element, który ma być koloru (UILabel, na przykład), aby ustawić kolor po inicjalizacji:
@interface HuedUILabel : UILabel
@end
@implementation HuedUILabel
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
// Initialization code
self.textColor = [AppConfig primaryColor];
}
return self;
}
@end
Następnie ustaw etykietę, aby mieć klasę niestandardowego w IB:
teraz, gdy chcemy zmienić kolor wszystkich UILabels, można to zrobić zmieniając jeden kolor def i nie musisz zagracać swój kod przy pomocy kilku przydziałów wyglądu.
- 1. Różnica kolorów między drawRect a Interface Builder?
- 2. Jak mogę obrócić UIImageView w Interface Builder?
- 3. Jak dodać niestandardowy obiekt w programie Interface Builder?
- 4. Gdzie zainicjować niestandardowe UIView, utworzone w programie Interface Builder?
- 5. Xcode6 Interface Builder "ukrył" moje widoki?
- 6. UIView layoutMargins in Interface Builder
- 7. Użyj Singleton In Interface Builder?
- 8. XCode Nieznana klasa ***** w pliku Interface Builder
- 9. Jak utworzyć wtyczkę Interface Builder w XCode5 +?
- 10. Czy mogę ponownie użyć pola obliczeniowego w zapytaniu SELECT?
- 11. Apple Interface Builder: dodawanie podglądu do UIImageView
- 12. Niestandardowe UIView zbudowany z Interface Builder dostępne/pozycjonowane przez Interface Builder
- 13. Czy istnieje odpowiednik CSS dla XIB (XCode Interface Builder XML)?
- 14. Dlaczego mogę wyświetlić tylko źródło Storyboard, a nie Interface Builder?
- 15. XCode (Interface Builder): Aktualizacja ramek i wiązań?
- 16. Projektant systemu Android, taki jak "Interface Builder"?
- 17. iOS Interface Builder - Jak zresetować obraz do domyślnego rozmiaru?
- 18. Dodawanie komórek statycznych do UITableView w programie Interface Builder dla iOS8? Sekcja zawartości niewidoczna
- 19. Jak mogę ponownie użyć AlertDialog dla Tak/Nie na Androidzie?
- 20. Używanie Xcode i Interface Builder do tworzenia widoków prototypowych
- 21. Nazwa pliku wyjściowego w programie Flash Builder
- 22. Czy mogę ponownie użyć PreparedStatement, jeśli wystąpi wyjątek przejściowy?
- 23. Program Interface Builder nie był w stanie określić typu "Main_iPad.storyboard"
- 24. Obiekt a obiekt zewnętrzny w XCode Interface Builder
- 25. Dobre miejsce do znajdowania frameworków z wtyczkami Interface Builder ...
- 26. Czy możesz ponownie użyć przeniesionego std :: string?
- 27. Czy mogę użyć @PostConstruct w metodzie interfejsu?
- 28. ponownie użyć strażnika w Scali
- 29. Gładkie wydruki kolorów w programie Matlab
- 30. Jak mogę ponownie użyć wyrażeń w instrukcjach LINQ?
Jaką część "in Interface Builder" zrobiła każda osoba, która odpowiedziała na to pytanie, nie rozumiejąc? Dziwne. –
@MarkAmery Oznacza to, że jedynym sposobem na to jest użycie _code_. – Tricertops
To naprawdę głupie, że nie ma sposobu, aby to zrobić. Kto chce zmienić kolor na 100 stron jeden po drugim w IB? – Jonny