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;
}
}
我有一些 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;
}
}