2011-12-22 2 views
0

Я использую colorWithPatternImage установить фоновое изображение UILabel, но, когда я прихожу в архив, я получаю следующее сообщение об ошибке:IOS - Архивирование UILabel с изображением в качестве фона

NSInternalInconsistencyException', reason: 'Only support RGBA or the White color space, this method is a hack.' 

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

Для ясности, это код, который вызывает проблему:

NSData *viewData = [NSKeyedArchiver archivedDataWithRootObject:label]; 

Где метка является UILabel, который имеет набор фонового изображения, используя colorWithPatternImage.

Cheers!

+0

Пожалуйста, покажите код, который дает вам эту ошибку –

+0

простой код: NSData * ViewData = [NSKeyedArchiver archivedDataWithRootObject: метка]; если фон UILabel был установлен с ранее упомянутым цветомWithPatternImage. –

+0

, можете ли вы обновить исходный вопрос и добавить код в свой код с помощью блоков кода? –

ответ

0

Похоже, у вас была такая же проблема, как

Saving [UIColor colorWithPatternImage:image] UIColor to Core Data using NSKeyedArchiver

+0

Я смотрел на это, казалось, было чрезмерным решением. Интересно, был ли лучший способ подклассированием? То есть встраивание изображения? –

+0

Я не мог найти лучший способ. Возможно, вы можете использовать билет DTS с Apple, чтобы найти более простое и элегантное решение. –

0

Другой вариант заключается в вашем UILabel подклассе, вы создаете Ивар для сохранения шаблона изображения и архивированные на Ивара. Когда вы разгружаете свой подкласс UILabel, вы воссоздаете образ изображения с изображением ivar.

Пример кода для этикетки.

@implementation ESKLabelArchive 

@synthesize backgroundImage=_backgroundImage; 

#pragma mark - NSCoding Protocols 
- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) 
    { 
     self.backgroundImage = (UIImage *)[aDecoder decodeObjectForKey:@"backgroundImage"]; 
     if (self.backgroundImage != nil) 
      self.backgroundColor = [UIColor colorWithPatternImage:self.backgroundImage]; 

    } 
    return self; 
} 

- (void)setBackgroundImage:(UIImage *)backgroundImage 
{ 
    _backgroundImage = [backgroundImage copy]; 
    self.backgroundColor = [UIColor colorWithPatternImage:_backgroundImage]; 
} 

- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    if (self.backgroundImage != nil) 
    { 
     self.backgroundColor = [UIColor clearColor]; 
     [aCoder encodeObject:self.backgroundImage forKey:@"backgroundImage"]; 
    } 
    [super encodeWithCoder:aCoder]; 
    if (self.backgroundImage != nil) 
    { 
     self.backgroundColor = [UIColor colorWithPatternImage:self.backgroundImage]; 
    } 
} 



@end 

Sampel View Controller

@implementation ESKViewController 

@synthesize label; 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Release any cached data, images, etc that aren't in use. 
} 

- (IBAction)archivedTapped:(id)sender 
{ 
    NSMutableData *data = [[NSMutableData alloc] init]; 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
    [archiver encodeObject:self.label forKey:@"label"]; 
    [archiver finishEncoding]; 

    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
    ESKLabelArchive *label2 = [unarchiver decodeObjectForKey:@"label"]; 
    [unarchiver finishDecoding]; 

    label2.text = @"unarchived"; 
    label2.frame = CGRectMake(20, 150, 200, 100); 

    [self.view addSubview:label2]; 
} 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.label.backgroundImage = [UIImage imageNamed:@"ricepaper.png"]; 

} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
    self.label = nil; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} 

@end 
+0

Я искал это так, как мне кажется, но я получаю BAD_ACCESS при попытке кодирования изображения. Я предполагаю, что он не соответствует NSCoding? –

+0

обновил код. надеюсь, это прояснит намерение. –

Смежные вопросы