在子类中实现textRectForBounds和editingRectForBounds后,UITextField不会滚动到结尾?

时间:2013-09-24 15:09:11

标签: ios objective-c uitextfield

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

- (CGRect)textRectForBounds:(CGRect)bounds {

  return CGRectInset(bounds , 30, 7);
}

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

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

5 个答案:

答案 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;

  • 上的y坐标值
  • 或使用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