【问题标题】:Displaying both a right view and a clear button in UITextField在 UITextField 中同时显示右视图和清除按钮
【发布时间】:2012-08-03 12:49:37
【问题描述】:

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

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

【问题讨论】:

    标签: iphone ios uitextfield


    【解决方案1】:

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

    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];
    

    【讨论】:

    • 很好的答案!
    【解决方案2】:

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

    形成苹果文档http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UITextField_Class/Reference/UITextField.html

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

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

    【讨论】:

    • 文档似乎具有误导性。并不是说清除按钮和右视图是相互排斥的。它只说它们重叠。这使得如果我使用透明视图,我会看到清除按钮。然而事实并非如此。
    【解决方案3】:

    我遇到了同样的问题,但通过“欺骗”UITextField 使用 LeftView 而不是 RightView 很容易解决。这样你就可以使用清除按钮和你假设的rightView。您需要做的就是继承 UITextField 并在leftViewRectForBounds 中返回“右角”,并同样更新editingRectForBoundstextRectForBounds。完美运行。

    【讨论】:

    • 我发现添加一个子视图并覆盖editingRectForBounds/textRectForBounds 来避免它更容易。不需要使用leftView(因为我总是希望我的子视图显示。)
    • 如果你想添加一些示例代码,我会给你一个upvote :)
    • 运行良好,但我也必须覆盖 placeholderRectForBounds 以使其正常运行。
    【解决方案4】:

    我会用一些代码来支持@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 旁边的单独视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多