Hen*_*olm 9 iphone objective-c uiscrollview ios ios7
[self.scrollView scrollRectToVisible:rect animated:YES];
Run Code Online (Sandbox Code Playgroud)
有没有人知道为什么这在iOS6.1和iOS7.0上完全正常工作总是滚动到已成为firstResponder的UITextField,无论我作为参数发送什么样的矩形?
CGRect rect = CGRectMake(0, self.scrollView.frame.size.height - 1, 320, 1);
[self.scrollView scrollRectToVisible:rect animated:YES];
Run Code Online (Sandbox Code Playgroud)
由于UIScrollView内部的UITextField已经成为iOS6.1上的第一响应者,但是在iOS7.0.4上滚动它以便UITextFiled可见,此代码将在显示键盘时将UIScrollView滚动到底部.
正如我想的那样,iOS7 SDK中的UIScrollView无论如何,当scrollRectToVisible:animated:被调用时,自动滚动到内部的第一个响应者.
Mis*_*cha 10
我怀疑大多数开发人员正在使用scrollRectToVisible:Animated:系统键盘通知,如Apple Docs中所述.对我来说,Apple提供的示例代码不起作用(好吧,只有一半是这样的).
将方法调用放在调度块中为我解决了问题:
dispatch_async(dispatch_get_main_queue(), ^{
[self.scrollView scrollRectToVisible:rect animated:YES];
});
Run Code Online (Sandbox Code Playgroud)
我不完全理解为什么这样做有效,而且我不确定这是否100%安全,但另一方面它感觉比仅仅延迟0.1秒的呼叫更安全,正如Rikkles在另一个回答中所建议的那样.
我不是线程问题的专家(但是)但似乎任何隐藏的系统方法都覆盖滚动行为已经在主队列UIKeyboardDidShowNotification发送时已经存在.因此,如果我们将方法调用放在主队列上,它将在之后执行,从而产生所需的效果.(但这只是猜测.)
在iOS 8(可能还有7)上,操作系统在runloop操作的尾端自动滚动到UITextField,就在它返回到监听用户输入之前.在OS自动滚动之后和用户输入之前,我没有找到任何方法进入.既UIKeyboardWillShowNotification不会也UIKeyboardDidShowNotification不会挂钩.
然而,总是有效的是延迟后执行选择器的好老把戏.只需将滚动代码放在自己的方法中,然后调用该方法:
- (void)keyboardDidShow:(NSNotification*)aNotification {
// ... all code to choose the view you want ...
[self performSelector:@selector(moveToView:) withObject:visibleView afterDelay:0.1];
}
- (void)moveToView:(UIView *)aView {
[self.scView scrollRectToVisible:aView.frame animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
这将在操作系统自动滚动后运行,而你是金色的.
我以前遇到过这个问题。这不是一件容易的事,但肯定很无聊。
这是因为我将 contentSize 设置为 0 (因为你不希望它滚动)。并且您应该至少设置 1。
[scrollView setContentSize: CGSizeMake(1, self.view.frame.size.height)];
Run Code Online (Sandbox Code Playgroud)
我希望这是解决方案;)
| 归档时间: |
|
| 查看次数: |
15820 次 |
| 最近记录: |