我有一个UITextField子类,我正在实现以下方法:
- (CGRect)textRectForBounds:(CGRect)bounds {
return CGRectInset(bounds , 30, 7);
}
-(CGRect) editingRectForBounds:(CGRect)bounds {
return CGRectInset(bounds , 30, 7);
}
由于这两种方法,当输入的文字大于UITextField
的宽度时,UITextField
不会滚动到结尾。这有什么解决方案吗?
答案 0 :(得分:12)
它不起作用仅仅是因为您在UITextField
中声明的文本的字体大小以及您正在应用的CGRectInset
。实际上它应该是你设置的字体大小。例如,对于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);
}
享受!
答案 1 :(得分:4)
这可能是您的自定义UITextField
CALayer
高度与插图及其字体大小之间的冲突。
您可以尝试其中一项调整:
在UITextField
上增加Storyboard
高度,或在您的子类中以编程方式增加:{/ p>
- (void)drawRect:(CGRect)rect {
CGRect frameRect = self.frame;
frameRect.size.height = 35 //specify the height you want;
self.frame = frameRect;
}
降低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);
}
答案 2 :(得分:2)
原因 - 您对文本字段文本使用固定字体大小。 使用此
textFieldObject.adjustsFontSizeToFitWidth = YES;
简短而简单。如果要设置最小字体大小,可以使用此
textFieldObject.minimumFontSize
享受
答案 3 :(得分: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);
}
答案 4 :(得分: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 not being called