UIScrollView UITextView и камера, вызывающая исчезающую ошибку графического интерфейса - PullRequest
0 голосов
/ 04 июля 2010

У меня временная ошибка, которая меня смущает.Будем очень благодарны за любые советы о том, как его отследить или в чем может быть причина.

У меня есть «DetailView» с несколькими метками, представлением изображений и представлением текста.В навигационной панели у меня также есть кнопка камеры, чтобы открыть средство выбора изображений и сделать снимок (позже добавленный в просмотр изображений).Основные вещи.

Иногда при съемке и редактировании текста: весь вид между панелью навигации и клавиатурой становится пустым (к моему цвету фона).Бывает чаще всего «впервые».Повторение процедуры не дает той же проблемы.Происходит почти только на 3Gs (очень редко на 3G и оригинальном iPhone).

У меня есть две теории.

1 заключается в том, что это как-то связано с представлением прокрутки, которое являетсяКонтейнер для исчезающих элементов GUI.Иерархия представления: ScrollView -> UIView -> метки, тексты и изображения.Плохо ли иметь представление прокрутки в качестве «основного» представления?

2 связано с памятью.3Gs имеет лучшую камеру и делает большие снимки ... Возможно, что-то случится, если приложение получит предупреждение о нехватке памяти при съемке (не редкость)?

Возможно ли вообще что-либо из этих двух?Любые другие идеи о том, что искать?

спасибо

Обновление: могут ли две одновременные анимации вызвать ошибку?

В уведомлении KeyboardWillShow я изменяю размер ScrollView с помощью UIView beginAnimations ... commitAnimations и сразу после этого (что, как я полагаю, происходит асинхронно) я также сообщаю представлению прокрутки scrollRectToVisible для TextView.

вот так:

    [UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:animationDuration];
[UIView setAnimationCurve:animationCurve];

CGRect rect = [[self view] frame];
rect.size.height -= keyboardFrame.size.height * (up? 1 : -1); 
[[self view] setFrame: rect];

[UIView commitAnimations];

// Scroll the active text field into view.
DetailView *tempScrollView = (DetailView *) [self view];
CGRect textFieldRect = [comments frame];
[tempScrollView scrollRectToVisible:textFieldRect animated:YES];    

Ответы [ 2 ]

0 голосов
/ 05 июля 2010

Мне удалось отследить это в симе.Вот оно:

  • Переход к DetailView
  • Нажатие на кнопку камеры, чтобы «открыть» UIImagePickerController (камера или библиотека, не имеет значения)
  • Теперь ясмоделировать предупреждение памяти перед закрытием средства выбора
  • Выберите изображение для закрытия средства выбора
  • Коснитесь UITextView

При этих обстоятельствах представление получит ДВА UIKeyboardWillShowNotification являются друг другом ... так что мой скопированный пример кода для изменения размера представления выполняется быстро ... делая его 416px - 216px - 216px = -16px в высоту ... не очень хорошая вещь.

Причина двойных уведомлений состояла, конечно, в том, что ViewController добавил себя в качестве наблюдателя в viewDidLoad ..., который снова запускается, когда представление "появляется" после предупреждения памяти ... но ViewController никогда не удалял себя в качестве наблюдателя.

Это исправило ошибку наверняка:

- (void)viewDidLoad {
[super viewDidLoad];

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

}

  • (void) viewDidUnload {[[NSNotificationCenter defaultCenter] removeObserver: сам];}
0 голосов
/ 05 июля 2010

3GS также имеет в два раза больше оперативной памяти по сравнению с 3G / оригиналом (256 МБ против 128), поэтому я сомневаюсь, что это связано с памятью.Вы можете переопределить didReceiveMemoryWarning: чтобы проверить, хотя.

Когда именно представление становится пустым?Это происходит спонтанно, или только когда вы нажимаете определенную кнопку и т. Д. Например, это происходит только тогда, когда вы начинаете редактировать текстовое представление (т.е. когда клавиатура всплывает)?Если это так, проверьте свой вид масок авторазмера.

Виды фактически исчезли или они просто за кадром?Попробуйте распечатать их кадры на консоли или с помощью отладчика проверить, где именно они должны быть.

Когда вы найдете ошибку, пожалуйста, опубликуйте свое решение - это звучит как проблема, с которой я мог бы когда-нибудь столкнуться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...