UIView:如何在调用 initWithFrame 之前设置 属性?

UIView: how to set property before initWithFrame is called?

我有一些 MyView 作为 UIView 的子class,方法如下:

@interface MyView : UIView

@property (nonatomic, strong) UIImage *image;

@end

@implementation

- (id)initWithImage:(UIImage *)image {
    self = [self init];
    self.image = image;

    return self;
}


- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        //here I want to access my image property
    }
}

@end

出于这个 class 我这样初始化对象:

[[MyView alloc] initWithImage: someimage];

initWithFrame: 为必填项,initWithImage: 为选填项

如果您使用 initWithImage 初始化 "MyView",我怀疑它会调用 initWithFrame。我推荐你使用

   - (id)initWithFrame:(CGRect)frame :(UIImage *)image

或更好

   - (id)initWithFrame:(CGRect)frame image:(UIImage *)image. 

因此您可以在同一个方法调用中传递图像。确保添加

   - (id)initWithFrame:(CGRect)frame image:(UIImage *)image; 

也在您的 .h 文件中。

在调用初始化程序之前不能在对象上设置 属性,因为在调用初始化程序之前对象不存在。如果初始化程序需要访问 属性,您需要将其作为参数提供(因为它是成功创建对象的 要求)。

- (id)initWithFrame:(CGRect)frame

接受一个CGRect参数,因为这个方法的目的是创建一个带有预定义框架的实例;它为默认 NSObject- (instancetype) init 添加了功能,因此与 frame 参数一起提供。

A UIView 需要一个框架,以便它可以在屏幕上进行布局和渲染(除其他外)。在实现的某个时刻,它将执行对默认 [super init] 方法的调用,然后访问 self 以处理它已传递的框架。它 在现有的 class.

上构建

您是在 UIView class 的基础上构建的,因为您希望能够使用 UIImage 对其进行初始化。您可以选择为子 class:

提供默认框架
- (instancetype)initWithImage:(UIImage *)image {

    if (self = [super initWithFrame:CGRectMake(0,0,0,0)]) {
        self.image = image;
    }
}

或者提供一个更'useful'的默认值(像UIImageView那样)并且将图像尺寸作为默认帧:

Initializing a UIImageView Object

- (instancetype)initWithImage:(UIImage *)image

Discussion This method adjusts the frame of the receiver to match the size of the specified image. It also disables user interactions for the image view by default.

使用像这样的初始化程序:

- (instancetype)initWithImage:(UIImage *)image {

    if (self = [super initWithFrame:CGRectMake(0,0,image.size.width,image.size.height)]) {
        self.image = image;
    }
}