2010-07-07 2 views
1

Я работаю над новым приложением и действительно надеялся внедрить салфетки, чтобы открыть больше меню опций внутри моего приложения. Я искал и искал, но, похоже, никто другой не смог заставить его работать (кроме Лорена). То, что я пытаюсь сделать, это пронести по ячейке и одновременно использовать CABasicAnimation, чтобы нажать ее на x: 320, и добавить подвью ниже, чтобы иметь кнопки и т. Д. Я использую willBeginEditing для обнаружения салфетки, чтобы избежать подкласса , Вот код:Проведите, чтобы показать меню, подобное Tweetie

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

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

CABasicAnimation *theAnimation;   

theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.x"]; 

theAnimation.duration=0.0; 

theAnimation.repeatCount=0; 

theAnimation.autoreverses=NO; 

theAnimation.removedOnCompletion = NO; 

theAnimation.fillMode = kCAFillModeForwards; 

theAnimation.fromValue=[NSNumber numberWithFloat:0]; 

theAnimation.toValue=[NSNumber numberWithFloat:+320]; 

[cell.layer addAnimation:theAnimation forKey:@"animateLayer"]; 

CGRect frame = CGRectMake(0, 59 * indexPath.row, 320, 59); 

UIView *menu = [[[UIView alloc] initWithFrame:frame] autorelease]; 


NSString *path = [NSString stringWithFormat:@"%@%@", 

         [[NSBundle mainBundle] resourcePath], 

         @"/flick.wav"]; 



SystemSoundID soundID; 

NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO]; 

AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID); 

AudioServicesPlaySystemSound(soundID); 

self.menu.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"dots.png"]]; 

[self.view addSubview:menu]; 

[self.view sendSubviewToBack:menu]; 

} 



- (void)animationDidStop:(NSString*)animationID finished:(BOOL)finished context:(void  *)context 

{ 

    // Release 

    [self release]; 

} 


#pragma mark - Swipe Menu II 



- (void)scrollViewDidScroll:(UIScrollView *)tableView { 

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:nil]; 

    CABasicAnimation *theAnimation;   

    theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.x"]; 

    theAnimation.duration=0.2; 

theAnimation.repeatCount=0; 

theAnimation.autoreverses=NO; 

theAnimation.fromValue=[NSNumber numberWithFloat:320]; 

theAnimation.toValue=[NSNumber numberWithFloat:0] 

; 

[cell.layer addAnimation:theAnimation forKey:@"animateLayer"]; 

} 

Проблема заключается в сползания клетки - Я хочу, чтобы это сделать, когда любое прикосновение вне поля зрения меню получено, но потому, что это Scrollview, я не могу. Метод ScrollViewdidScroll только оживляет ячейку до ее обычного места после прокрутки окна просмотра. (Как и в разделе NavigationBar или объект, который его закрывает). Последней ключевой проблемой является способность обнаруживать, что меню уже видно или активно, а ячейка уже отключена от экрана, сдвиньте ячейку обратно в исходное положение, удалите меню, а затем сдвиньте другую ячейку и добавьте меню.

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

Прошу прощения за плохое форматирование кода.

Спасибо заранее, Kolin

+0

Что вы описываете, как то, что происходит в facebook, когда вы нажимаете кнопку «+» на столбе, которая отображается как кнопки комментариев. Вы можете взглянуть на http://github.com/facebook/three20, если вы еще этого не сделали. –

ответ

6

Я на самом деле сделал эту работу достаточно хорошо, вы можете проверить проект здесь: http://www.thermoglobalnuclearwar.com/opensource/

Он также преодолевает проблему в Tweetie, где вы не можете провести ту же клетку дважды, не первый ударяя что-то другое.

Если вы вносите какие-либо конструктивные изменения или вам нужна помощь, дайте мне знать!

+0

Спасибо за код! Я посмотрю на это и посмотрю, что я могу с этим сделать! –

+0

Не проблема :) –

+0

Не могли бы вы помочь мне реализовать его в своем приложении?Конфигурация у меня другая, и я не могу заставить ее работать. –

1

реализации Loren имеет фатальный недостаток, который, если вы проводите на ячейку, а затем прокручивать таблицу, вы не можете повторно проведите ту же ячейку, пока не красть другую ячейку. Я считаю, что это связано с тем, что tableview полагает, что ячейка все еще редактируется, пока вы не попытаетесь «отредактировать» другую ячейку.

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

Я могу придумать 2 подхода, чтобы попытаться обнаружить отводы за пределами ячейки. Первый заключается в подклассе UIApplication и переопределении -sendEvent:. Вы можете использовать это, чтобы обнаружить событие крана и отклонить «редактирование» ячейки. Основная проблема здесь - дать знаниям подкласса UIApplication о вашей ячейке. Второй подход заключается в том, чтобы погладить пользовательский подкласс UIView по всему экрану и в -hitTest:withEvent: вы можете проверить, не касается ли касание к области над вашей ячейкой. Если это не так, отпустите «редактирование» ячейки. В обоих случаях возвращаем нуль, чтобы позволить событию перейти к основным представлениям (и не забудьте удалить этот оверлейный вид после события). Вы также можете проверить UIEvent, чтобы убедиться, что он содержит новое касание, прежде чем отклонить ячейку.

+0

Спасибо за ваш ответ и объяснив это! Я собираюсь заглянуть в код Тома, поскольку он, кажется, исправляет проблему Tweetie/Twitter. –

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