如何在CALayer中使用UITextField?

时间:2012-06-13 17:00:39

标签: ios uitextfield

我想在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];
}

任何想法,建议,良好的实践:)?

2 个答案:

答案 0 :(得分:0)

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

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

以下是它在Quartz Composer中的表现(使用Cocoa,而不是Cocoa Touch)

Quartz Composer in editing mode

答案 1 :(得分:0)

  

良好的实践:)?

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

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


作为旁注:地点将视图添加到图层中非常糟糕练习。 drawing 应使用drawInContext:drawRect:等绘图方法。这些方法可能被多次调用,在这种情况下,最终会有许多视图/层被添加到彼此之上。