禁用 UITextField 时如何在 leftView/rightView 中启用点击?

Posted

技术标签:

【中文标题】禁用 UITextField 时如何在 leftView/rightView 中启用点击?【英文标题】:How to enable tap in leftView/rightView when UITextField disabled? 【发布时间】:2016-02-29 13:53:42 【问题描述】:

我有一个UITextField,我在rightView 中添加了一张图片。我已向此 rightView 添加了一个手势,我希望在禁用 UITextField 时使其工作,因为此视图仅在未编辑时显示。

这是我想要实现的图像示例:

leftView 只是一个空白区域; rightView 只有图像。

这是用于将外观应用到UITextField 并将图像应用到rightView 的代码:

- (void)applyAppearanceToTextField:(UITextField *)textField withRoundingCorner:(UIRectCorner)corner withIcon:(NSString *)icon 
    CAShapeLayer *shape = [[CAShapeLayer alloc] initWithLayer:textField.layer.mask];
    UIBezierPath *shadow = [UIBezierPath bezierPathWithRoundedRect:textField.bounds byRoundingCorners:corner cornerRadii:CGSizeMake(5, 5)];
    shape.path = shadow.CGPath;
    textField.layer.mask = shape;

    // Apply space to the left as a padding
    [textField setLeftView:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, textField.bounds.size.height)]];
    [textField setLeftViewMode:UITextFieldViewModeAlways];

    // Add the icon image to the right view
    CGFloat height = textField.bounds.size.height;
    UIImage *image = [UIImage imageWithIcon:icon backgroundColor:[UIColor clearColor] iconColor:[UIColor grayColor] andSize:CGSizeMake(height / 2, height / 2)];
    image = [UIImage imageWithCGImage:image.CGImage scale:image.scale orientation:UIImageOrientationUpMirrored];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    [imageView setBounds:CGRectMake(5, 0, image.size.width, image.size.width)];
    [imageView setUserInteractionEnabled:YES];
    [textField setRightView:imageView];
    [textField setRightViewMode:UITextFieldViewModeUnlessEditing];
    [textField.rightView setExclusiveTouch:YES];

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleIconTap:)];
    [textField.rightView addGestureRecognizer:tapGesture];


- (void)handleIconTap:(UITapGestureRecognizer *)gesture 
    NSLog(@"handleIconTap");

viewDidLoad 中,我检查该字段是否已填写,因此该字段被禁用。当UITextField被禁用时,如何在leftView/rightView中启用点击?

【问题讨论】:

嗨,请放一些代码或图像以便更好地理解... @ilesh 更详细地编辑了问题。 【参考方案1】:

我建议这样做:

您可以在 View 中嵌入 TextField 和 UIButton(或 UIImage,如果需要),并为您的 View 设置颜色和角半径

【讨论】:

【参考方案2】:

我使用默认的 UITextField 组件解决了这个问题。我创建了一个布尔属性来处理是否应该启用字段的值,该字段设置为viewDidLoad

isEditEnabled = (self.myTextField.text != nil && self.myTextField.text.lenght > 0);

然后,我实现textFieldShouldBeginEditing 以在单击此UITextField 时返回isEditEnabled 的值,实现textFieldDidBeginEditing 将textField 的backgroundColor 设置为白色并实现textFieldDidEndEditing 以设置backgroundColor如果 myTextField 已填充,则设置为深灰色并设置 isEditEnabled = NO。代码如下:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
    if (textField == self.myTextField) 
        return isEditEnabled;
    
    return YES;


- (void)textFieldDidBeginEditing:(UITextField *)textField 
    textField.backgroundColor = [UIColor whiteColor];
    activeField = textField;


- (void)textFieldDidEndEditing:(UITextField *)textField 
    if (textField.text != nil && textField.text.length > 0) 
        if (textField == self.myTextField) 
            textField.backgroundColor = [UIColor colorWithWhite:0.80f alpha:1.0f];
            isEditEnabled = NO;
        
     else 
        textField.backgroundColor = [UIColor whiteColor];
        if (textField == self.url) 
            isEditEnabled = YES;
        
    
    activeField = nil;

这样,我的目标是始终启用 leftView 和 rightView 以进行点击。

【讨论】:

以上是关于禁用 UITextField 时如何在 leftView/rightView 中启用点击?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift iOS 中禁用 UITextField 双击或长按? [复制]

在 UITextField 中禁用“定义”

禁用 UITextField 的自动更正

UITextField如何禁用粘贴? [复制]

如何禁用 UITextField 的编辑属性? [复制]

UITextField 具有焦点时未禁用 UIButton