Проведите, чтобы открыть меню, как Tweetie - PullRequest
1 голос
/ 08 июля 2010

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

- (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 анимирует ячейку обратно в ее обычное место только после прокрутки окна просмотра. (Например, под панелью навигации или объектом, скрывающим его). Последняя ключевая проблема - это возможность определить, является ли меню уже видимым или активным, а ячейка уже находится за пределами экрана, сдвинуть ячейку обратно в исходное положение, удалить меню, затем выдвиньте другую ячейку и добавьте меню.

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

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

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

Ответы [ 2 ]

6 голосов
/ 08 июля 2010

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

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

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

1 голос
/ 08 июля 2010

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

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

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

...