UIViewController+DVVFixModalPresentationStyle.m 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. //
  2. // UIViewController+DVVFixModalPresentationStyle.m
  3. // DVVFixModalPresentationStyle
  4. //
  5. // Created by David on 2019/8/20.
  6. // Copyright © 2019 David. All rights reserved.
  7. //
  8. #import "UIViewController+DVVFixModalPresentationStyle.h"
  9. #import <objc/runtime.h>
  10. @implementation UIViewController (DVVFixModalPresentationStyle)
  11. #ifdef __IPHONE_13_0
  12. + (void)load {
  13. if (@available(iOS 13.0, *)) {
  14. static dispatch_once_t onceToken;
  15. dispatch_once(&onceToken, ^{
  16. [self dvv_swizzlingInstanceMethodWithClass:self.class
  17. originSel:@selector(setModalPresentationStyle:)
  18. swizzlingSel:@selector(dvv_setModalPresentationStyle:)];
  19. [self dvv_swizzlingInstanceMethodWithClass:self.class
  20. originSel:@selector(presentViewController:animated:completion:)
  21. swizzlingSel:@selector(dvv_presentViewController:animated:completion:)];
  22. });
  23. }
  24. }
  25. static char kDVVDidSetModalPresentationStyle;
  26. - (void)setDvv_didSetModalPresentationStyle:(BOOL)dvv_didSetModalPresentationStyle {
  27. objc_setAssociatedObject(self, &kDVVDidSetModalPresentationStyle, @(dvv_didSetModalPresentationStyle), OBJC_ASSOCIATION_ASSIGN);
  28. }
  29. - (BOOL)dvv_didSetModalPresentationStyle {
  30. id obj = objc_getAssociatedObject(self, &kDVVDidSetModalPresentationStyle);
  31. if (obj) {
  32. return [obj boolValue];
  33. } else {
  34. return NO; // default value.
  35. }
  36. }
  37. - (void)dvv_setModalPresentationStyle:(UIModalPresentationStyle)modalPresentationStyle {
  38. if (@available(iOS 13.0, *)) {
  39. self.dvv_didSetModalPresentationStyle = YES;
  40. }
  41. [self dvv_setModalPresentationStyle:modalPresentationStyle];
  42. }
  43. - (void)dvv_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
  44. if (@available(iOS 13.0, *)) {
  45. if (!viewControllerToPresent.dvv_didSetModalPresentationStyle &&
  46. viewControllerToPresent.modalPresentationStyle == UIModalPresentationPageSheet) {
  47. viewControllerToPresent.modalPresentationStyle = UIModalPresentationFullScreen;
  48. }
  49. }
  50. [self dvv_presentViewController:viewControllerToPresent animated:flag completion:completion];
  51. }
  52. #pragma mark - Method Swizzling
  53. + (void)dvv_swizzlingInstanceMethodWithClass:(Class)cls originSel:(SEL)originSel swizzlingSel:(SEL)swizzlingSel {
  54. Method originMethod = class_getInstanceMethod(cls, originSel);
  55. Method swizzlingMethod = class_getInstanceMethod(cls, swizzlingSel);
  56. BOOL didAddMethod = class_addMethod(cls,
  57. originSel,
  58. method_getImplementation(swizzlingMethod),
  59. method_getTypeEncoding(swizzlingMethod));
  60. if (didAddMethod) {
  61. class_replaceMethod(cls,
  62. swizzlingSel,
  63. method_getImplementation(originMethod),
  64. method_getTypeEncoding(originMethod));
  65. } else {
  66. method_exchangeImplementations(originMethod, swizzlingMethod);
  67. }
  68. }
  69. #endif
  70. @end