Создание NSArray IBInspectable

Существует способ использования NSArray IBInspectable для определения нескольких значений в пользовательском представлении Storyboard?

Я знаю, что NSArray не имеет никакой информации о типе объекта, который будет храниться в нем, поэтому, вероятно, это проблема. Но есть какое-то решение, использующее аннотацию или что-то в этом роде?

Я хочу сделать NSArray из UIColors через Storyboard и нарисовать Gradient Layer в представлении во время визуализации Storyboard.

Я начал создавать два свойства, называемые startColor и endColor. Это прекрасно работает, но я хочу сделать это более общим.

Это мой метод drawRect :

 - (void)drawRect:(CGRect)rect { CAGradientLayer *gradientLayer = [CAGradientLayer layer]; gradientLayer.frame = self.bounds; gradientLayer.colors = [NSArray arrayWithObjects:(id)[self.startColor CGColor], (id)[self.endColor CGColor], nil]; [self.layer addSublayer:gradientLayer]; } 

И я хочу сделать что-то вроде этого:

 - (void)drawRect:(CGRect)rect { CAGradientLayer *gradientLayer = [CAGradientLayer layer]; gradientLayer.frame = self.bounds; // colorsArray should be an IBInspectable property in order to be setted on Storyboard Attributes Inspector gradientLayer.colors = self.colorsArray; [self.layer addSublayer:gradientLayer]; } 

One Solution collect form web for “Создание NSArray IBInspectable”

Xcode не поддерживает проверенные массивы с версии 7.1.

Вы можете использовать его для слоя градиента, если вы выберете максимальное количество остановок градиента. Вот как выглядит мой тест, где я жестко закодировал шесть остановок:

Снимок экрана с градиентным представлением

Кстати, вы не должны добавлять subviews или подслои в drawRect: Система не ожидает обновлений иерархии уровней на этом этапе. Вы должны сделать это в layoutSubviews .

Вот код, который я использовал для создания этого снимка экрана.

GradientView.h

 #import <UIKit/UIKit.h> IB_DESIGNABLE @interface GradientView : UIView @property(nonatomic, readonly, strong) CAGradientLayer *layer; @property (nonatomic) IBInspectable CGPoint startPoint; @property (nonatomic) IBInspectable CGPoint endPoint; @property (nonatomic, strong) IBInspectable UIColor *color0; @property (nonatomic) IBInspectable CGFloat location0; @property (nonatomic, strong) IBInspectable UIColor *color1; @property (nonatomic) IBInspectable CGFloat location1; @property (nonatomic, strong) IBInspectable UIColor *color2; @property (nonatomic) IBInspectable CGFloat location2; @property (nonatomic, strong) IBInspectable UIColor *color3; @property (nonatomic) IBInspectable CGFloat location3; @property (nonatomic, strong) IBInspectable UIColor *color4; @property (nonatomic) IBInspectable CGFloat location4; @property (nonatomic, strong) IBInspectable UIColor *color5; @property (nonatomic) IBInspectable CGFloat location5; @end 

GradientView.m

 #import "GradientView.h" #define MaxStops 6 typedef struct { CGColorRef color; CGFloat location; } GradientStop; @implementation GradientView @dynamic layer; - (void)setStartPoint:(CGPoint)startPoint { self.layer.startPoint = startPoint; } - (CGPoint)startPoint { return self.layer.startPoint; } - (void)setEndPoint:(CGPoint)endPoint { self.layer.endPoint = endPoint; } - (CGPoint)endPoint { return self.layer.endPoint; } #define DefineSetters(i) \ - (void)setColor##i:(UIColor *)color##i { \ _color##i = color##i; \ [self setNeedsLayout]; \ } \ \ - (void)setLocation##i:(CGFloat)location##i { \ _location##i = location##i; \ [self setNeedsLayout]; \ } DefineSetters(0) DefineSetters(1) DefineSetters(2) DefineSetters(3) DefineSetters(4) DefineSetters(5) + (Class)layerClass { return [CAGradientLayer class]; } - (void)layoutSubviews { [super layoutSubviews]; [self updateGradient]; } static BOOL isValidStop(const GradientStop *stop) { return stop->color != nil && stop->location >= 0 && stop->location <= 1; } static int compareStops(const void *a, const void *b) { const GradientStop *stop0 = a; const GradientStop *stop1 = b; if (isValidStop(stop0) && isValidStop(stop1)) { if (stop0->location < stop1->location) { return -1; } else if (stop0->location > stop1->location) { return 1; } else { return 0; } } else if (isValidStop(stop0)) { return -1; } else if (isValidStop(stop1)) { return 1; } else { return 0; } } static size_t countOfValidStops(const GradientStop *stops, size_t maxStops) { for (size_t i = 0; i < maxStops; ++i) { if (!isValidStop(&stops[i])) { return i; } } return maxStops; } - (void)updateGradient { GradientStop stops[MaxStops]; [self setStop:stops+0 color:self.color0 location:self.location0]; [self setStop:stops+1 color:self.color1 location:self.location1]; [self setStop:stops+2 color:self.color2 location:self.location2]; [self setStop:stops+3 color:self.color3 location:self.location3]; [self setStop:stops+4 color:self.color4 location:self.location4]; [self setStop:stops+5 color:self.color5 location:self.location5]; qsort(stops, MaxStops, sizeof *stops, compareStops); size_t count = countOfValidStops(stops, MaxStops); NSMutableArray *colors = [NSMutableArray arrayWithCapacity:count]; NSMutableArray *locations = [NSMutableArray arrayWithCapacity:count]; [self populateColors:colors locations:locations fromStops:stops count:count]; self.layer.colors = colors; self.layer.locations = locations; } - (void)setStop:(GradientStop *)stop color:(UIColor *)color location:(CGFloat)location { stop->color = color.CGColor; stop->location = location; } - (void)populateColors:(NSMutableArray *)colors locations:(NSMutableArray *)locations fromStops:(const GradientStop *)stops count:(size_t)count { for (size_t i = 0; i < count; ++i) { [colors addObject:(__bridge id)stops[i].color]; [locations addObject:@(stops[i].location)]; } } @end 
  • Аргумент массива аргументов Objective C (AJNMessageArgument)
  • NSString hasPrefix: vs hasSuffix: что дешевле?
  • iOS 7 XCode 5 Ориентация раскадровки на ландшафт
  • UIButton - alloc initWithFrame: vs. buttonWithType:
  • object-c collectionview не загружает данные
  • UIScrollView, скользящий, масштабируемый
  • Точки останова не попадают в Xcode 7
  • ios-zoom и поворот маскированного UIImageView
  • Пунктирная / пунктирная граница для UITextView / UITextField
  • NSDate dateFromString 2 месяца неправильно?
  • Нет видимого @interface для 'UIInterpolatingMotionEffect' объявляет селектор 'initWithKeyPath: type:'
  • Interesting Posts

    Извлечение последнего слова в строке со скоростью

    Swift / XCode – AdMob межстраничный во время увольненияViewController

    Являются ли коды статуса HTTP в любом месте SDK iOS?

    Добавить ScrollView в существующий вид

    На iPad нет песен

    Как вы программно используете информацию обрезки изображения каталога каталогов?

    Лучший способ запустить повторную задачу, пока приложение активно

    Принудительная коллекцияView имеет только 2 строки

    registerUserNotificationSettings не показывает подсказку iOS 8

    Как вы изменяете альфа-изображение UIButton в отключенном состоянии?

    Подключить подключение сокетов на applicationWillResignActive или applicationDidEnterBackground?

    Ошибка компилятора прерывистой командной строки Swift

    Добавить полупрозрачную маску в CALayer?

    Принятие протокола UIKeyInput для ввода информации с клавиатуры Bluetooth

    Как Xcode устанавливает EXPANDED_CODE_SIGN_IDENTITY?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.