在UITextField中显示右视图和清除按钮

时间:2012-08-03 12:49:37

标签: iphone ios uitextfield

UITextField添加右视图后,我发现它拒绝显示正确的视图和清除按钮(rightViewModeclearButtonMode都设置为{{ 1}})。我看到正确的视图,但不再显示清除按钮。我通过覆盖UITextFieldViewModeAlwaysclearButtonRectForBounds确保它们不会重叠,但无济于事。如果我使用leftView而不是rightView,则不会出现此类问题,并且会显示左视图和清除按钮。

因此,尽管文档中似乎没有说明,但在我看来,只有在未显示右视图时(以及当text属性不是空字符串时)才会显示clear按钮。这是正确的,有没有人有一个可靠的解决方法?与此同时,我相信我不得不创建一个UIView,在UITextField上覆盖我的正确视图,以获得我从UITextField单独获得的内容。

4 个答案:

答案 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具有左右视图等属性。如果您使用清除按钮,它会重叠右视图。

表格Apple doc http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UITextField_Class/Reference/UITextField.html

  

如果叠加视图不与任何其他同级视图重叠,则它会像任何其他视图一样接收触摸事件。如果为视图指定控件,则该控件将照常跟踪和发送操作。但是,如果叠加视图与清除按钮重叠,则清除按钮始终优先于接收事件。默认情况下,右侧叠加视图与清除按钮重叠。

但是就像这个名字所说的那样。因此,您可以创建自己的视图,其上有2个按钮,并设置文本字段的右视图。如果您愿意,可以使用文本字段的委托方法使按钮在视图中显示和消失。

答案 2 :(得分:3)

我有同样的问题,但很容易通过“愚弄”来解决。 UITextField使用LeftView而不是RightView。这样您就可以使用清除按钮和假定的rightView。您需要做的只是UITextField的子类并返回右上角'在leftViewRectForBounds中,同样更新editingRectForBoundstextRectForBounds。效果很好。

答案 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旁边的单独视图。