LTScrollExtension.swift
2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//
// LTScrollExtension.swift
// LTScrollView
//
// Created by 高刘通 on 2018/2/3.
// Copyright © 2018年 LT. All rights reserved.
//
import Foundation
import UIKit
extension UIScrollView {
public typealias LTScrollHandle = (UIScrollView) -> Void
private struct LTHandleKey {
static var key = "glt_handle"
static var tKey = "glt_isTableViewPlain"
}
public var scrollHandle: LTScrollHandle? {
get { return objc_getAssociatedObject(self, <HandleKey.key) as? LTScrollHandle }
set { objc_setAssociatedObject(self, <HandleKey.key, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC) }
}
@objc public var isTableViewPlain: Bool {
get { return (objc_getAssociatedObject(self, <HandleKey.tKey) as? Bool) ?? false}
set { objc_setAssociatedObject(self, <HandleKey.tKey, newValue, .OBJC_ASSOCIATION_ASSIGN) }
}
}
extension String {
func glt_base64Decoding() -> String {
let decodeData = NSData.init(base64Encoded: self, options: NSData.Base64DecodingOptions.init(rawValue: 0))
if decodeData == nil || decodeData?.length == 0 {
return "";
}
let decodeString = NSString(data: decodeData! as Data, encoding: String.Encoding.utf8.rawValue)
return decodeString! as String
}
}
extension UIScrollView {
public class func initializeOnce() {
DispatchQueue.once(token: UIDevice.current.identifierForVendor?.uuidString ?? "LTScrollView") {
let didScroll = "X25vdGlmeURpZFNjcm9sbA==".glt_base64Decoding()
let originSelector = Selector((didScroll))
let swizzleSelector = #selector(glt_scrollViewDidScroll)
glt_swizzleMethod(self, originSelector, swizzleSelector)
}
}
@objc dynamic func glt_scrollViewDidScroll() {
self.glt_scrollViewDidScroll()
guard let scrollHandle = scrollHandle else { return }
scrollHandle(self)
}
}
extension NSObject {
static func glt_swizzleMethod(_ cls: AnyClass?, _ originSelector: Selector, _ swizzleSelector: Selector) {
let originMethod = class_getInstanceMethod(cls, originSelector)
let swizzleMethod = class_getInstanceMethod(cls, swizzleSelector)
guard let swMethod = swizzleMethod, let oMethod = originMethod else { return }
let didAddSuccess: Bool = class_addMethod(cls, originSelector, method_getImplementation(swMethod), method_getTypeEncoding(swMethod))
if didAddSuccess {
class_replaceMethod(cls, swizzleSelector, method_getImplementation(oMethod), method_getTypeEncoding(oMethod))
} else {
method_exchangeImplementations(oMethod, swMethod)
}
}
}