2013-12-16 2 views
7

Я застрял в странном поведении UIScrollView, который я не могу нажать на UIButton после того, как я увеличил contentSize в UIScrollView.UIButton не доступен за пределами исходного кадра UIScrollView

То, что я хотел сделать:

  1. Показать форму с помощью UIScrollView

  2. После нажатия на кнопку отправки, вид прокрутки увеличить некоторое количество высоты, чтобы показать далее Информация.

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

Проблема заключается в том, что я поместил новый UIButton к увеличенной области и кнопка не активируется в то время как я разместил UIButton к существующей зоне (начальному кадру зрения прокрутки), то кнопка работает нормально. Для обоих случаях полоса прокрутки зрения прокрутки выполняет нормальное поведение (то есть, конец прокрутки новая высота содержимого)

Вот то, что я до сих пор:.

  • A UIView XIB (размещены все элементы внутри него, включая скрытую кнопку)

  • UIScrollView (загрузили UIView XIB в нее)

UIView* view = [[[NSBundle mainBundle] loadNibNamed:@"view" owner:self options:nil] objectAtIndex:0];

[view loaded];

[scrollView addSubview:view];

  • После нажатия кнопки отправить щелкают:

// offset = some amount;

[scrollview setContentSize:CGSizeMake(scrollview.contentSize.width, scrollview.contentSize.height+offset)];

// h = some amount before the end of the scroll view

CGRect r = nextBtn.frame;

r.origin.y = h;

nextBtn.frame = r;

[nextBtn setHidden:NO];

enter image description here

Я попытался изменить атрибут clipSubviews зрения прокрутки, но кажется, что это не работает для моего случая вообще.

Кто-нибудь знает, как это происходит? И есть ли лучшие методы для выполнения этой работы?(измените размер прокрутки, а затем поместите в нее еще одну кнопку)

Любая помощь будет замечательной! Большое спасибо!

+0

Как насчет набора 'button.frame = CGRectMake (button.frame.origin.x, scrollView.contentSize.height - button.frame.size.height, button.frame.size.width, button.frame.size.height) 'и посмотреть, будет ли кнопка расположена в конце scrollView. – johnMa

+0

кнопка появляется в конце scrollView, но не может быть нажата. Кажется, что область ниже начального кадра не может быть нажата ... – user3099152

+0

Привет, пользователь3088152, вы нашли решение? – gaurav414u

ответ

-1

Я предполагаю, что кнопка является прямым или косвенным дочерним элементом содержимого, которое вы загружаете из xib-файла.

Проблема заключается в том, что вы изменили представление прокрутки contentSize, но не изменили рамки представления содержимого. Superviews участвуют в тестировании касания. Вы можете разместить subview вне границ надзора, и по умолчанию subview не будет обрезаться, но события касания не будут переданы ему, потому что супервизор проверяет во время тестирования на попадание, что касание находится за пределами его границ и отклоняет касание. См. UIViewhitTest:withEvent:.

+1

Точно! Я просто обновил contentSize прокрутки, но рамка моего UIView остается исходным фреймом. Он работает, если я также обновляю рамку UIView! Большое спасибо! :) – user3099152

+0

Я столкнулся с той же проблемой. У меня есть два отдельных XIB для загрузки, а представления из xib добавляются в scrollview. Событие Touch/click не работает для последнего представления, которое добавлено последним, а не в видимой области. Как обновить фрейм-представление после добавления в scrollview? – harshit2811

+0

@yurish thx для превосходного ответа. ха-ха .. Я имею в виду, как именно мы можем решить, какой вид кадра необходимо изменить в соответствии с видимым/невидимым для scrollview. Допустим, у меня есть два представления каждого из отдельных XIB. Изначально позиция второго взгляда y определяется по высоте первого взгляда Y + первого вида. Второе представление не видно изначально, но, как и когда я смотрю, я вижу, что представление размещено правильно, но ни одна из кнопок/ссылок не может быть нажата на этот второй вид. Теперь, как обновить фрейм кнопок/ссылок этого второго представления? – harshit2811

-2

Вы можете добавить кнопку say submit и другую кнопку в качестве подсмотра прокрутки. Сохраните другую кнопку, скрытую в начале, и вызовите setContentsize. теперь, когда пользователь нажимает кнопку отправки, затем устанавливает еще одну кнопку на видимую и снова устанавливает размер содержимого набора. Таким образом, вы сможете достичь того, чего хотите.

Я попытался сгенерировать сценарий для вас. Я пробовал это на представлении на основе приложения с раскадрой без автоматического макета.

так в раскадровку сделать некоторые вещи, как это:

#import <UIKit/UIKit.h> 

@interface ALViewController: UIViewController

@property (nonatomic, weak) IBOutlet UIScrollView *scroll; 

@property (неатомической, слабый) IBOutlet UIButton * btn1; @property (неатомный, слабый) IBOutlet UIButton * btn2;

=========== реализация:

#import "ALViewController.h" 

@interface ALViewController()

@end

@implementation ALViewController

- (void)viewDidLoad 

{ [super viewDidLoad]; // Выполняйте любую дополнительную настройку после загрузки изображения, как правило, из наконечника. [self.btn2 setHidden: YES];

[self adjustContentSize]; 

}

- (недействительными) adjustContentSize { CGRect contentRect = CGRectZero; для (UIView * view in self.scroll.subviews) { если (! [Вид isHidden]) { contentRect = CGRectUnion (contentRect, просмотр.Рамка); }}

self.scroll.contentSize = contentRect.size; 

}

  • (пустоты) didReceiveMemoryWarning { [супер didReceiveMemoryWarning]; // Утилизируйте любые ресурсы, которые можно воссоздать. }

- (IBAction) btnClicked: (ID) отправитель { UIButton * БТН = (UIButton *) отправителя; if (btn.tag == 1) { [self.btn2 setHidden: FALSE]; [self adjustContentSize]; }

} 

@end

и в раскадровке некоторые вещи, как это:

enter image description here @end

для информации: просмотр кадра 0,0,768,102 прокрутки рама: 0,0 768 102 btn1 рама: 361, 753, 46, 30 btn2 рама: 351, 1032, 46, 30

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

Вывод:

размер содержания Scrollview ищет его видимые содержать которых мы можем извлекать выгоду из.

благодарит и приветствуется.

Смежные вопросы