Intereting Posts
Сохраняйте фотографии в swift, где пользователи не могут получить доступ Преобразование UIImage в URI данных Нет видимого @interface для 'MPMediaItem' объявляет селектор 'представительItem' Доступ к UILabel, созданный во время выполнения Локализовать NSArray Доступ к текстовому полю UIAlertControllers Сделать изображение можно настроить его высоту в соответствии с высотой изображения при уменьшении изображения из-за режима содержимого Низкое значение ARC в обратном вызове C Как прекратить использование других видов за выпадающим меню в Swift Как изменить размер UIImageView? Как добавить UIView в UIScrollView в iOS (просмотр с динамическим контентом) Цвет текста UISearchBar при использовании в UISearchDisplayController Использование различных пресетов разрешения с AVFoundation Самый быстрый способ сделать screenShot из UIView Как воспроизводить видео на YouTube с помощью MPMoviePlayerController?

Отклонить SVProgressHUD с помощью Tap Gesture

Мне нужно добавить UITapGestureRecognizer в SVProgressHUD . SVProgressHUD уже имеет возможность отклонить использование -(void) dismiss; , Код для этого отклонит анимацию на основе секунд.

 - (void)dismiss { for (UIGestureRecognizer *gesture in [[[self class] sharedView] gestureRecognizers]) { [[[self class] sharedView] removeGestureRecognizer:gesture]; } NSDictionary *userInfo = [self notificationUserInfo]; [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDWillDisappearNotification object:nil userInfo:userInfo]; self.activityCount = 0; [UIView animateWithDuration:0.15 delay:0 options:UIViewAnimationCurveEaseIn | UIViewAnimationOptionAllowUserInteraction animations:^{ self.hudView.transform = CGAffineTransformScale(self.hudView.transform, 0.8, 0.8); if(self.isClear) // handle iOS 7 UIToolbar not answer well to hierarchy opacity change self.hudView.alpha = 0; else self.alpha = 0; } completion:^(BOOL finished){ if(self.alpha == 0 || self.hudView.alpha == 0) { self.alpha = 0; self.hudView.alpha = 0; [[NSNotificationCenter defaultCenter] removeObserver:self]; [self cancelRingLayerAnimation]; [self addTapGestureToDismiss]; [_hudView removeFromSuperview]; _hudView = nil; [_overlayView removeFromSuperview]; _overlayView = nil; [_indefiniteAnimatedView removeFromSuperview]; _indefiniteAnimatedView = nil; UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidDisappearNotification object:nil userInfo:userInfo]; // Tell the rootViewController to update the StatusBar appearance UIViewController *rootController = [[UIApplication sharedApplication] keyWindow].rootViewController; if ([rootController respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) { [rootController setNeedsStatusBarAppearanceUpdate]; } // uncomment to make sure UIWindow is gone from app.windows //NSLog(@"%@", [UIApplication sharedApplication].windows); //NSLog(@"keyWindow = %@", [UIApplication sharedApplication].keyWindow); } }]; 

}

Мой мыслительный процесс заключается в том, чтобы добавить код tapGesture к методу увольнения. Это то, что я написал до сих пор.

 - (void)addTapGestureToDismiss { // Creation and initializer of the tap gesture UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismiss)]; // Specify that the gesture must be a single tap tapRecognizer.numberOfTapsRequired = 1; // Add the tap gesture recognizer to the view [[[self class] sharedView] addGestureRecognizer:tapRecognizer]; 

}

Как вы видите, я просто инициализирую tapGesture. Я столкнулся с проблемой размещения его в нескольких местах и ​​заставляя приложение иметь только один кран. Я в значительной степени смутил себя в этом процессе. Нужно ли мне

  • добавить этот жест в представление?
  • добавить этот жест, чтобы уволить?

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

Применение

Просто импортируйте эту категорию и позвоните

[SVProgressHUD showDismissableErrorWithStatus:@"Error message here"];

Код

 @interface SVProgressHUD (Dismissable) + (void)showDismissableErrorWithStatus:(NSString*)status; @end @implementation SVProgressHUD (Dismissable) + (void)showDismissableErrorWithStatus:(NSString*)status { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleHUDTappedNotification:) name:SVProgressHUDDidReceiveTouchEventNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleHUDDisappearedNotification:) name:SVProgressHUDWillDisappearNotification object:nil]; [SVProgressHUD showErrorWithStatus: status]; } #pragma mark - NSNotificationCenter + (void)handleHUDTappedNotification: (NSNotification *)notification { [SVProgressHUD dismiss]; } + (void)handleHUDDisappearedNotification: (NSNotification *)notification { [[NSNotificationCenter defaultCenter] removeObserver:self name:SVProgressHUDDidReceiveTouchEventNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:SVProgressHUDWillDisappearNotification object:nil]; } @end 

Swift 4

 import SVProgressHUD /// Ref: https://stackoverflow.com/a/41111242/425694 extension SVProgressHUD { public static func showDismissableError(with status: String) { let nc = NotificationCenter.default nc.addObserver( self, selector: #selector(hudTapped(_:)), name: NSNotification.Name.SVProgressHUDDidReceiveTouchEvent, object: nil ) nc.addObserver( self, selector: #selector(hudDisappeared(_:)), name: NSNotification.Name.SVProgressHUDWillDisappear, object: nil ) SVProgressHUD.showError(withStatus: status) SVProgressHUD.setDefaultMaskType(.clear) } @objc private static func hudTapped(_ notification: Notification) { SVProgressHUD.dismiss() SVProgressHUD.setDefaultMaskType(.none) } @objc private static func hudDisappeared(_ notification: Notification) { let nc = NotificationCenter.default nc.removeObserver(self, name: NSNotification.Name.SVProgressHUDDidReceiveTouchEvent, object: nil) nc.removeObserver(self, name: NSNotification.Name.SVProgressHUDWillDisappear, object: nil) SVProgressHUD.setDefaultMaskType(.none) } } 

ОБНОВЛЕНИЕ 2.0

Через некоторое время я наткнулся на это решение и запомнил этот вопрос, он работает, насколько я проверял. Просто добавьте Observer в свой видWillAppear вашего класса ViewController. Не нужно изменять библиотеку, как мой предыдущий ответ.

 -(void)viewWillAppear:(BOOL)animated{ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tapToDismiss:) name:SVProgressHUDDidReceiveTouchEventNotification object:nil]; //Other initializing } -(void)tapToDismiss:(NSNotification *)notification{ [SVProgressHUD dismiss]; //maybe other code to stop whatever your progress is } 

Это должно отклонить SVProgressHUD, даже если у вас есть маски.

Используйте это, чтобы удалить Observer после того, как вы закончите (например, в viewDidDisappear), или он будет присутствовать на протяжении всего приложения.

 [[NSNotificationCenter defaultCenter] removeObserver:self name:SVProgressHUDDidReceiveTouchEventNotification object:nil]; 

Кредит: http://kevsaidwhat.blogspot.my/2013/06/cancel-svprogresshud-process-by-tapping.html