0

我想在 CALayer 中添加一个文本字段,但我没有等待。

代码:

-(void)drawInContext:(CGContextRef)ctx
{        
    NSLog(@"OK");
    UITextField *field = [[UITextField alloc] initWithFrame:CGRectMake(0,120, self.frame.size.width, 100)];
    [field setText:@"Test"];
    [self addSublayer:field.layer];
}

任何想法,建议,良好做法:) ?

4

2 回答 2

1

您无法设法将作为 UIView 的子类的 UITextField 放置为 CALayer 的子(子层),它需要一个具有 CALayer 祖先的对象。

但是,您当然可以找到 CALayer 的 superview,它继承 UIView 并将 UITextField 放在显示时间的好位置,并将 CALayer 设置为 UITextField 的委托以在您键入时保持内容同步(请参阅 UITextFieldTextDidChangeNotification通知或 -textFieldDidEndEditing:UITextField 中的委托方法)。

这是它在 Quartz Composer 中的样子(使用 Cocoa,而不是 Cocoa Touch)

Quartz Composer 处于编辑模式

于 2013-03-25T15:44:18.897 回答
0

好的做法:)?

在我看来,这是一种不好的做法。层比视图低,你不应该像这样混合它们。如this question所示,这样做可能会产生您没有想到的后果/副作用。

您应该去所有更高的级别并跳过层的想法,只需将 UITextView 放入视图中,或者去所有较低的级别并将 CATextLayer 放入图层中。请注意,CATextLayer 仅用于绘图,不用于编辑。如果您需要 UITextField 的行为,包括成为第一个响应者的能力(即支持键盘输入),那么更好的解决方案是坚持使用视图。


作为旁注:将视图添加到图层的位置非常糟糕的做法。绘图方法如drawInContext:drawRect:应该用于绘图。这些方法可能会被调用很多很多次,在这种情况下,您最终会在彼此之上添加很多很多视图/层。

于 2014-02-12T14:39:03.810 回答