Уволить модальный вид контроллера листа на внешнем кране - PullRequest
31 голосов
/ 02 февраля 2012

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

@ cli_hlt, @ Билл Браски, спасибо за ваш ответ. Мне нужно отклонить его, когда нажатие происходит за пределами модального представления, которое является листом формы. Я вставляю свой код ниже.

-(void)gridView:(AQGridView *)gridView didSelectItemAtIndex:(NSUInteger)index  
{        
    if(adminMode) 
    {
        CHEditEmployeeViewController *editVC = [[CHEditEmployeeViewController alloc] initWithNibName:@"CHEditEmployeeViewController" bundle:nil];
        editVC.delegate = self;
        editVC.pickedEmployee = employee;
        editVC.edit = TRUE;
        editVC.delegate = self;
        UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:editVC];
        navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
        [self presentModalViewController:navigationController animated:YES];

        return;
    }   //the above code is from the view controller which presents the modal     view. Please look at the below code too which is from my modal view controller. Please guide me in a proper way.   -(void)tapGestureRecognizer {

    UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapBehind:)];
    [recognizer setNumberOfTapsRequired:1];
    recognizer.cancelsTouchesInView = NO; //So the user can still interact with controls in the modal view
    [self.view addGestureRecognizer:recognizer];

}

- (void)handleTapBehind:(UITapGestureRecognizer *)sender
{
    if (sender.state == UIGestureRecognizerStateEnded) 
    {
        CGPoint location = [sender locationInView:nil]; //Passing nil gives us coordinates in the window

    //Then we convert the tap's location into the local view's coordinate system, and test to see if it's in or outside. If outside, dismiss the view.

        if (![self.view pointInside:[self.view convertPoint:location fromView:self.view.window] withEvent:nil]) 
        {
            [self dismissModalViewControllerAnimated:YES];
            [self.view.window removeGestureRecognizer:sender];
        }

    }
}

Ответы [ 13 ]

2 голосов
/ 09 апреля 2015

Я использую его в этой форме без проблем ни на iOS 7.1, ни на iOS 8.3.

- (void)viewDidAppear:(BOOL)animated
{
     [super viewDidAppear:animated];

     [self.view.window addGestureRecognizer:self.tapBehindGesture];
}

- (void)viewWillDisappear:(BOOL)animated
{
     [super viewWillDisappear:animated];

     [self.view.window removeGestureRecognizer:self.tapBehindGesture];
}

- (UITapGestureRecognizer*)tapBehindGesture
{    
    if (_tapBehindGesture == nil)
    {
        _tapBehindGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapBehindRecognized:)];
        _tapBehindGesture.numberOfTapsRequired = 1;
        _tapBehindGesture.cancelsTouchesInView = NO;
        _tapBehindGesture.delegate = self;
    }

    return _tapBehindGesture;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}
0 голосов
/ 28 марта 2016
extension CGPoint {
    mutating func correctOrientation() {
        let screenSize = UIScreen.mainScreen().bounds
        switch(UIDevice.currentDevice().orientation) {
        case .Portrait:
            break
        case .PortraitUpsideDown:
            y = screenSize.height - y
            break
        case .LandscapeLeft:
            swap(&y, &x)
            y = screenSize.height - y
            break
        case .LandscapeRight:
            swap(&y, &x)
            x = screenSize.width - x
            break
        default:
            break
        }
    }
}
0 голосов
/ 24 сентября 2014

Я сделал навигационный контроллер, который автоматически отключается для iPad

https://github.com/curciosobrinho/NavAutoDismiss

Это тот же код, что и выше, работающий на iOS 8.

Итак, все кредиты достаются людям выше.

Я просто сделал это, чтобы быть более общим и простым в использовании.

Вам просто нужно скопировать ОБА файлы в ваш проект

Импорт файла заголовка (.h)

И используйте ваш viewcontroller (который вы хотите показать) в качестве rootViewController.

Как это использовать:

//Import the .h file
#import "NavDismissViewController.h"

//Instanciate your view controller (the view you want to present)

YourViewController * yourVC = [YourViewController new];

//Instanciate the NavDismissViewController with your view controller as the rootViewController

NavDismissViewController *nav = [[NavDismissViewController alloc] initWithRootViewController:yourVC];

//if you want to change the navigationBar translucent behaviour

[nav.navigationBar setTranslucent:NO];

//Choose the Modal style

nav.modalPresentationStyle=UIModalPresentationFormSheet;

//present your controller

[self presentViewController:nav animated:YES completion:nil];

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