UIView+RQExtension.m 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. //
  2. // UIView+RQExtension.m
  3. // RQCommon
  4. //
  5. // Created by 张嵘 on 2018/11/16.
  6. // Copyright © 2018 张嵘. All rights reserved.
  7. //
  8. #import "UIView+RQExtension.h"
  9. #import <objc/runtime.h>
  10. static char kActionHandlerTapBlockKey;
  11. static char kActionHandlerTapGestureKey;
  12. static char kActionHandlerLongPressBlockKey;
  13. static char kActionHandlerLongPressGestureKey;
  14. @implementation UIView (RQExtension)
  15. @dynamic roundTop, roundLeft, roundBottom, borderWidth, borderColor, cornerRadius, shadowColor, shadowRadius, shadowOffset, shadowOpacity, themeGradientEnable, gradientStyle, gradientStyleEnum, gradientAColor, gradientBColor, shadowView, gradientLayer;
  16. +(void)load{
  17. NSArray *arr = @[@"setHidden:" ,@"setAlpha:", @"layoutSubviews", @"removeFromSuperview", @"setFrame:"];
  18. for (NSString *str in arr) {
  19. NSString *new_str = [@"hj_" stringByAppendingString:str];
  20. SEL orignsel = NSSelectorFromString(str);
  21. SEL exchgesel = NSSelectorFromString(new_str);
  22. Method originalM = class_getInstanceMethod([self class], orignsel);
  23. Method exchangeM = class_getInstanceMethod([self class], exchgesel);
  24. BOOL didAddMethod = class_addMethod([self class], orignsel, method_getImplementation(exchangeM), method_getTypeEncoding(exchangeM));
  25. if (didAddMethod)
  26. {
  27. class_replaceMethod([self class], exchgesel, method_getImplementation(originalM), method_getTypeEncoding(originalM));
  28. }
  29. else
  30. {
  31. method_exchangeImplementations(originalM, exchangeM);
  32. }
  33. }
  34. }
  35. ///设置角圆角
  36. - (void)setRound:(CACornerMask)maskedCorners
  37. {
  38. self.clipsToBounds = true;
  39. if (@available(iOS 11.0, *)) {
  40. self.layer.maskedCorners = maskedCorners;
  41. self.shadowView.layer.maskedCorners = maskedCorners;
  42. self.gradientLayer.maskedCorners = maskedCorners;
  43. } else {
  44. [self refreshRoundingCorners];
  45. }
  46. }
  47. //头部圆角
  48. - (BOOL)roundTop {
  49. return [objc_getAssociatedObject(self, @selector(roundTop)) boolValue];
  50. }
  51. - (void)setRoundTop:(BOOL)roundTop {
  52. objc_setAssociatedObject(self, @selector(roundTop), @(roundTop), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  53. if(roundTop) {
  54. [self setRound:kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner];
  55. }
  56. }
  57. //底部圆角
  58. - (BOOL)roundBottom {
  59. return [objc_getAssociatedObject(self, @selector(roundBottom)) boolValue];
  60. }
  61. - (void)setRoundBottom:(BOOL)roundBottom {
  62. objc_setAssociatedObject(self, @selector(roundBottom), @(roundBottom), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  63. if(roundBottom) {
  64. [self setRound:kCALayerMinXMaxYCorner | kCALayerMaxXMaxYCorner];
  65. }
  66. }
  67. //左边圆角
  68. - (BOOL)roundLeft {
  69. return [objc_getAssociatedObject(self, @selector(roundLeft)) boolValue];
  70. }
  71. - (void)setRoundLeft:(BOOL)roundLeft {
  72. objc_setAssociatedObject(self, @selector(roundLeft), @(roundLeft), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  73. if(roundLeft) {
  74. [self setRound:kCALayerMinXMinYCorner | kCALayerMinXMaxYCorner];
  75. }
  76. }
  77. //右边圆角
  78. - (BOOL)roundRight {
  79. return [objc_getAssociatedObject(self, @selector(roundRight)) boolValue];
  80. }
  81. - (void)setRoundRight:(BOOL)roundRight {
  82. objc_setAssociatedObject(self, @selector(roundRight), @(roundRight), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  83. if(roundRight) {
  84. [self setRound:kCALayerMaxXMinYCorner | kCALayerMaxXMaxYCorner];
  85. }
  86. }
  87. // 渐变空视图,只在有圆角的时候使用
  88. - (CAShapeLayer *)maskLayer{
  89. return objc_getAssociatedObject(self, @selector(maskLayer));
  90. }
  91. - (void)setMaskLayer:(CAShapeLayer *)maskLayer{
  92. objc_setAssociatedObject(self, @selector(maskLayer), maskLayer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  93. }
  94. ///上一次大小
  95. - (NSString *)lastSize{
  96. return objc_getAssociatedObject(self, @selector(lastSize));
  97. }
  98. - (void)setLastSize:(NSString *)lastSize{
  99. objc_setAssociatedObject(self, @selector(lastSize), lastSize, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  100. }
  101. //刷新圆角边框
  102. - (void)refreshRoundingCorners{
  103. if (@available(iOS 11.0, *)) {
  104. }else{
  105. if (self.roundTop || self.roundBottom) {
  106. CGFloat radius = self.cornerRadius; // 圆角大小
  107. UIRectCorner corner = UIRectCornerAllCorners; // 圆角位置,全部位置
  108. if (self.roundTop) {
  109. corner = UIRectCornerTopLeft | UIRectCornerTopRight;
  110. }else if (self.roundBottom) {
  111. corner = UIRectCornerBottomLeft | UIRectCornerBottomRight;
  112. }else if (self.roundLeft) {
  113. corner = UIRectCornerTopLeft | UIRectCornerBottomLeft;
  114. }else if (self.roundRight) {
  115. corner = UIRectCornerTopRight | UIRectCornerBottomRight;
  116. }
  117. [self setLayerCornerRadius:0];
  118. self.getStyleLayer.borderWidth = 0;
  119. self.getStyleLayer.borderColor = [UIColor clearColor].CGColor;
  120. [self setBorderWithCornerRadius:radius borderWidth:self.borderWidth borderColor:self.borderColor type:corner];
  121. }
  122. }
  123. }
  124. - (void)setBorderWithCornerRadius:(CGFloat)cornerRadius
  125. borderWidth:(CGFloat)borderWidth
  126. borderColor:(UIColor *)borderColor
  127. type:(UIRectCorner)corners {
  128. // UIRectCorner type = UIRectCornerTopRight | UIRectCornerBottomRight | UIRectCornerBottomLeft;
  129. //1. 加一个layer 显示形状
  130. CGRect rect = CGRectMake(borderWidth/2.0, borderWidth/2.0,
  131. CGRectGetWidth(self.frame)-borderWidth, CGRectGetHeight(self.frame)-borderWidth);
  132. CGSize radii = CGSizeMake(cornerRadius, borderWidth);
  133. //create path
  134. UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radii];
  135. //create shape layer
  136. if (!self.maskLayer) {
  137. self.maskLayer = [[CAShapeLayer alloc] init];
  138. }
  139. self.maskLayer.strokeColor = borderColor.CGColor;
  140. self.maskLayer.fillColor = [UIColor clearColor].CGColor;
  141. self.maskLayer.lineWidth = borderWidth;
  142. self.maskLayer.lineJoin = kCALineJoinRound;
  143. self.maskLayer.lineCap = kCALineCapRound;
  144. self.maskLayer.path = path.CGPath;
  145. [self.layer addSublayer:self.maskLayer];
  146. CAShapeLayer *clipLayer = [CAShapeLayer layer];
  147. clipLayer.path = path.CGPath;
  148. self.layer.mask = clipLayer;
  149. self.gradientLayer.mask = clipLayer;
  150. self.shadowView.layer.mask = clipLayer;
  151. }
  152. //圆形
  153. - (BOOL)circle {
  154. return [objc_getAssociatedObject(self, @selector(circle)) boolValue];
  155. }
  156. - (void)setCircle:(BOOL)circle {
  157. objc_setAssociatedObject(self, @selector(circle), @(circle), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  158. [self setLayerCcircleRadius];
  159. }
  160. - (void)setLayerCcircleRadius
  161. {
  162. if (self.circle) {
  163. CGFloat width = self.bounds.size.width;
  164. CGFloat height = self.bounds.size.height;
  165. CGFloat radius = (width > height ? height : width) / 2;
  166. [self setCornerRadius:radius];
  167. } else if (!self.circle && self.cornerRadius > 0) {
  168. [self setCornerRadius:self.cornerRadius];
  169. }
  170. }
  171. ///圆角
  172. - (CGFloat)cornerRadius {
  173. return [objc_getAssociatedObject(self, @selector(cornerRadius)) floatValue];
  174. }
  175. - (void)setCornerRadius:(CGFloat)cornerRadius {
  176. objc_setAssociatedObject(self, @selector(cornerRadius), @(cornerRadius), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  177. [self setLayerCornerRadius:cornerRadius];
  178. if (!CGSizeEqualToSize(CGSizeFromString(self.lastSize), self.frame.size)) {
  179. [self refreshRoundingCorners];
  180. }
  181. }
  182. ///设置圆角
  183. - (void)setLayerCornerRadius:(CGFloat)cornerRadius
  184. {
  185. self.clipsToBounds = true;
  186. self.layer.cornerRadius = cornerRadius;
  187. self.getStyleLayer.cornerRadius = cornerRadius;
  188. self.gradientLayer.cornerRadius = cornerRadius;
  189. }
  190. ///边框宽度
  191. - (CGFloat)borderWidth {
  192. return [objc_getAssociatedObject(self, @selector(borderWidth)) floatValue];
  193. }
  194. - (void)setBorderWidth:(CGFloat)borderWidth {
  195. objc_setAssociatedObject(self, @selector(borderWidth), @(borderWidth), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  196. self.layer.borderWidth = borderWidth;
  197. [self refreshRoundingCorners];
  198. }
  199. ///边框颜色
  200. - (UIColor *)borderColor {
  201. return objc_getAssociatedObject(self, @selector(borderColor));
  202. }
  203. - (void)setBorderColor:(UIColor *)borderColor {
  204. objc_setAssociatedObject(self, @selector(borderColor), borderColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  205. self.layer.borderColor = borderColor.CGColor;
  206. [self refreshRoundingCorners];
  207. }
  208. ///阴影颜色
  209. - (UIColor *)shadowColor {
  210. return objc_getAssociatedObject(self, @selector(shadowColor));
  211. }
  212. - (void)setShadowColor:(UIColor *)shadowColor
  213. {
  214. objc_setAssociatedObject(self, @selector(shadowColor), shadowColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  215. self.getStyleLayer.shadowColor = shadowColor.CGColor;
  216. self.getStyleLayer.shadowOpacity = 1;
  217. }
  218. ///阴影半径
  219. - (void)setShadowRadius:(CGFloat)shadowRadius
  220. {
  221. self.getStyleLayer.shadowRadius = shadowRadius;;
  222. }
  223. ///阴影偏移
  224. - (void)setShadowOffset:(CGSize)shadowOffset
  225. {
  226. self.getStyleLayer.shadowOffset = shadowOffset;;
  227. }
  228. ///阴影透明度
  229. - (void)setShadowOpacity:(CGFloat)shadowOpacity
  230. {
  231. self.getStyleLayer.shadowOpacity = shadowOpacity;;
  232. }
  233. //阴影layer
  234. - (CALayer *)getStyleLayer{
  235. if (self.shadowColor && ([self isKindOfClass:[UIImageView class]] || self.clipsToBounds)) {
  236. if (!self.shadowView) {
  237. self.shadowView = [[UIView alloc] init];
  238. self.shadowView.backgroundColor = self.backgroundColor;
  239. self.shadowView.layer.shadowOpacity = self.layer.shadowOpacity?:1;
  240. self.shadowView.layer.shadowRadius = self.layer.shadowRadius?:1;
  241. self.shadowView.layer.shadowColor = self.shadowColor.CGColor;
  242. self.shadowView.layer.cornerRadius = self.cornerRadius;
  243. if (CGSizeEqualToSize(self.layer.shadowOffset, self.shadowView.layer.shadowOffset)) {
  244. self.shadowView.layer.shadowOffset = CGSizeZero;
  245. }
  246. }
  247. // 禁止将 AutoresizingMask 转换为 Constraints
  248. self.shadowView.translatesAutoresizingMaskIntoConstraints = NO;
  249. [self.superview insertSubview:self.shadowView belowSubview:self];
  250. // 添加 right 约束
  251. NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.shadowView attribute:NSLayoutAttributeRight multiplier:1.0 constant:0];
  252. [self.superview addConstraint:rightConstraint];
  253. // 添加 left 约束
  254. NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:self.shadowView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0];
  255. [self.superview addConstraint:leftConstraint];
  256. // 添加 top 约束
  257. NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.shadowView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0];
  258. [self.superview addConstraint:topConstraint];
  259. // 添加 bottom 约束
  260. NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:self.shadowView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0];
  261. [self.superview addConstraint:bottomConstraint];
  262. [self.superview insertSubview:self.shadowView belowSubview:self];
  263. return self.shadowView.layer;
  264. }else{
  265. return self.layer;
  266. }
  267. }
  268. // 阴影空视图,只在有圆角的时候使用
  269. - (UIView *)shadowView{
  270. return objc_getAssociatedObject(self, @selector(shadowView));
  271. }
  272. - (void)setShadowView:(UIView *)shadowView{
  273. objc_setAssociatedObject(self, @selector(shadowView), shadowView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  274. }
  275. ///渐变A颜色
  276. - (void)setGradientAColor:(UIColor *)gradientAColor
  277. {
  278. objc_setAssociatedObject(self, @selector(gradientAColor), gradientAColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  279. [self drawingGradientLayer];
  280. }
  281. - (UIColor *)gradientAColor {
  282. return objc_getAssociatedObject(self, @selector(gradientAColor));
  283. }
  284. ///渐变B颜色
  285. - (void)setGradientBColor:(UIColor *)gradientBColor
  286. {
  287. objc_setAssociatedObject(self, @selector(gradientBColor), gradientBColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  288. [self drawingGradientLayer];
  289. }
  290. - (UIColor *)gradientBColor {
  291. return objc_getAssociatedObject(self, @selector(gradientBColor));
  292. }
  293. ///渐变风格xib用
  294. - (NSInteger)gradientStyleEnum
  295. {
  296. return [objc_getAssociatedObject(self, @selector(gradientStyleEnum)) integerValue];
  297. }
  298. - (void)setGradientStyleEnum:(NSInteger)gradientStyleEnum
  299. {
  300. objc_setAssociatedObject(self, @selector(gradientStyleEnum), @(gradientStyleEnum), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  301. self.gradientStyle = gradientStyleEnum;
  302. }
  303. ///渐变风格
  304. - (GradientStyle)gradientStyle
  305. {
  306. return [objc_getAssociatedObject(self, @selector(gradientStyle)) integerValue];
  307. }
  308. - (void)setGradientStyle:(GradientStyle)gradientStyle{
  309. objc_setAssociatedObject(self, @selector(gradientStyle), @(gradientStyle), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  310. if (self.gradientStyle) [self drawingGradientLayer];
  311. }
  312. ///是否开启主题渐变风格
  313. - (BOOL)themeGradientEnable
  314. {
  315. return [objc_getAssociatedObject(self, @selector(themeGradientEnable)) boolValue];
  316. }
  317. - (void)setThemeGradientEnable:(BOOL)themeGradientEnable{
  318. objc_setAssociatedObject(self, @selector(themeGradientEnable), @(themeGradientEnable), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  319. [self drawingGradientLayer];
  320. }
  321. //渐变layer
  322. - (void)drawingGradientLayer{
  323. UIColor *colorA = self.gradientAColor;
  324. UIColor *colorB = self.gradientBColor;
  325. GradientStyle gradientStyle = self.gradientStyle;
  326. if (!colorA && [self respondsToSelector:@selector(themeGradientAColor)]) {
  327. colorA = [self valueForKey:@"themeGradientAColor"];
  328. }
  329. if (!colorB && [self respondsToSelector:@selector(themeGradientBColor)]) {
  330. colorB = [self valueForKey:@"themeGradientBColor"];
  331. }
  332. if (!gradientStyle && [self respondsToSelector:@selector(themeGradientStyle)]) {
  333. gradientStyle = [[self valueForKey:@"themeGradientStyle"] integerValue];
  334. }
  335. if (colorA && colorB) {
  336. if (!self.gradientLayer) {
  337. self.gradientLayer = [CAGradientLayer layer];
  338. [self.layer insertSublayer:self.gradientLayer below:self.layer];
  339. }
  340. self.gradientLayer.frame = self.bounds;
  341. self.gradientLayer.colors = @[(__bridge id)colorA.CGColor, (__bridge id)colorB.CGColor];
  342. // self.gradientLayer.locations = @[@0.5, @0.5];
  343. if (gradientStyle == GradientStyleLeftToRight) {
  344. self.gradientLayer.startPoint = CGPointMake(0, 0);
  345. self.gradientLayer.endPoint = CGPointMake(1.0, 0);
  346. }else{
  347. self.gradientLayer.startPoint = CGPointMake(0, 0);
  348. self.gradientLayer.endPoint = CGPointMake(0, 1.0);
  349. }
  350. self.gradientLayer.cornerRadius = self.cornerRadius;
  351. if (@available(iOS 11.0, *)) {
  352. self.gradientLayer.maskedCorners = self.getStyleLayer.maskedCorners;
  353. } else {
  354. [self refreshRoundingCorners];
  355. }
  356. self.backgroundColor = [UIColor clearColor];
  357. }
  358. }
  359. - (UIColor *)themeGradientAColor{
  360. return [UIColor redColor];
  361. }
  362. - (UIColor *)themeGradientBColor{
  363. return [UIColor blueColor];
  364. }
  365. - (NSInteger)themeGradientStyle
  366. {
  367. return 1;
  368. }
  369. // 渐变空视图,只在有圆角的时候使用
  370. - (CAGradientLayer *)gradientLayer{
  371. return objc_getAssociatedObject(self, @selector(gradientLayer));
  372. }
  373. - (void)setGradientLayer:(CAGradientLayer *)gradientLayer{
  374. objc_setAssociatedObject(self, @selector(gradientLayer), gradientLayer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  375. }
  376. - (void)hj_setFrame:(CGRect)frame
  377. {
  378. [self hj_setFrame:frame];
  379. [self refreshLayout];
  380. }
  381. - (void)hj_layoutSubviews
  382. {
  383. [self hj_layoutSubviews];
  384. [self refreshLayout];
  385. }
  386. - (void)refreshLayout
  387. {
  388. if (self.shadowView.layer) {
  389. self.shadowView.frame = self.frame;
  390. }
  391. if (self.gradientLayer) {
  392. self.gradientLayer.frame = self.bounds;
  393. }
  394. if (self.shadowView.layer && !self.roundTop && !self.roundBottom && !self.roundLeft && !self.roundRight) {
  395. //设置阴影路径
  396. self.shadowView.layer.shadowPath = self.layer.shadowPath;
  397. }
  398. [self setLayerCcircleRadius];
  399. self.lastSize = NSStringFromCGSize(self.frame.size);
  400. }
  401. - (void)hj_removeFromSuperview
  402. {
  403. [self hj_removeFromSuperview];
  404. if (self.shadowView) {
  405. [self.shadowView removeFromSuperview];
  406. }
  407. if (self.gradientLayer) {
  408. [self.gradientLayer removeFromSuperlayer];
  409. }
  410. }
  411. - (void)hj_setAlpha:(CGFloat)alpha{
  412. [self hj_setAlpha:alpha];
  413. if (self.shadowView) {
  414. self.shadowView.alpha = alpha;
  415. }
  416. if (self.gradientLayer) {
  417. self.gradientLayer.opacity = alpha;
  418. }
  419. }
  420. - (void)hj_setHidden:(BOOL)hidden
  421. {
  422. [self hj_setHidden:hidden];
  423. if (self.shadowView) {
  424. self.shadowView.hidden = hidden;
  425. }
  426. if (self.gradientLayer) {
  427. self.gradientLayer.hidden = hidden;
  428. }
  429. }
  430. /**
  431. * 判断一个控件是否真正显示在主窗口
  432. */
  433. - (BOOL)rq_isShowingOnKeyWindow
  434. {
  435. // 主窗口
  436. UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
  437. // 以主窗口左上角为坐标原点, 计算self的矩形框
  438. CGRect newFrame = [keyWindow convertRect:self.frame fromView:self.superview];
  439. CGRect winBounds = keyWindow.bounds;
  440. // 主窗口的bounds 和 self的矩形框 是否有重叠
  441. BOOL intersects = CGRectIntersectsRect(newFrame, winBounds);
  442. return !self.isHidden && self.alpha > 0.01 && self.window == keyWindow && intersects;
  443. }
  444. /**
  445. * xib创建的view
  446. */
  447. + (instancetype)rq_viewFromXib
  448. {
  449. return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject];
  450. }
  451. + (instancetype)rq_viewFromXibWithFrame:(CGRect)frame {
  452. UIView *view = [self rq_viewFromXib];
  453. view.frame = frame;
  454. return view;
  455. }
  456. - (void)setRq_x:(CGFloat)rq_x {
  457. CGRect frame = self.frame;
  458. frame.origin.x = rq_x;
  459. self.frame = frame;
  460. }
  461. - (CGFloat)rq_x {
  462. return self.frame.origin.x;
  463. }
  464. - (void)setRq_y:(CGFloat)rq_y {
  465. CGRect frame = self.frame;
  466. frame.origin.y = rq_y;
  467. self.frame = frame;
  468. }
  469. - (CGFloat)rq_y {
  470. return self.frame.origin.y;
  471. }
  472. - (void)setRq_centerX:(CGFloat)rq_centerX {
  473. CGPoint center = self.center;
  474. center.x = rq_centerX;
  475. self.center = center;
  476. }
  477. - (CGFloat)rq_centerX {
  478. return self.center.x;
  479. }
  480. - (void)setRq_centerY:(CGFloat)rq_centerY {
  481. CGPoint center = self.center;
  482. center.y = rq_centerY;
  483. self.center = center;
  484. }
  485. - (CGFloat)rq_centerY {
  486. return self.center.y;
  487. }
  488. - (void)setRq_width:(CGFloat)rq_width {
  489. CGRect frame = self.frame;
  490. frame.size.width = rq_width;
  491. self.frame = frame;
  492. }
  493. - (CGFloat)rq_width {
  494. return self.frame.size.width;
  495. }
  496. - (void)setRq_height:(CGFloat)rq_height {
  497. CGRect frame = self.frame;
  498. frame.size.height = rq_height;
  499. self.frame = frame;
  500. }
  501. - (CGFloat)rq_height {
  502. return self.frame.size.height;
  503. }
  504. - (void)setRq_size:(CGSize)rq_size {
  505. CGRect frame = self.frame;
  506. frame.size = rq_size;
  507. self.frame = frame;
  508. }
  509. - (CGSize)rq_size {
  510. return self.frame.size;
  511. }
  512. - (void)setRq_origin:(CGPoint)rq_origin {
  513. CGRect frame = self.frame;
  514. frame.origin = rq_origin;
  515. self.frame = frame;
  516. }
  517. - (CGPoint)rq_origin {
  518. return self.frame.origin;
  519. }
  520. - (void)setRq_top:(CGFloat)rq_top {
  521. CGRect frame = self.frame;
  522. frame.origin.y = rq_top;
  523. self.frame = frame;
  524. }
  525. - (CGFloat)rq_top {
  526. return self.frame.origin.y;
  527. }
  528. - (void)setRq_left:(CGFloat)rq_left {
  529. CGRect frame = self.frame;
  530. frame.origin.x = rq_left;
  531. self.frame = frame;
  532. }
  533. - (CGFloat)rq_left{
  534. return self.frame.origin.x;
  535. }
  536. - (void)setRq_bottom:(CGFloat)rq_bottom{
  537. CGRect frame = self.frame;
  538. frame.origin.y = rq_bottom - frame.size.height;
  539. self.frame = frame;
  540. }
  541. - (CGFloat)rq_bottom {
  542. return self.frame.origin.y + self.frame.size.height;
  543. }
  544. - (void)setRq_right:(CGFloat)rq_right {
  545. CGRect frame = self.frame;
  546. frame.origin.x = rq_right - frame.size.width;
  547. self.frame = frame;
  548. }
  549. - (CGFloat)rq_right {
  550. return self.frame.origin.x + self.frame.size.width;
  551. }
  552. - (void)addTapActionWithBlock:(GestureActionBlock)block
  553. {
  554. UITapGestureRecognizer *gesture = objc_getAssociatedObject(self, &kActionHandlerTapGestureKey);
  555. if (!gesture)
  556. {
  557. gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleActionForTapGesture:)];
  558. [self addGestureRecognizer:gesture];
  559. objc_setAssociatedObject(self, &kActionHandlerTapGestureKey, gesture, OBJC_ASSOCIATION_RETAIN);
  560. }
  561. objc_setAssociatedObject(self, &kActionHandlerTapBlockKey, block, OBJC_ASSOCIATION_COPY);
  562. }
  563. - (void)handleActionForTapGesture:(UITapGestureRecognizer*)gesture
  564. {
  565. if (gesture.state == UIGestureRecognizerStateRecognized)
  566. {
  567. GestureActionBlock block = objc_getAssociatedObject(self, &kActionHandlerTapBlockKey);
  568. if (block)
  569. {
  570. block(gesture);
  571. }
  572. }
  573. }
  574. - (void)addLongPressActionWithBlock:(GestureActionBlock)block
  575. {
  576. UILongPressGestureRecognizer *gesture = objc_getAssociatedObject(self, &kActionHandlerLongPressGestureKey);
  577. if (!gesture)
  578. {
  579. gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleActionForLongPressGesture:)];
  580. [self addGestureRecognizer:gesture];
  581. objc_setAssociatedObject(self, &kActionHandlerLongPressGestureKey, gesture, OBJC_ASSOCIATION_RETAIN);
  582. }
  583. objc_setAssociatedObject(self, &kActionHandlerLongPressBlockKey, block, OBJC_ASSOCIATION_COPY);
  584. }
  585. - (void)handleActionForLongPressGesture:(UITapGestureRecognizer*)gesture
  586. {
  587. if (gesture.state == UIGestureRecognizerStateRecognized)
  588. {
  589. GestureActionBlock block = objc_getAssociatedObject(self, &kActionHandlerLongPressBlockKey);
  590. if (block)
  591. {
  592. block(gesture);
  593. }
  594. }
  595. }
  596. @end