Как я могу удалить UIView пользователем, нажав или проведя пальцем в другом месте? - PullRequest
0 голосов
/ 22 марта 2012

Я создал мини-всплывающее меню для iPhone в UIView, и я бы хотел, чтобы пользователь мог отклонить представление, если он сделает что-то кроме выбора одного из вариантов. Поэтому, если пользователь коснется / проведет / ущипнет любой другой элемент на экране, всплывающее окно должно исчезнуть.

Однако я не хочу обнаруживать жест, который остановит что-то еще от происходящего ... Например, внизу есть UITableView, и если я проведу по нему вверх или вниз, я хочу, чтобы он двигался как ожидается , а также закрытие мини-всплывающего окна.

Должен ли я использовать несколько распознавателей жестов, или я должен использовать touchesBegan, или есть лучший способ сделать это?

1 Ответ

2 голосов
/ 22 марта 2012

Поместите это в UIViewController

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if (touch.view!=yourView && yourView) {
        [yourView removeFromSuperview];
        yourView=nil;
    }

}

РЕДАКТИРОВАТЬ: изменения, внесенные для обнаружения касания и удаления, только если существует вид* Methods

 if (yourView) {
     [yourView removeFromSuperview];
     yourView=nil;
    }  

или добавьте touchesBegan:withEvent: в качестве события touchDown для ваших кнопок.

Оба раздражают, но не видят другого способа сделать это как touchesBegan методне вызывается с интерактивными элементами.

РЕДАКТИРОВАТЬ3: Право записать, думаю, я прибил

в вашем интерфейсе добавить UIGestureRecognizerDelegate

@interface ViewController : UIViewController <UIGestureRecognizerDelegate> {

затем в вашем viewDidLoad добавьте это

UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapMethod)];
tapped.delegate=self;
tapped.numberOfTapsRequired = 1;
[self.view addGestureRecognizer:tapped];

затем в вашем viewController добавьте эти 2 метода

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if (touch.view!=yourView && yourView) {
    return YES;
}
return NO;
}

-(void)tapMethod {
[yourView removeFromSuperview];
yourView=nil;
}
...