NavCtrl + TableViewCtrl + ScrollView, TableView не касается - PullRequest
0 голосов
/ 05 июля 2011

У меня есть NavCtrl и, кроме того, у меня есть TableView / ctrl, затем у меня есть прокрутка.

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

Я перепробовал вещи nextResponder, и все, кажется, работает правильно. Вот некоторые фрагменты кода, имейте в виду, что этот код был сильно изменен для тестирования, поэтому он еще не "чистый":):


    ScrollView *myScrollView = [[ScrollView alloc] initWithFrame:CGRectMake(0, 150, 320, 680)];
    myScrollView.contentSize = CGSizeMake( 320 , 888);
    myScrollView.pagingEnabled = NO;
    myScrollView.bounces = NO;
    myScrollView.directionalLockEnabled = YES;
    myScrollView.canCancelContentTouches = NO;
    myScrollView.delaysContentTouches = NO;
    myScrollView.scrollEnabled = true;
    myScrollView.userInteractionEnabled = YES;
    myScrollView.scrollsToTop = NO;


     mySettingsTableView = [[SettingsTableView alloc] init];

// Settings View Ctrl
    SettingsTableViewCtrl *mySettingsTableViewCtrl = [[SettingsTableViewCtrl alloc] initWithStyle:UITableViewStyleGrouped];
    mySettingsTableViewCtrl.tableView.scrollEnabled = NO;
mySettingsTableViewCtrl.tableView.delaysContentTouches = NO;
mySettingsTableViewCtrl.tableView.canCancelContentTouches = NO;
mySettingsTableViewCtrl.view.userInteractionEnabled = YES;

[mySettingsTableViewCtrl.view addSubview:myScrollView];
[mySettingsTableViewCtrl.view addSubview:mySettingsTableView];

* В подклассе scrollView *

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    //if (![self yourMethodThatDeterminesInterestingTouches:touches withEvent:event])
    [super touchesBegan:touches withEvent:event];
    [self.nextResponder touchesBegan:touches withEvent:event];

}

Вот NSLog от сенсорных событий:

NSLog(@"Event: %@", event);
NSLog(@"Event NextResponder : %@\n", self.nextResponder);


2011-07-05 13:09:36.063 App[1924:14f03] Event: <UITouchesEvent: 0x802ea30> timestamp: 8503.71 touches: {(
    <UITouch: 0x80e6f60> phase: Began tap count: 1 window: <UIWindow: 0x836eb00; frame = (0 0; 320 480); layer = <CALayer: 0x836ebb0>> view: <ScrollView: 0x83770b0; baseClass = UIScrollView; frame = (0 150; 320 680); clipsToBounds = YES; layer = <CALayer: 0x8376e00>; contentOffset: {0, 0}> location in window: {140, 249} previous location in window: {140, 249} location in view: {140, 35} previous location in view: {140, 35}
)}

2011-07-05 13:09:36.065 App[1924:14f03] Event NextResponder : <SettingsTableViewCtrl: 0x8377db0>

Ответы [ 3 ]

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

Вот что у меня получилось, еще не идеально, но работает, любой совет по настройке будет высоко оценен ......

// AppDelegate.m

ScrollView *myScrollView = [[ScrollView alloc] initWithFrame:CGRectMake(0, 140, 320, 680)];
myScrollView.contentSize = CGSizeMake( 320 , 888);
myScrollView.pagingEnabled = NO;
myScrollView.bounces = NO;
myScrollView.directionalLockEnabled = YES;
myScrollView.canCancelContentTouches = NO;
myScrollView.delaysContentTouches = NO;
myScrollView.scrollEnabled = true;
myScrollView.userInteractionEnabled = YES;
myScrollView.scrollsToTop = NO;

mySettingsTableViewCtrl = [[SettingsTableViewCtrl alloc] initWithStyle:UITableViewStyleGrouped];
mySettingsTableViewCtrl.tableView.scrollEnabled = NO;
mySettingsTableViewCtrl.tableView.delaysContentTouches = NO;
mySettingsTableViewCtrl.tableView.canCancelContentTouches = NO;
mySettingsTableViewCtrl.view.userInteractionEnabled = YES;

[mySettingsTableViewCtrl.view addSubview:myScrollView];
[mySettingsTableViewCtrl.view addSubview:mySettingsTableView];

// ScrollView.m

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
[self.nextResponder touchesBegan:touches withEvent:event];

}

// SettingsTableView.m

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

UITouch *touch = [touches anyObject];
NSUInteger tapCount = [touch tapCount];
CGPoint location = [touch locationInView:self];

NSIndexPath *indexPathAtHitPoint = [self indexPathForRowAtPoint:location];
if ( [self cellForRowAtIndexPath:indexPathAtHitPoint] ) {
    [self.delegate tableView:self didSelectRowAtIndexPath:indexPathAtHitPoint];      
} else {
    [super touchesBegan:touches withEvent:event];
 }
}

Теперь у меня есть DatePicker поверх прокрутки и он работает, но этот код нуждается в дополнительном коде, чтобы управлять им, то есть определять, когда выбирается «касание», а когда его нет. Но это не должно быть слишком сложно (я думаю;)

Спасибо за помощь и комментарии,

D

0 голосов
/ 16 сентября 2011

Я думаю, что было бы излишне использовать ScrollView для ваших целей.Вы можете «прокрутить» любой вид.Расположите его так, чтобы его часть или все вышли за пределы, установите режим обрезки в родительском представлении, и, когда вы хотите «прокрутить» его, измените его кадр на «в границах» с включенной анимацией.То есть, если вы прокручиваете DatePicker в ответ на какое-то другое событие (например, добавление элемента в таблицу, связанную с датой).Если пользователь прокручивает указатель даты, перетаскивая его, продолжайте.

Объединить представление прокрутки и представление таблицы будет сложно, поскольку представление таблицы является представлением прокрутки.Это неоднозначно, что должно обрабатывать жесты прокрутки.Это может быть возможно, но вам, вероятно, придется написать дополнительный код, чтобы сделать неоднозначность явной.

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

У меня та же проблема с моим кодом, и я решил ее, добавив UITapGestureRecognizer к представлению, к которому я хочу обрабатывать касания. В вашем случае вы также должны добавить UITapGestureRecognizer в представление прокрутки, если вы хотите обрабатывать прикосновения к нему, или в виде таблицы, если вы хотите обрабатывать прикосновения к нему как;

UITapGestureRecognizer  *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedScrollView)];
[tapRecognizer setNumberOfTapsRequired:1];
[myScrollView addGestureRecognizer:tapRecognizer];
[tapRecognizer release];

и то, что вы хотите сделать на ощупь, следует сделать так:

- (Недействительными) tappedScrollView {
// ДЕЛАТЬ, что вы хотите после того, как коснулся вид прокрутки, сделайте это здесь. }

Точно так же вы можете сделать это для своего табличного представления как;

UITapGestureRecognizer  *tapRecognizerForTableView = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedTableView)];
[tapRecognizerForTableView setNumberOfTapsRequired:1];
[mySettingsTableView addGestureRecognizer:tapRecognizerForTableView];
[tapRecognizerForTableView release];

и то, что вы хотите сделать на ощупь, следует сделать так:

- (Недействительными) tappedTableView { // Делать то, что вы хотите после того, как просмотр таблицы коснулся, сделать это здесь. }

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