gpt4 book ai didi

ios - ScrollView contentoffset 被重置

转载 作者:可可西里 更新时间:2023-11-01 05:15:16 24 4
gpt4 key购买 nike

长期以来,我一直在为 UIScrollView 的问题而苦苦挣扎。

我有一个 UIScrollVIew,它包含一个 UITextView 作为 subview 。当我选择 TextView 时,会弹出一个键盘。我想调整 TextView 的大小以完全适合可用空间,并滚动 ScrollView 以便 TextView 正好位于可见空间中(不被键盘隐藏)。

当键盘出现时,我调用一个方法来计算 TextView 的适当大小,然后执行以下代码:

[UIView animateWithDuration:0.3 
animations:^
{
self.textView.frame = frame;
}
];

[self.scrollView setContentOffset:CGPointMake(0,frame.origin.y) animated:YES];

(这里的框架是适合 TextView 的框架)。

不幸的是, ScrollView 并不总是滚动到正确的位置,尤其是当我选择 TextView 时它已经处于非零垂直内容偏移的情况下。我知道我设置的内容偏移量是正确的。

经过大量测试,我终于意识到发生的事情是动画完成后, ScrollView 又自动滚动了。

此代码确实有效:

UIView animateWithDuration:0.3 
animations:^
{
self.textView.frame = frame;
}
completion:^(BOOL finished) {
[self.scrollView setContentOffset:CGPointMake(0, frame.origin.y) animated:YES];
}
];

但它看起来很奇怪,因为 ScrollView 滚动到错误的位置,然后滚动到正确的位置。

有谁知道当 TextView 框架完成其动画时如何防止 ScrollView 更改其内容偏移量?

我正在使用 iOS 5.0 进行测试。


这是我发现有效的解决方案。我仍然不完全了解发生了什么,可能与我的 Spring 和支柱的设置方式有关。基本上,我将 ScrollView 内容大小缩小到与 TextView 缩小相同的数量。

- (void)keyboardDidShow:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];

// Get the height of the keyboard
CGRect kbRect = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
kbRect = [self.view convertRect:kbRect fromView:nil];
CGSize kbSize = kbRect.size;

// Adjust the height of the text view to fit in the visible view
CGRect frame = self.textView.frame;
int visibleHeight = self.view.frame.size.height;
visibleHeight -= kbSize.height;
frame.size.height = visibleHeight;

// Get the new scroll view content size
CGSize contentSize = self.scrollView.contentSize;
contentSize.height = contentSize.height - self.textView.frame.size.height + frame.size.height;

[UIView animateWithDuration:0.1
animations:^
{
self.textView.frame = frame;
// Note that the scroll view content size needs to be reset, or the scroll view
// may automatically scroll to a new position after the animation is complete.
self.scrollView.contentSize = contentSize;
[self.scrollView setContentOffset:CGPointMake(0, frame.origin.y) animated:YES];
}
];

// Turn off scrolling in scroll view
self.scrollView.scrollEnabled = NO;
}

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
// Update the view layout
[UIView animateWithDuration:0.3 animations:^
{
self.scrollView.contentOffset = CGPointZero;
[self updateViewLayout];
}
];

// Turn on scrolling in the scroll view
self.scrollView.scrollEnabled = YES;
}

([self updateViewLayout] 是一种将 TextView 返回到正确高度、重置 ScrollView 内容大小以及确保所有其他 subview 都正确定位的方法)。

最佳答案

不要调整 TextView 的框架。您需要做的就是滚动 ScrollView 。如果滚动 scrollview 动画,则 textView 将向上滑动动画。只需执行以下操作:

[self.scrollView setContentOffset:CGPointMake(0, frame.origin.y) animated:YES];

如果您需要 ScrollView 以特定速率滚动,则手动调整动画 block 中的内容偏移量。(我还没有测试过这个,您可能需要调整动画标志,或者单步执行内容偏移量如果这不起作用,一次一个像素)

[UIView animateWithDuration:0.3f 
animations:^{
[self.scrollView setContentOffset:CGPointMake(0, frame.origin.y) animated:YES];
} ];

关于ios - ScrollView contentoffset 被重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9271391/

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