gpt4 book ai didi

ios - iOS 8 中具有动态高度的自定义 inputView

转载 作者:技术小花猫 更新时间:2023-10-29 11:14:30 25 4
gpt4 key购买 nike

我的 UITextFields 自定义 inputView 有一些问题。根据用户需要在 UITextField 中输入的文本,inputView 仅显示所需的字母。这意味着对于短文本,只有一行字母的 inputView 就足够了,较长的文本可能需要 2 甚至 3 行,因此 inputView 的高度是可变的。

因为我期待更好的性能,所以只有一个 inputView 实例供每个 textField 使用。这样创建必须只发生一次,它使有时需要直接访问 inputView 更容易。 inputView 在 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 中设置,设置其所需的高度并将显示。

这很完美,但不适用于 iOS8。某些包含 inputView 的系统 View 在更改时不会更新其框架以匹配 inputView 的边界(第一次有效)。

我知道可以通过为每个 textField 使用我的 inputView 的一个实例来解决这个问题。但我想问是否有推荐/更好的方法来调整框架或将其更改报告给包含 View 。也许这是一个 iOS8 错误,可以在发布之前修复?

下面是重现问题的一些示例代码:

自定义输入 View

@implementation CustomInputView

+ (CustomInputView*)sharedInputView{
static CustomInputView *sharedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[CustomInputView alloc] init];
});
return sharedInstance;
}

- (id)init
{
self = [super init];
if (self) {
self.backgroundColor = [UIColor greenColor];
}
return self;
}

- (void)setupForTextField:(UITextField*)textField{
CGFloat height;

if(textField.tag == 1){
height = 100;
}else height = 50;

self.frame = CGRectMake(0, 0, 320, height);
}
@end

TestViewController代码

- (void)viewDidLoad
{
[super viewDidLoad];

UITextField *tf = [[UITextField alloc] initWithFrame:CGRectMake(15, 50, 290, 30)];
tf.text = @"bigKeyboard";
tf.inputView = [CustomInputView sharedInputView];
tf.layer.borderWidth = 1;
tf.layer.borderColor = [UIColor lightGrayColor].CGColor;
tf.delegate = self;
tf.tag = 1;
[self.view addSubview:tf];

tf = [[UITextField alloc] initWithFrame:CGRectMake(15, 100, 290, 30)];
tf.text = @"smallKeyboard";
tf.inputView = [CustomInputView sharedInputView];
tf.layer.borderWidth = 1;
tf.layer.borderColor = [UIColor lightGrayColor].CGColor;
tf.delegate = self;
tf.tag = 2;
[self.view addSubview:tf];

UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button setTitle:@"dismissKeyboard" forState:UIControlStateNormal];
[button addTarget:self action:@selector(endEditing) forControlEvents:UIControlEventTouchUpInside];
button.frame = CGRectMake(15, 150, 290, 30);
[self.view addSubview:button];
}

- (void)endEditing{
[self.view endEditing:YES];
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
[[CustomInputView sharedInputView] setupForTextField:textField];
return YES;
}

最佳答案

我在调整从 iOS 8 到 iOS 10 的自定义键盘大小时遇到​​了类似的问题。我认为正确的解决方案是让输入 View 提供适当的 intrinsicContentSize 并更改(并使该值无效!)当你想改变 View 的高度时。示例代码:

class CustomInputView: UIInputView {
var intrinsicHeight: CGFloat = 200 {
didSet {
self.invalidateIntrinsicContentSize()
}
}

init() {
super.init(frame: CGRect(), inputViewStyle: .keyboard)
self.translatesAutoresizingMaskIntoConstraints = false
}

required init?(coder: NSCoder) {
super.init(coder: coder)
self.translatesAutoresizingMaskIntoConstraints = false
}

override var intrinsicContentSize: CGSize {
return CGSize(width: UIViewNoIntrinsicMetric, height: self.intrinsicHeight)
}
}

class ViewController: UIViewController {
@IBOutlet weak var textView: UITextView!

override func viewDidLoad() {
super.viewDidLoad()

textView.becomeFirstResponder()

let inputView = CustomInputView()
// To make the view's size more clear.
inputView.backgroundColor = UIColor(red: 0.5, green: 1, blue: 0.5, alpha: 1)
textView.inputView = inputView

// To demonstrate a change to the view's intrinsic height.
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(2)) {
inputView.intrinsicHeight = 400
}
}
}

另见 https://stackoverflow.com/a/40359382/153354 .

关于ios - iOS 8 中具有动态高度的自定义 inputView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24756018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com