клавиатура скрывает мой текстовый вид - PullRequest
1 голос
/ 30 декабря 2010

У меня есть простое приложение, оно состоит из 2-х textview, 1 uiview как подкласса coretext, а затем 1 scrollview. другая часть - это подпредставления из прокрутки. Я использую этот вид прокрутки, потому что мне нужно одновременно прокручивать текстовые и пользовательские окна. Я уже прокручиваю их все вместе, но проблема в том, что клавиатура скрывает некоторые строки в текстовом представлении. Я должен изменить рамку прокрутки при появлении клавиатуры, но это все равно не помогает. Это мой код:

UIScrollView *scrollView;
UIView *viewTextView;
UITextView *lineNumberTextView;
UITextView *codeTextView;


-(void) viewWillAppear:(BOOL)animated{

[super viewWillAppear:animated];

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

self.scrollView.frame = CGRectMake(0, 88, self.codeTextView.frame.size.width, 
                                           self.codeTextView.frame.size.height);

scrollView.contentSize = CGSizeMake(self.view.frame.size.width, viewTextView.frame.size.height);

[scrollView addSubview:viewTextView];

CGAffineTransform translationCoreText = CGAffineTransformMakeTranslation(60, 7);
[viewTextView setTransform:translationCoreText];

[scrollView addSubview:lineNumberTextView];
[self.scrollView setScrollEnabled:YES];
[self.codeTextView setScrollEnabled:NO];

}

-(void)keyboardWillAppear:(NSNotification *)notification {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:[[[notification userInfo] 
                               objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; 
CGRect keyboardEndingUncorrectedFrame = [[[notification userInfo] 
                                          objectForKey:UIKeyboardFrameEndUserInfoKey ] CGRectValue];
CGRect keyboardEndingFrame = 
[self.view convertRect:keyboardEndingUncorrectedFrame 
              fromView:nil];


self.scrollView.frame = CGRectMake(0, 88, self.codeTextView.frame.size.width, 
                                           self.codeTextView.frame.size.height - keyboardEndingFrame.size.height);

[UIView commitAnimations];

}

-(void)keyboardWillDisappear:(NSNotification *) notification {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:[[[notification userInfo] 
                               objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; 
CGRect keyboardEndingUncorrectedFrame = [[[notification userInfo] 
                                          objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect keyboardEndingFrame = 
[self.view convertRect:keyboardEndingUncorrectedFrame 
              fromView:nil];


self.scrollView.frame = CGRectMake(0, 88, self.codeTextView.frame.size.width, 
                                           self.codeTextView.frame.size.height + keyboardEndingFrame.size.height);

[UIView commitAnimations];

}

Может кто-нибудь помочь мне, пожалуйста?

UPDATE это картинка из этой проблемы:

alt text

некоторый текст все еще скрывается клавиатурой после того, как я сделал свой код

ОБНОВЛЕНИЕ СНОВА Я думаю, что клавиатура все еще скрывает текст, потому что я установил для прокрутки textview значение NO. это правильно ??

я добавил этот код в метод клавиатуры

codeBuilderSelectedRange = self.codeTextView.selectedRange; [self.viewTextViewScroll setContentOffset:CGPointMake(0, (CGFloat)codeBuilderSelectedRange.location) animated:YES];

но это просто заставляет текстовое представление исчезать из представления ... может кто-нибудь сказать ответ?

Ответы [ 4 ]

1 голос
/ 17 июля 2012

Специально для UITextView (не UITextField)

вы можете взглянуть на следующий урок: http://codingcluster.blogspot.in/2012/03/iphone-make-uitextview-move-up-when.html

Я реализовал его, и он работает, как и ожидалось (по крайней мере, для меня)

1 голос
/ 30 декабря 2010

Вот код, который я использовал. По сути, мы собираемся анимировать положение представления всякий раз, когда UITextField получает фокус. Для этого мы должны сделать нашего UIViewController делегатом нашего UITextField s

Первый метод делегата, который вам нужно реализовать, это - (void)textFieldDidBeginEditing:(UITextField *)textField

static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3;
static const CGFloat MINIMUM_SCROLL_FRACTION = 0.2;
static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.8;
static const CGFloat PORTRAIT_KEYBOARD_HEIGHT = 216;
static const CGFloat LANDSCAPE_KEYBOARD_HEIGHT = 162;

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect textFieldRect = [self.view.window convertRect:textField.bounds 
                                                fromView:textField];
    CGRect viewRect = [self.view.window convertRect:self.view.bounds
                                           fromView:self.view];

    CGFloat midline = textFieldRect.origin.y + 0.5 
            * textFieldRect.size.height;
    CGFloat numerator = midline - viewRect.origin.y 
            - MINIMUM_SCROLL_FRACTION * viewRect.size.height;
    CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION)
            * viewRect.size.height;
    CGFloat heightFraction = numerator / denominator;

    if (heightFraction < 0.0)
    {
        heightFraction = 0.0;
    }
    else if (heightFraction > 1.0)
    {
        heightFraction = 1.0;
    }

    UIInterfaceOrientation orientation =
    [[UIApplication sharedApplication] statusBarOrientation];
    if (orientation == UIInterfaceOrientationPortrait ||
        orientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction);
    }
    else
    {
        animatedDistance = floor(LANDSCAPE_KEYBOARD_HEIGHT * heightFraction);
    }

    CGRect viewFrame = self.view.frame;
    viewFrame.origin.y -= animatedDistance;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];

    [self.view setFrame:viewFrame];

    [UIView commitAnimations];
    }
}

Теперь, когда представление было «выдвинуто», когда выбран UITextField, мы хотим убедиться, что мы сдвинули его вниз, когда закончим:

- (void) textFieldDidEndEditing:(UITextField *)textField
{
    CGRect viewFrame = self.view.frame;
    viewFrame.origin.y += animatedDistance;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];

    [self.view setFrame:viewFrame];

    [UIView commitAnimations];
}

Это было взято из одного из моих любимых блогов о Какао, Какао с любовью . Дурное имя, но у Мэтта есть отличные посты по разработке Objective-C.

1 голос
/ 30 декабря 2010

Может эта ссылка Вам поможет
Разработчик Apple

1 голос
/ 30 декабря 2010
#pragma mark -------------------------
#pragma mark TextView delegate Methods
- (void)textViewDidBeginEditing:(UITextView *)textView {

    UIView *parentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 60, 44)];

    UIButton *infoButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 6, 60, 32)];

    [infoButton setBackgroundImage:[UIImage imageNamed: @"back-btn.png"] forState:UIControlStateNormal];

    [infoButton setTitle:@"Done" forState:UIControlStateNormal];

    infoButton.titleLabel.font = [UIFont systemFontOfSize:13.0f];

    [infoButton addTarget:self action:@selector(resignTextView) forControlEvents:UIControlEventTouchUpInside];

    [parentView addSubview:infoButton];

    [infoButton release];

    UIBarButtonItem *customBarButtomItem = [[UIBarButtonItem alloc] initWithCustomView:parentView];

    [parentView release];

    self.navigationItem.rightBarButtonItem = customBarButtomItem;

    [customBarButtomItem release];

    [UIView beginAnimations:nil context:NULL];

    [UIView setAnimationDuration:0.3];
    [UIView commitAnimations];

    CGRect frame = self.scrollView.frame;


    self.scrollView.frame.size.height = 206;

    //[self.view setContentOffset:CGPointMake(0,320)];
}



- (void)resignTextView {

    [UIView beginAnimations:nil context:NULL];

    [UIView setAnimationDuration:0.3];

    [UIView commitAnimations];

    CGRect frame = self.scrollView.frame;


    self.scrollView.frame.size.height = 460;

    [messageTextView resignFirstResponder];


    self.navigationItem.rightBarButtonItem = nil;
}
...