如何停止UITextView的底部边缘插图从重置为32?

问题描述

| 我有一个全屏UITextView,每当出现键盘时它都会变小,以使键盘不会覆盖任何文本。作为此过程的一部分,我还更改了textView的底部contentInset,因此,当存在键盘时,文本下方的空间较小,而当没有键盘时,文本下方的空间较大。 问题是,每当用户点击底部附近的textView开始编辑时,底部contentInset都会自发地将其自身重置为32。我从此答案中知道,可以继承UITextView并重写
contentInset
方法,如下所示:
@interface BCZeroEdgeTextView : UITextView
@end

@implementation BCZeroEdgeTextView

- (UIEdgeInsets) contentInset 
  { 
  return UIEdgeInsetsZero; 
  }

@end
但这并不能阻止底部插图自身重新设置-只是更改了它自己重新设置的数字。如何使UITextView保持设置的contentInset值?     

解决方法

为了使其保持设置的值,您可以使用子类路线,但返回自己的属性的值而不是常量,如下所示:
@interface BCCustomEdgeTextView : UITextView
@property (nonatomic,assign) UIEdgeInsets myContentInset;
@end

@implementation BCCustomEdgeTextView

@synthesize myContentInset;

- (UIEdgeInsets) contentInset { 
    return self.myContentInset; 
}

@end
但请注意,UITextView将其底部的contentInset重置为32的原因是,更标准的插入将切断自动补全弹出窗口等。     ,这是我的解决方案,但要长一些:
- (void)setCustomInsets:(UIEdgeInsets)theInset
{
    customInsets = theInset;
    self.contentInset = [super contentInset];
    self.scrollIndicatorInsets = [super scrollIndicatorInsets];
}

- (void)setContentInset:(UIEdgeInsets)theInset
{
    [super setContentInset:UIEdgeInsetsMake(
        theInset.top + self.customInsets.top,theInset.left + self.customInsets.left,theInset.bottom + self.customInsets.bottom,theInset.right + self.customInsets.right)];
}

- (void)setScrollIndicatorInsets:(UIEdgeInsets)theInset
{
    [super setScrollIndicatorInsets:UIEdgeInsetsMake(
        theInset.top + self.customInsets.top,theInset.right + self.customInsets.right)];
}
子类
UITextView
并添加属性
customInsets
,每当需要设置
contentInset
scrollIndicatorInsets
时,都应设置
customInsets
。