iOS - Архивирование UILabel с изображением в качестве фона - PullRequest
0 голосов
/ 23 декабря 2011

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

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

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

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

NSData *viewData = [NSKeyedArchiver archivedDataWithRootObject:label];

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

Ура!

Ответы [ 2 ]

0 голосов
/ 23 декабря 2011

Другой вариант в вашем подклассе UILabel: вы создаете ivar для хранения изображения шаблона и архивируете ivar.Разархивируя свой подкласс 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 голосов
/ 23 декабря 2011
...