向UITextField
添加右视图后,我发现它拒绝显示正确的视图和清除按钮(rightViewMode
和clearButtonMode
都设置为{{ 1}})。我看到正确的视图,但不再显示清除按钮。我通过覆盖UITextFieldViewModeAlways
和clearButtonRectForBounds
确保它们不会重叠,但无济于事。如果我使用leftView而不是rightView,则不会出现此类问题,并且会显示左视图和清除按钮。
因此,尽管文档中似乎没有说明,但在我看来,只有在未显示右视图时(以及当text属性不是空字符串时)才会显示clear按钮。这是正确的,有没有人有一个可靠的解决方法?与此同时,我相信我不得不创建一个UIView,在UITextField上覆盖我的正确视图,以获得我从UITextField单独获得的内容。
答案 0 :(得分:14)
你不能同时显示两者,但你可以这样做
UITextField * textfield = [[UITextField alloc] initWithFrame:CGRectMake(10, 100, 300, 40)];
[textfield setBorderStyle:UITextBorderStyleRoundedRect];
UIImageView * imgvw = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"search.jpeg"]];
[imgvw setFrame:CGRectMake(0, 0, 30, 30)];
[textfield setRightView:imgvw];
[textfield setRightViewMode:UITextFieldViewModeUnlessEditing];
[textfield setClearButtonMode:UITextFieldViewModeWhileEditing];
[self.view addSubview:textfield];
答案 1 :(得分:4)
是的,你是对的。 UITextfield具有左右视图等属性。如果您使用清除按钮,它会重叠右视图。
如果叠加视图不与任何其他同级视图重叠,则它会像任何其他视图一样接收触摸事件。如果为视图指定控件,则该控件将照常跟踪和发送操作。但是,如果叠加视图与清除按钮重叠,则清除按钮始终优先于接收事件。默认情况下,右侧叠加视图与清除按钮重叠。
但是就像这个名字所说的那样。因此,您可以创建自己的视图,其上有2个按钮,并设置文本字段的右视图。如果您愿意,可以使用文本字段的委托方法使按钮在视图中显示和消失。
答案 2 :(得分:3)
我有同样的问题,但很容易通过“愚弄”来解决。 UITextField使用LeftView而不是RightView。这样您就可以使用清除按钮和假定的rightView
。您需要做的只是UITextField的子类并返回右上角'在leftViewRectForBounds
中,同样更新editingRectForBounds
和textRectForBounds
。效果很好。
答案 3 :(得分:2)
我会用一些代码备份@strange的答案(使用左视图而不是右视图):
-(CGRect)leftViewRectForBounds:(CGRect)bounds
{
return CGRectOffset([super leftViewRectForBounds:bounds], bounds.size.width - 30, 0);
}
-(CGRect)clearButtonRectForBounds:(CGRect)bounds
{
return CGRectOffset([super clearButtonRectForBounds:bounds], -30, 0);
}
-(CGRect)editingRectForBounds:(CGRect)bounds
{
CGRect rect = bounds;
rect.origin.x = 10;
rect.size.width -= 60;
return rect;
}
-(CGRect)textRectForBounds:(CGRect)bounds
{
CGRect rect = bounds;
rect.origin.x = 10;
rect.size.width -= 60;
return rect;
}
请注意,我的右(左)视图宽度为30。
如果你碰巧同时使用左右视图和清除按钮,那么这个解决方案显然不会起作用。在这种情况下,您将不得不放弃使用其中一个,并使用放在UITextField旁边的单独视图。