我发现UITextField存在问题。我创建了一个uitexfield的子类,允许用户单击文本开始编辑,然后旋转并调整文本大小。
如果通过使高度变大来调整文本字段的大小,则即使文本字段的宽度不增加,居中文本也会向右移动。我对此进行了调查,发现uitextfield有一个UIFieldEditor类型的内部视图,后者又有一个_UIFieldEditorContentView视图。 UIFieldEditor似乎是UIScrollView的子类,并且此scrollview的内容大小远大于uitextview的大小。当textview增加它的高度时,scrollview内容大小增加。我想这可能是内部自动布局问题。
我在这里添加了一个演示项目,演示了这个问题。点击文本开始编辑,然后拖动调整大小图标以使高度增加,您将看到问题。
https://github.com/permagnus/UITextField-Resize-Issue-Demo
来自revealapp的屏幕截图:
滚动视图中基础视图的大小不正确:https://github.com/permagnus/UITextField-Resize-Issue-Demo/blob/master/Screenshots/screenshot-showing-incorrect-size.png
uitextfield的实际大小:https://github.com/permagnus/UITextField-Resize-Issue-Demo/blob/master/Screenshots/screenshot-showing-textfield-size.png
有关如何解决此问题的任何想法?
答案 0 :(得分:3)
我找到了两种解决问题的方法:
问题在于底层的scrollview。一种方法是找到滚动视图,并查看它有多少,并补偿错误的偏移量:
- (CGRect)editingRectForBounds:(CGRect)bounds
{
CGRect editRect = [super editingRectForBounds:bounds];
UIScrollView *scrollView = [self findScrollViewFromView:self];
if(scrollView)
{
float diff = (self.bounds.size.width - scrollView.contentSize.width)/2;
return CGRectInset(editRect, diff, 0);
}
return editRect;
}
- (UIScrollView *)findScrollViewFromView:(UIView *)view
{
if([view isKindOfClass:[UIScrollView class]])
{
return (UIScrollView *) view;
}
for(UIView *v in view.subviews)
{
UIScrollView *scrollView = [self findScrollViewFromView:v];
if(scrollView)
{
return scrollView;
}
}
return nil;
}
我还联系了Apple支持部门以了解他们的问题。他们证实这可能是一个错误,我已将其作为一个提交。他们的解决方案如下:
字段编辑器仅针对当前编辑会话激活,因此您可以 结束文本字段的编辑会话(通过调用 resignFirstResponder)在调整大小之前(在touchesBegan中......?)。在 你的场景,我想保持编辑会话可能不会 必要的。
如果你真的需要保持编辑会话,一个解决方案(丑陋)我 可以看到是重置文本并确保光标位于 文件开头:
self.text = [self.text copy];
UITextPosition *beginningOfDocument = [self positionFromPosition:self.beginningOfDocument offset:0];
self.selectedTextRange = [self textRangeFromPosition:self.beginningOfDocument toPosition:beginningOfDocument];
这两种解决方案都是糟糕的黑客,不推荐使用,因此您自行承担风险:)