21

我有一个 UITextField 子类,我在其中实现以下方法:

- (CGRect)textRectForBounds:(CGRect)bounds {

  return CGRectInset(bounds , 30, 7);
}

-(CGRect) editingRectForBounds:(CGRect)bounds {
  return CGRectInset(bounds , 30, 7);
}

由于这两种方法,UITextField当输入的文本大于 的宽度时, 不会滚动到末尾UITextField。有什么解决办法吗?

4

5 回答 5

12

它不起作用只是因为您声明的文本的字体大小UITextFieldCGRectInset您正在申请的。实际上它应该根据您设置的字体大小。例如,对于 14.0 的字体大小,只需更改您的方法如下:

- (CGRect)textRectForBounds:(CGRect)bounds {
    return CGRectInset(bounds , 30, 6);
}
-(CGRect) editingRectForBounds:(CGRect)bounds {
    return CGRectInset(bounds , 30, 6);
}

原因是文本的绘制矩形。例如,当我们将字体大小设置UITextField为 14.0 时,则它需要至少 18.0 的高度来调整框架中的文本。所以它需要在文本周围额外增加 4 个像素,你可以说它是覆盖框架。因此,在您的情况下,此条件并不令人满意,因为据我猜测您已将字体大小调整为 14.0,默认情况下帧高度UITextField为 30.0,边缘遮罩为每边 7.0,这意味着总共 14.0。因此,您的文本矩形返回 16.0,这反过来又阻止操作系统更新文本框架,因为它位于图形上下文之外。我希望你清楚。如果它解决了您的问题,请接受我的回答。更好的答案如下:

- (CGRect)textRectForBounds:(CGRect)bounds {
return CGRectInset(bounds , 30, (30 - self.font.pointSize - 4)/2);
}

-(CGRect) editingRectForBounds:(CGRect)bounds {
    return CGRectInset(bounds , 30, (30 - self.font.pointSize - 4)/2);
}

享受!

于 2014-06-27T08:30:52.750 回答
4

UITextField CALayer这可能是您的自定义高度与插图与其字体大小之间的冲突。

您可以尝试以下调整之一:

  • 减小字体大小;
  • 增加子类的UITextField高度Storyboard或以编程方式增加子类的高度,例如:

    - (void)drawRect:(CGRect)rect {
        CGRect frameRect = self.frame;
        frameRect.size.height = 35 //specify the height you want;
        self.frame = frameRect;
     }
    
  • 减小 上的 y 坐标值CGRectInset

  • 或用于UIEdgeInsets对每个位置的设置值进行更多控制。就像是:

    - (CGRect)textRectForBounds:(CGRect)bounds{
        UIEdgeInsets contentInsets = UIEdgeInsetsMake(5, 30, 5, 30);
        return UIEdgeInsetsInsetRect(bounds, contentInsets);
    }
    
    - (CGRect)editingRectForBounds:(CGRect)bounds{
        UIEdgeInsets contentInsets = UIEdgeInsetsMake(5, 30, 5, 30);
        return UIEdgeInsetsInsetRect(bounds, contentInsets);
    }
    
于 2014-06-22T06:04:56.563 回答
2

原因 - 您正在为文本字段文本使用固定字体大小。用这个

 textFieldObject.adjustsFontSizeToFitWidth = YES;  

简短而简单。如果你想设置你的最小字体大小,你可以使用这个

 textFieldObject.minimumFontSize

享受

于 2014-06-26T09:23:39.983 回答
0

我不确定这是否是您要查找的内容,但是修改editingRectForBounds以下方式将使插入动态化,因此一旦文本框“满”,它将减少插入,因此文本将填充整个文本框。

假设textInset_是想要的插图:

- (CGRect)editingRectForBounds:(CGRect)bounds {
    CGFloat compensate = .0f;
    CGSize size = [self.text sizeWithFont:self.font];
    CGFloat textboxWidth = CGRectGetWidth(self.width);

    // If size of text plus inset (right side) is bigger
    // than textbox's width, don't set an inset
    if (size.width+textInset_ >= textboxWidth) {
        compensate = 0;
    }

    // If text area (textbox width minus two insets) is less than
    // text size, lessen the inset so the text fits in 
    else if (textboxWidth - textInset_*2 < size.width) {
        compensate = fabs(size.width - (textboxWidth - textInset_));
    }

    // Text fits in textbox WITH insets
    else {
        compensate = textInset_;
    }
    return CGRectInset(bounds, compensate, 10);
}
于 2014-06-26T17:35:13.413 回答
0
step 1 - make a custom text field MyTextField first

@interface MyTextField : UITextField
step 2 - override MyTextField methods as per your requirement

///place holder position

- (CGRect)placeholderRectForBounds:(CGRect)bounds
 {
   return CGRectInset(bounds, 8, 8);
 }
 // text position
 - (CGRect)textRectForBounds:(CGRect)bounds {

  return CGRectInset(bounds, 8,4);
 }

 // text position while editing
 - (CGRect)editingRectForBounds:(CGRect)bounds {

     return CGRectInset(bounds, 8, 4);
 }
step 3- import MyTextField in your controller class & make object of MyTextField

#import "MyTextField.h"

-(void) viewWillAppear:(BOOL)animated {

    MyTextField* textfield1 = [[MyTextField alloc] init];
    // and so on

}

参考此链接:

- (CGRect) textRectForBounds:(CGRect)bounds 没有被调用

于 2014-06-27T11:09:16.217 回答