UIScrollView无法正常工作

时间:2011-06-08 12:08:10

标签: iphone objective-c

我有一个在界面构建器中创建的视图窗口。我创建了一个UIScrollView,它填充整个窗口并将其他一些项目拖入其中,包括UITextView。我遇到的问题是,当我单击写入TextView时,键盘会阻止TextView的视图,因此使用ScrollView。

现在我已经搜索了很多,并认为我知道我需要做什么,但如果我做得对,那是另一回事。

我得到反弹,也就是说我可以拖动ScrollView中的所有东西,它会反弹回来。当我按下在TextView中写入键盘弹出时,这会将ScrollView缩小为“屏幕大小” - “键盘大小”(我知道这是因为我没有实现“执行此操作一旦我隐藏键盘”功能但是,当我隐藏键盘时,ScrollView现在会在键盘启动的地方结束。但即使视图大小现在小于内容大小,它也不会滚动,只是继续反弹。

下面你可以看到我正在使用的代码。我在viewDidLoad中调用了registerForKeyboardNotifications。

// Call this method somewhere in your view controller setup code.
- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWasShown:)
                                                 name:UIKeyboardDidShowNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillBeHidden:)
                                                 name:UIKeyboardWillHideNotification object:nil];

}

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification *)n
{
    NSLog(@"WoopWoopWoop");

    NSDictionary* userInfo = [n userInfo];

    // get the size of the keyboard
    CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    // resize the noteView
    CGRect viewFrame = self.mainScrollView.frame;

    viewFrame.size.height -= (keyboardSize.height);

    mainScrollView.bounces = YES;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.4];
    [self.mainScrollView setFrame:viewFrame];
    [UIView commitAnimations];
}

我尝试将内容视图设置为任意大小,例如

[mainScrollView setContentSize:CGSizeMake(3200.0,2300.0)];

但这没有效果......

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

嗨,您不需要使用通知。只需使用UITextFieldDelegate协议方法即可。您可以在这些方法中为scrollView设置内容偏移量。

例如:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    //Check the necessary textfield and then change yValue accordingly
    [scrollView setContentOffset:CGPointMake(0,yValue) animated:YES];
    return YES;
}

答案 1 :(得分:1)

  

当我单击写入TextView时,键盘会阻止TextView的视图,因此使用ScrollView。

首先,我建议不要使用UIScrollViews(如果只显示UITextView。另外,请记住UITextView是UIScrollView的子类)。

您可以通过将UITextView配置为UIView的子视图来实现UITextView的重新定位和调整大小。在UIView上启用autoresizesSubviews并配置两个视图的弹簧和支柱via the IB Inspector。 UIView容器应占用所有可用空间。

使用与问题中描述的方法相同的方法,当调整UIView的大小时,它也应该自动调整UITextView的框架。

现在,即使你确实需要在顶部有一个UIScrollView的视图层次结构,我仍然建议将它包装到一个普通的UIView容器中,并配置如上所述的自动调整大小。

希望有所帮助!