Почему UIScrollView всегда прокручивается вниз? - PullRequest
4 голосов
/ 11 июля 2011

Я видел, что этот вопрос решался несколько раз здесь, на SO, например, Проблема со смещением содержимого UIScrollView , но я до сих пор не могу ее решить.

Мое приложение для iphoneв основном контроллер панели вкладок с панелью навигации.У меня есть программный контроллер табличного представления и DetailViewController, который вставляется, когда я нажимаю на ячейку в моем контроллере табличного представления.

DetailViewController выполнен в IB и имеет следующую иерархию:

вид сверху => UIScrollView => UIView => UIImage и UITextField.

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

После рекомендации ее в SO, я сделал мой UIScrollView такого же размера, как и вид сверху, и вместо этого сделал UIView с максимальной высотой (1500) содержимого моей переменной.

В ViewDidLoad я установил contentSize для UIScrollView (так как он недоступен из IB):

- (void)viewDidLoad {

  [scrollView setContentSize:CGSizeMake(320, 1500)];
  [scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
  NSLog(@"viewDidLoad: contentOffset y: %f",[scrollView contentOffset].y);
}

Конкретно устанавливая contentOffset, я бы ожидал, что мой scrollView всегда будет заканчиваться наТоп.Вместо этого он всегда идет ко дну.Мне кажется, что после этого метода происходит неконтролируемая автопрокрутка.

Мое чтение содержимого contentOffset выглядит нормально.Мне кажется, что могут быть некоторые проблемы, связанные с синхронизацией, поскольку результат прокрутки может варьироваться независимо от того, является ли анимация ДА или НЕТ.

Уродливый обходной путь, который я обнаружил, заключается в использовании этого метода делегата:

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrView {
    NSLog(@"Prog. scrolling ended");
    [scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
}

Это выводит мой скролл-ап наверх, но заставляет его отскакивать вниз и вверх, как йо-йо

Другая подсказка может заключаться в том, что хотя мои переменные экземпляра для IBOutlet установлены до Iнажмите контроллер представления, когда в первый раз появится пустое изображение и текстовое поле:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath  *)indexPath {

    if (!detailViewController) {
       detailViewController = [[DayDetailViewController alloc] init];
    }

    // Pass dictionary for the selected event to next controller
    NSDictionary *dict = [eventsDay objectAtIndex:[indexPath row]];
    // This method sets values for the image and textfield outlets
   [detailViewController setEventDictionary:dict];  

    // Push it onto the top of the navigation controller´s stack.
    [[self navigationController] pushViewController:detailViewController animated:NO];


}

Если я установлю анимацию на YES и переключу порядок настройки IBOutlet и pushViewController, я могу избежать пустоты при инициализации,Почему?

Любая помощь в этих вопросах высоко ценится, поскольку это действительно сводит меня с ума!

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

Вдохновленный описанием программного подхода Ponchotg, я решил пропустить конструктор интерфейсов.Результат был в некотором роде неутешительным: та же самая проблема, с прокруткой, заканчивающейся в непредсказуемых положениях (главным образом в основании), сохранялась.

Однако я заметил, что ошибка смещения прокрутки была намного меньше.Я думаю, что это связано с динамическим (и вообще меньшим) значением ContentOffset.После некоторого слепого эксперимента я в итоге установил

[textView setScrollEnabled:YES];

Это было ранее установлено в NO, так как UITextView помещается в представление прокрутки, которое должно заботиться о прокрутке.(В моем первоначальном вопросе я ошибочно сказал, что это был UITextField, это было неправильно)

С этим изменением моя проблема исчезла, я просто не смог попасть в ситуацию с появлением прокрутки внизу втренажер!(На моем устройстве 3G я видел, как небольшое смещение появляется очень редко, но это легко исправить с помощью делегата scrollViewDidEndScrollingAnimation, описанного ранее).

Я считаю, что это решено сейчас, но было бы полезно, если бы кто-нибудь понял, почему эта маленькая детальвсе портит?

0 голосов
/ 11 июля 2011

OK! У меня есть вопрос, прежде чем я могу дать правильный ответ.

Почему вы используете UIView внутри Scrollview?

Вы всегда можете поместить только UIImageView и UITextField в UIScrollView без UIView

и установите contentSize динамически в зависимости от размера текста.

чтобы дать вам пример, как я это делаю:

int contSize = 0;
imageView.frame = CGRectMake(10, 0, 300, 190);
imageView.image = [UIImage imageNamed:@"yourimage"];

contSize = 190 //or add extra space if you dont want your image and your text to be so close

[textField setScrollEnabled:NO];
textField.font = [UIFont systemFontOfSize:15];
textField.textColor = [UIColor grayColor];
textField.text = @"YOUR TEXT";
[textField setEditable:NO];
textField.frame = CGRectMake(5, contSize, 310, 34);
CGRect frameText = textField.frame;
frameText.size.height = textField.contentSize.height;
textField.frame = frameText;
contSize += (textField.contentSize.height);

[scrollView setScrollEnabled:YES];
[scrolView setContentSize:CGSizeMake(320, contSize)];

В приведенном выше примере я сначала создаю int для отслеживания размера моего вида y, затем присваиваю настройки и изображение моему UIImageView и добавляю это число к своему int, затем я даю настройки и текст к моему UITextField, а затем я вычисляю размер моего текста в зависимости от длины моего текста и размера моего шрифта, затем добавляю это к моему int и, наконец, присваиваю contentSize моего ScrollView для соответствия мой int.

Таким образом, размер вашего прокрутки всегда будет соответствовать вашему представлению, а представление прокрутки всегда будет сверху.

Но если вы не хотите делать все это, вы всегда можете просто:

[scrollView setContentOffset:CGPointMake(0, 0) animated:NO];

в конце кода, где вы устанавливаете свое изображение и текст, и NO, чтобы избежать подпрыгивания.

Надеюсь, это поможет.

...