gpt4 book ai didi

iphone - UIKit:当 subview 增加其宽度超过屏幕边缘时,UIScrollView 自动滚动

转载 作者:太空狗 更新时间:2023-10-30 03:20:44 25 4
gpt4 key购买 nike

在 iPhone 的上下文中:

我有一个包含 UIImageUIScrollView。当用户点击 UIImage 内的屏幕时,将在用户触摸的位置添加一个 UITextField。用户可以编辑此 UITextField,文本字段将根据添加或删除文本自动调整大小。

当正在编辑的 UITextField 增加其宽度时, ScrollView 会自动滚动以显示增加的宽度。

出现问题是因为文本字段的自动滚动不符合屏幕的 y 值

例如,假设用户在图像底部添加了一个文本字段。当他们去编辑该文本字段时,键盘将显示,隐藏文本字段。我有适当的代码来滚动屏幕以显示文本字段。当用户输入太多文本以至于该文本字段超出屏幕边缘时,问题就出现了。发生这种情况时,屏幕会水平滚动以适应更宽的文本,但也会垂直滚动 - 垂直滚动最终会隐藏文本字段,基本上使我为显示文本字段所做的任何操作都无效。

如果文本字段被键盘隐藏,则显示文本字段的代码:

- (void)keyboardWasShown:(NSNotification*)notification
{
NSDictionary* info = [notification userInfo];
CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

self.offset = self.contentOffset;

CGRect frame = self.frame;
// self.activeField is the name of the field that is the current first responder - this just adds a little bit of padding
frame.size.height -= keyboardSize.height + (self.activeField.frame.size.height * 2);

if (!CGRectContainsPoint(frame, self.activeField.frame.origin)) {
CGPoint scrollPoint = CGPointMake(self.offset.x, self.activeField.frame.origin.y - keyboardSize.height + (activeField.frame.size.height * 2));
[self setContentOffset:scrollPoint animated:YES];
}
}

这是增加文本字段大小的代码:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
CGSize stringSize = [string sizeWithFont:textField.font];
CGSize newSize = [newString sizeWithFont:textField.font];

// Make textField wider if we're close to running up against it
if (newSize.width > (textField.frame.size.width - self.widthOffset)) {
CGRect textFieldFrame = textField.frame;
if (stringSize.width > self.widthOffset) {
textFieldFrame.size.width += stringSize.width;
}
textFieldFrame.size.width += self.widthOffset;
textField.frame = textFieldFrame;
}

// Shrink the textField if there is too much wasted space
if ((textField.frame.size.width - newSize.width) > self.widthOffset) {
CGRect textFieldFrame = textField.frame;
textFieldFrame.size.width = newSize.width + self.widthOffset;
textField.frame = textFieldFrame;
}
return YES;
}

问题是:如何让 UIScrollView 在自动滚动时遵守自身的 y 值?

最佳答案

基本上setFrameUIScrollView将重新调整 ScrollView offset ,由 _adjustContentOffsetIfNecessary 完成.由于该方法是私有(private)的且没有记录,因此我们几乎无法猜测调整将如何发生。有两种方法可以停止不必要的滚动或错误 offset正在设置:

1) 重置UIScrollView offset申请后setFrame .如果您正在修改 UIScrollView 的框架,您可以这样做有意地基于一些计算。

CGPoint oldOffset = [scrollView contentOffset];         
scrollView.frame = CGRectMake(newFrame);
[scrollView setContentOffset:oldOffset];

2) 申请offset没有动画的变化。在你的keyboardWasShown , 改变 [self setContentOffset:scrollPoint animated:YES]; to<br/>
[self setContentOffset:scrollPoint animated:NO];

原因:当不止一个offset应用了动画,结果 offset是模棱两可的。这里的内部方法 ( _adjustContentOffsetIfNecessary ) 应用偏移量更改,另一个由您的代码完成。如果您尝试记录在 UIScrollView 中应用的所有偏移量,您会注意到这一点。委托(delegate)方法:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSLog(@" offset: %@", NSStringFromCGPoint(scrollView.conentOffset))
}

如果这有帮助,请告诉我。

关于iphone - UIKit:当 subview 增加其宽度超过屏幕边缘时,UIScrollView 自动滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6238031/

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