11

我正在尝试为带有圆角的矩形创建和使用一个非常简单的 UIView 子类。我创建了一个新类,如下所示:

圆角矩形.h

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

@interface RoundedRect : UIView
@end

圆角矩形

#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”,但是当我运行应用程序时,矩形仍然有方角。我错过了什么明显的东西吗?

谢谢乔纳森

4

5 回答 5

23

在 iOS 5 及更高版本中,绝对不需要子类化 - 您可以从 Interface Builder 中完成所有操作。

  1. 选择要修改的 UIView。
  2. 转到身份检查器。
  3. 在“用户定义和运行时属性”中,在关键路径中添加“layer.cornerRadius”,类型应为“数字”以及您需要的任何设置。
  4. 还将“layer.masksToBounds”添加为布尔值。
  5. 完毕!没有子类化,全部在 IB 中。
于 2013-01-30T02:16:17.293 回答
18

其他人已经回答了这个问题,但我会像这样重构它,以便在笔尖和代码中使用

#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
于 2012-04-17T12:03:32.417 回答
10

initWithFrame当视图从 XIB 文件实例化时,不会调用该方法。相反,initWithCoder:会调用初始化程序,因此您需要在此方法中执行相同的初始化。

于 2012-04-17T11:55:26.267 回答
3

对于从 NIB 文件加载的视图,指定的初始化程序是initWithCoder:. initWithFame:在这种情况下不调用。

于 2012-04-17T11:55:52.267 回答
0

如果 UIView 从 Nib 加载,你应该使用方法

- (void)awakeFromNib
于 2014-12-18T03:23:04.747 回答