13

向 a 添加右视图后UITextField,我发现它拒绝显示右视图和清除按钮(同时具有rightViewModeclearButtonMode设置为UITextFieldViewModeAlways)。我看到了正确的视图,但清除按钮不再显示。我通过覆盖clearButtonRectForBoundsand确保它们不会重叠clearButtonRectForBounds,但无济于事。如果我使用 leftView 而不是 rightView,则不会发生此类问题,并且会显示左视图和清除按钮。

因此,尽管文档中似乎没有说明,但在我看来,清除按钮仅在未显示正确视图时(并且当 text 属性不是空白字符串时)才显示。这是正确的,有没有人有可靠的解决方法?与此同时,我相信我不得不创建一个 UIView,将我的右视图覆盖在 UITextField 之上,以便获得我虽然只能从 UITextField 获得的东西。

4

4 回答 4

15

你不能同时显示两者,但你可以这样做

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];
于 2013-11-04T10:35:04.817 回答
4

是的你是对的。UITextfield 具有左右视图等属性。如果您使用清除按钮,它会与右视图重叠。

表单 Apple 文档http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UITextField_Class/Reference/UITextField.html

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

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

于 2012-08-03T12:58:33.810 回答
3

我有同样的问题,但通过“欺骗”UITextField 使用 LeftView 而不是 RightView 很容易解决。这样你就可以同时使用 clear 按钮和你应该的rightView. 您需要做的就是继承 UITextField 并返回“右角”leftViewRectForBounds并类似地​​更新editingRectForBoundstextRectForBounds. 完美运行。

于 2014-03-18T14:06:21.897 回答
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 旁边的单独视图。

于 2016-05-19T15:29:08.577 回答