IOS - Создайте подкласс UIView для закругленного прямоугольника

Я пытаюсь создать и использовать очень простой подкласс UIView для прямоугольника с закругленными углами. Я создал новый класс следующим образом:

RoundedRect.h

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

@interface RoundedRect : UIView
@end

RoundedRect.m

#import "RoundedRect.h"

@implementation RoundedRect

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        [[self layer] setCornerRadius:10.0f];
        [[self layer] setMasksToBounds:YES];
    }
    return self;
}
@end

Я использую iOS 5.1 с раскадными версиями и установил свойство пользовательского класса в окне инспектора IB на "RoundedRect", но когда я запускаю приложение, прямоугольник все еще имеет квадратные углы. Я пропустил что-то очевидное?

Спасибо Джонатан

Ответ 1

Метод initWithFrame не вызывается, когда представление создается из файла XIB. Вместо этого вызывается инициализатор initWithCoder:, поэтому вам нужно выполнить ту же инициализацию в этом методе.

Ответ 2

В iOS 5 и выше нет необходимости в подклассе - вы можете сделать все это из Interface Builder.

  • Выберите UIView, который вы хотите изменить.
  • Перейдите к инспектору идентификации.
  • В "Атрибутах, определяемых пользователем и времени выполнения", добавьте "layer.cornerRadius" в Key Path, Type должен быть "Number" и любой требуемый параметр.
  • Также добавьте 'layer.masksToBounds' как Boolean.
  • Готово! Без подкласса, и все в IB.

Ответ 3

Другие ребята уже ответили на вопрос, но я бы реорганизовал его так, чтобы включить использование в nibs и в коде

#import "RoundedRect.h"

@implementation RoundedRect

- (id)initWithFrame:(CGRect)frame;
{
    self = [super initWithFrame:frame];
    if (self) {
        [self commonInit];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder;
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self commonInit];
    }
    return self;
}

- (void)commonInit;
{
    CALayer *layer = self.layer;
    layer.cornerRadius  = 10.0f;
    layer.masksToBounds = YES;
}

@end

Ответ 4

Для представлений, загружаемых из файла NIB, назначенный инициализатор initWithCoder:. initWithFame: в этом случае не вызывается.

Ответ 5

Если загрузка UIView из Nib, вы должны использовать метод

- (void)awakeFromNib