Я пытаюсь создать настраиваемый элемент управления, который обновляется в интерфейсе Builder с помощью новой опции IB_DESIGNABLE, описанной здесь.
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect myFrame = self.bounds;
CGContextSetLineWidth(context, 10);
CGRectInset(myFrame, 5,5);
[[UIColor redColor] set];
UIRectFrame(myFrame);
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath;
plistPath = [bundle pathForResource:@"fileExample" ofType:@"plist"];
UIImage *tsliderOff = [UIImage imageNamed:@"btn_slider_off.png"];
[tsliderOff drawInRect:self.bounds];
}
Когда я запускаю симулятор, я получаю красную рамку с моим изображением в центре (как и ожидалось):
Но когда я пытаюсь использовать Interface Builder, он появляется только как красное поле (без изображения в середине):
Когда я его отлаживаю: Editor- > Debug Selected Views, он показывает, что все, что загружено из пакета, равно nil. PlistPath и tsliderOff отображаются как ноль.
Я убедился, что btn_slider_off.png включен в Targets- > myFrameWork- > Build Phases- > Copy Bundle Resources.
Любая идея, почему Interface Builder не видит файл png во время редактирования, но отображается нормально при запуске? "Создание пользовательского представления, которое визуализирует в построителе интерфейса" немного ограничено, если я не могу загрузить изображения для рендеринга...
редактирование на основе решения rickster
Риккер указал мне на решение - проблема в том, что файлы не живут в mainBundle, они живут в [NSBundle bundleForClass: [self class]]; И кажется, что [UIImage imageNamed: @ "btn_slider_off.png" ] автоматически использует mainBundle.
Следующий код работает!
#if !TARGET_INTERFACE_BUILDER
NSBundle *bundle = [NSBundle mainBundle];
#else
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
#endif
NSString *fileName = [bundle pathForResource:@"btn_slider_off" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:fileName];
[image drawInRect:self.bounds];