Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在自定义UIView中添加UILabel应该在drawRect或initWithFrame/自定义设置方法中吗_Ios - Fatal编程技术网

Ios 在自定义UIView中添加UILabel应该在drawRect或initWithFrame/自定义设置方法中吗

Ios 在自定义UIView中添加UILabel应该在drawRect或initWithFrame/自定义设置方法中吗,ios,Ios,我不是一名全职的iOS开发人员,必须对其他人的代码进行一些更改。我们有一个自定义视图,其中在drawRect中添加了UILabel,如下所示(为简洁起见进行了编辑): 我从未真正看到过这一点,并认为drawRect仅用于添加绘图操作(并且只看到了UIBezierPath)。是否应将其移动到initWithFrame(或常用的设置方法,如setupMyView)。还是可以在drawRect中离开?除了自定义图纸,drawRect中还有其他内容吗 很抱歉问了一个有点基本的问题,但即使是阅读苹果的文档

我不是一名全职的iOS开发人员,必须对其他人的代码进行一些更改。我们有一个自定义视图,其中在drawRect中添加了
UILabel
,如下所示(为简洁起见进行了编辑):

我从未真正看到过这一点,并认为drawRect仅用于添加绘图操作(并且只看到了
UIBezierPath
)。是否应将其移动到initWithFrame(或常用的设置方法,如setupMyView)。还是可以在drawRect中离开?除了自定义图纸,drawRect中还有其他内容吗


很抱歉问了一个有点基本的问题,但即使是阅读苹果的文档也会留下一些不尽如人意的地方

除非有很好的理由从drawRect方法中设置视图的子视图(我想不出任何子视图),否则我强烈建议将drawRect作为一种纯粹的绘图方法,并将addSubview的内容移出那里!我建议重写当前用于启动父视图的-init方法。例如:

-(instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:(CGRect)frame]) {
        UILabel *myLabel=[[UILabel alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 100.0f, 30.0f)];
        myLabel.text=@"here is some text";
        [self addSubview:myLabel];
    }
    return self;
}

除非有很好的理由在drawRect方法中设置视图的子视图(我想没有),否则我强烈建议将drawRect作为一种纯粹的绘图方法,并将addSubview的内容移出那里!我建议重写当前用于启动父视图的-init方法。例如:

-(instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:(CGRect)frame]) {
        UILabel *myLabel=[[UILabel alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 100.0f, 30.0f)];
        myLabel.text=@"here is some text";
        [self addSubview:myLabel];
    }
    return self;
}

除非有很好的理由在drawRect方法中设置视图的子视图(我想没有),否则我强烈建议将drawRect作为一种纯粹的绘图方法,并将addSubview的内容移出那里!我建议重写当前用于启动父视图的-init方法。例如:

-(instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:(CGRect)frame]) {
        UILabel *myLabel=[[UILabel alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 100.0f, 30.0f)];
        myLabel.text=@"here is some text";
        [self addSubview:myLabel];
    }
    return self;
}

除非有很好的理由在drawRect方法中设置视图的子视图(我想没有),否则我强烈建议将drawRect作为一种纯粹的绘图方法,并将addSubview的内容移出那里!我建议重写当前用于启动父视图的-init方法。例如:

-(instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:(CGRect)frame]) {
        UILabel *myLabel=[[UILabel alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 100.0f, 30.0f)];
        myLabel.text=@"here is some text";
        [self addSubview:myLabel];
    }
    return self;
}

我绝对不会在drawRect中做那样的事情。我过去使用的一种方法是将其添加到LayoutSubView,因为此时视图知道真实的边界/帧。您需要确保只生成一次视图内容,因为layoutSubviews会被多次调用,例如在旋转时。我通常执行以下操作,其中,
\u viewGenerated
是一个实例变量:

- (void)layoutSubviews {
    [super layoutSubviews];

    if (!_viewGenerated) {
        [self generateView];
        _viewGenerated = YES;
    }
}

- (void)generateView {
    // do everything with any labels, images, etc., here...
}

我绝对不会在drawRect中做那样的事情。我过去使用的一种方法是将其添加到LayoutSubView,因为此时视图知道真实的边界/帧。您需要确保只生成一次视图内容,因为layoutSubviews会被多次调用,例如在旋转时。我通常执行以下操作,其中,
\u viewGenerated
是一个实例变量:

- (void)layoutSubviews {
    [super layoutSubviews];

    if (!_viewGenerated) {
        [self generateView];
        _viewGenerated = YES;
    }
}

- (void)generateView {
    // do everything with any labels, images, etc., here...
}

我绝对不会在drawRect中做那样的事情。我过去使用的一种方法是将其添加到LayoutSubView,因为此时视图知道真实的边界/帧。您需要确保只生成一次视图内容,因为layoutSubviews会被多次调用,例如在旋转时。我通常执行以下操作,其中,
\u viewGenerated
是一个实例变量:

- (void)layoutSubviews {
    [super layoutSubviews];

    if (!_viewGenerated) {
        [self generateView];
        _viewGenerated = YES;
    }
}

- (void)generateView {
    // do everything with any labels, images, etc., here...
}

我绝对不会在drawRect中做那样的事情。我过去使用的一种方法是将其添加到LayoutSubView,因为此时视图知道真实的边界/帧。您需要确保只生成一次视图内容,因为layoutSubviews会被多次调用,例如在旋转时。我通常执行以下操作,其中,
\u viewGenerated
是一个实例变量:

- (void)layoutSubviews {
    [super layoutSubviews];

    if (!_viewGenerated) {
        [self generateView];
        _viewGenerated = YES;
    }
}

- (void)generateView {
    // do everything with any labels, images, etc., here...
}

把它放在一个普通的设置方法会更好。drawRect可以多次调用,最好不要使用它,除非您正在进行自定义绘图;当我看到它的时候,它看起来很不稳定。公平地说,只有真正的绘画。动画(如[UIView animateWithDuration]是否在drawRect中?thxNo,animateWithDuration也不应在drawRect中。最好将其放在常用的设置方法中。drawRect可以多次调用,除非您正在进行自定义drawing.thx(再次)操作,否则最好不要使用它@rdelmar;当我看到它的时候,它看起来真的很不稳定。公平地说,只有真正的绘画才会有动画(就像[UIView animateWithDuration]是否在drawRect中?thxNo,animateWithDuration也不应该在drawRect中。最好将其放在常用的设置方法中。drawRect可以多次调用,最好不要使用它,除非您正在进行自定义drawing.thx(再次)@rdelmar;当我看到它的时候,它看起来真的很不稳定。公平地说,只有真正的绘画才会有动画(就像[UIView animateWithDuration]是否在drawRect中?thxNo,animateWithDuration也不应该在drawRect中。最好将其放在常用的设置方法中。drawRect可以多次调用,最好不要使用它,除非您正在进行自定义drawing.thx(再次)@rdelmar;当我看到它时,它看起来真的很不稳定。公平地说,只有真实的绘图。动画(像[UIView animateWithDuration]一样)会在drawRect中吗?不,animateWithDuration也不应该在drawRect中。