当UITextField被添加到UIScrollview中时,滚动视图会自动调整其contentOffset,这样视图就不会被键盘遮挡。
我有一个定制的UIControl,当它通过分配它的inputView属性成为第一个响应者时,它也会显示一个键盘。相同的滚动行为不起作用。是否有一种方法来配置UIControl,使滚动视图在显示键盘时保持其可见?
我的猜测是,通过重写在协议UITextField和其他类中定义的属性,这种行为是可能的。但这可能是个迷宫。还要注意,这里的问题与滚动视图的contentInset属性无关。滚动视图可以滚动以显示自定义控件,只是当控件成为第一个响应程序时,它不会自动执行。
发布于 2014-11-24 17:58:15
看起来,这是由苹果利用[UIFieldEditor scrollSelectionToVisible]的内部私有方法处理的,正如在这个博客中所指出的:http://sugarrushva.my03.com/712423-disable-uiscrollview-scrolling-when-uitextfield-becomes-first-responder.html
它似乎是通过在视图层次结构中向上移动来做到这一点的,如果它找到了一个父UIScrollView,它会滚动该视图以将UITextField带入可见视图。当自定义控件成为第一个响应程序时,您需要手动实现滚动,或者通过内省父视图来处理它。
发布于 2014-11-24 18:57:09
我被“神射手”指向了正确的方向。
基于此,下面是我在控件中所写的内容,以获得所需的行为:
- (BOOL)becomeFirstResponder {
if ([super becomeFirstResponder]) {
[self scrollParentViewToFrame];
return YES;
}
return NO;
}
- (void)scrollParentViewToFrame {
UIScrollView *scrollView = self.parentScrollView;
CGRect frame = [scrollView convertRect:self.bounds fromView:self];
[self.parentScrollView scrollRectToVisible:frame animated:YES];
}
- (UIScrollView *)parentScrollView {
return (UIScrollView *) [self closestParentWithClass:[UIScrollView class]];
}注意,如果控件不是滚动视图的直接后代,则不使用frame属性。相反,将边界转换为滚动视图的坐标空间。
在调用[super becomeFirstResponder]使其与用于调整滚动视图内嵌的键盘通知进行适当交互之后,还需要执行滚动调整。
我定义了在UIView类别中搜索最近的父滚动视图的方法,这使得递归搜索层次结构变得更容易。
- (UIView *)closestParentWithClass:(Class)class {
if ([self isKindOfClass:class]) {
return self;
}
// Recursively searches up the view hierarchy, returns nil if a view
// has no superview.
return [self.superview closestParentWithClass:class];
}https://stackoverflow.com/questions/27109498
复制相似问题