当UITextField成为第一响应者时,禁用UIScrollView滚动

Rab*_*bih 60 iphone uiscrollview uitextfield

UITextField嵌入在a中的a UIScrollView成为第一响应者时,通过让用户输入某个字符,UIScrollView自动滚动到该字段,有没有办法禁用它?

复制rdar:// 16538222 over

Luk*_*uke 62

以Moshe的答案为基础......

子类UIScrollView并覆盖以下方法:

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated
Run Code Online (Sandbox Code Playgroud)

把它留空.任务完成!

  • 这意味着如果您希望手动执行任何操作,ScrollRectToVisible方法将无法使用.如果您不想这样做,这是一个很好的解决方案. (5认同)
  • 很容易解决.谢谢! (3认同)
  • 简单而优雅的解决方案。干杯!! (2认同)

Tak*_*ano 56

我一直在努力解决同样的问题,最后我找到了解决方案.

我已经研究了如何通过跟踪调用跟踪来完成自动滚动,[UIFieldEditor scrollSelectionToVisible]并发现在输入字母时调用内部函数UITextField.这种方法似乎作用于UIScrollView最近的祖先UITextField.

所以,对textFieldDidBeginEditing,通过包装的UITextField一个新的UIScrollView与它相同的尺寸(即,在插入视图之间UITextField,它是上海华盈),这将阻止自动滚动.最后删除此包装textFieldDidEndEditing.

代码如下:

- (void)textFieldDidBeginEditing:(UITextField*)textField {  
    UIScrollView *wrap = [[[UIScrollView alloc] initWithFrame:textField.frame] autorelease];  
    [textField.superview addSubview:wrap];  
    [textField setFrame:CGRectMake(0, 0, textField.frame.size.width, textField.frame.size.height)]; 
    [wrap addSubview: textField];  
}  

- (void)textFieldDidEndEditing:(UITextField*)textField {  
  UIScrollView *wrap = (UIScrollView *)textField.superview;  
  [textField setFrame:CGRectMake(wrap.frame.origin.x, wrap.frame.origin.y, wrap.frame.size.width, textField.frame.size.height)];
  [wrap.superview addSubview:textField];  
  [wrap removeFromSuperview];  
}  
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 这适用于使用iOS 5.1的任何人吗?我似乎无法获得工作的诀窍! (3认同)
  • 天啊.Taketo,非常感谢你!还有Rabih,非常感谢!我永远不会想到这一点.如果可以的话,我会给这100个赞成票. (2认同)

ton*_*nso 8

我有同样的问题,禁用自动滚动的UITextView单元格UITableView.我能够使用以下方法解决它:

@interface MyTableViewController : UITableViewController<UITextViewDelegate>

@implementation MyTableViewController {
    BOOL preventScrolling;
    // ...
}

// ... set self as the delegate of the text view

- (void)textViewDidBeginEditing:(UITextView *)textView {
    preventScrolling = YES;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (preventScrolling) {
        [self.tableView setContentOffset:CGPointMake(0, -self.tableView.contentInset.top) animated:NO];
    }
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    preventScrolling = NO;
}
Run Code Online (Sandbox Code Playgroud)

scrollViewWillBeginDragging当用户自己启动滚动时,定义用于恢复默认滚动行为.


dan*_*etl 7

正如Taketo所提到的,当a UITextField成为第一响应者时,其第一个类型UIScrollView(如果存在)的父视图被滚动以使其UITextField可见.最简单的方法是简单地将每个UITextField包装在一个UIScrollView(或者理想情况下,将所有UITextField 包装在一个虚拟中UIScrollView).这与Taketo的解决方案非常相似,但它应该会给你稍微好一点的性能,并且它会使我的代码(或Interface Builder中的界面)更加清晰.


Mos*_*she 0

我不知道有任何属性UIScrollView可以实现这一点。恕我直言,如果能够禁用它,用户体验会很差。

也就是说,可以子类化UIScrollView并重写它的一些方法,以UITextfield在滚动之前检查它是否不是第一响应者。