Intereting Posts
Приложение, выделяющее 650 МБ ОЗУ для загрузки растровых изображений CG ~ 250 UIImages Можно ли получить имя цвета в iOS на основе значений RGB? Возможно ли вырезать CocoaPods после выпуска `pod install` в приложении iOS? Выбор имени пользователя UIActionSheet и Twitter mgc: // ios url-схема для открытия приложения Google+ в определенном профиле Инициирование исходного ViewController в AppDelegate дает мерцающий черный экран перед первым представлением Как отключить автоматическую «прокрутку вверх» UIWebView, когда новый запрос завершил загрузку? пользовательский делегат ios отвечаетSoSelector не работает пользовательская ячейка таблицы TouchesBegan не запускает на представленный SKScene Перенос приложения iOS – не работает Как скрыть кнопку навигации на панели навигации ios в xamarin Ошибка NSDateFormatter IOS Переключение перехода модального вида iOS без переключения всего экрана Каков процесс создания подкласса XCTestCase? Помощь в интерпретации трассировки стека

Отклонить 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