SLGridView.m 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. //
  2. // SLGridView.m
  3. //
  4. // Created by wsl on 2019/10/27.
  5. // Copyright © 2019 wsl. All rights reserved.
  6. //
  7. #import "SLGridView.h"
  8. /// 网格遮罩层 网格透明层
  9. @interface SLGridMaskLayer : CAShapeLayer
  10. /// 遮罩颜色
  11. @property (nonatomic, assign) CGColorRef maskColor;
  12. /// 遮罩区域的非交集区域
  13. @property (nonatomic, setter=setMaskRect:) CGRect maskRect;
  14. @end
  15. @implementation SLGridMaskLayer
  16. //@synthesize maskColor = _maskColor;
  17. #pragma mark - Override
  18. - (instancetype)init {
  19. self = [super init];
  20. if (self) {
  21. self.contentsScale = [[UIScreen mainScreen] scale];
  22. }
  23. return self;
  24. }
  25. - (void)setMaskColor:(CGColorRef)maskColor {
  26. self.fillColor = maskColor;
  27. // 填充规则 maskRect和bounds的非交集
  28. self.fillRule = kCAFillRuleEvenOdd;
  29. }
  30. - (void)setMaskRect:(CGRect)maskRect {
  31. [self setMaskRect:maskRect animated:NO];
  32. }
  33. - (CGColorRef)maskColor {
  34. return self.fillColor;
  35. }
  36. - (void)setMaskRect:(CGRect)maskRect animated:(BOOL)animated {
  37. CGMutablePathRef mPath = CGPathCreateMutable();
  38. CGPathAddRect(mPath, NULL, self.bounds);
  39. CGPathAddRect(mPath, NULL, maskRect);
  40. [self removeAnimationForKey:@"SL_maskLayer_opacityAnimate"];
  41. if (animated) {
  42. CABasicAnimation *animate = [CABasicAnimation animationWithKeyPath:@"opacity"];
  43. animate.duration = 0.25f;
  44. animate.fromValue = @(0.0);
  45. animate.toValue = @(1.0);
  46. self.path = mPath;
  47. [self addAnimation:animate forKey:@"SL_maskLayer_opacityAnimate"];
  48. } else {
  49. self.path = mPath;
  50. }
  51. }
  52. @end
  53. /// 网格层
  54. @interface SLGridLayer : CAShapeLayer
  55. ///网格区域 默认CGRectZero
  56. @property (nonatomic, assign) CGRect gridRect;
  57. ///网格颜色 默认黑色
  58. @property (nonatomic, strong) UIColor *gridColor;
  59. /// 背景 默认透明
  60. @property (nonatomic, strong) UIColor *bgColor;
  61. @end
  62. @implementation SLGridLayer
  63. - (instancetype)init {
  64. self = [super init];
  65. if (self) {
  66. self.contentsScale = [[UIScreen mainScreen] scale];
  67. _bgColor = [UIColor clearColor];
  68. _gridColor = [UIColor blackColor];
  69. self.shadowColor = [UIColor blackColor].CGColor;
  70. self.shadowRadius = 3.f;
  71. self.shadowOffset = CGSizeZero;
  72. self.shadowOpacity = .5f;
  73. }
  74. return self;
  75. }
  76. - (void)setGridRect:(CGRect)gridRect {
  77. [self setGridRect:gridRect animated:NO];
  78. }
  79. - (void)setGridRect:(CGRect)gridRect animated:(BOOL)animated {
  80. if (!CGRectEqualToRect(_gridRect, gridRect)) {
  81. _gridRect = gridRect;
  82. CGPathRef path = [self drawGrid];
  83. if (animated) {
  84. CABasicAnimation *animate = [CABasicAnimation animationWithKeyPath:@"path"];
  85. animate.duration = 0.25f;
  86. animate.fromValue = (__bridge id _Nullable)(self.path);
  87. animate.toValue = (__bridge id _Nullable)(path);
  88. // animate.fillMode=kCAFillModeForwards;
  89. [self addAnimation:animate forKey:@"lf_gridLayer_contentsRectAnimate"];
  90. }
  91. self.path = path;
  92. }
  93. }
  94. - (CGPathRef)drawGrid {
  95. self.fillColor = self.bgColor.CGColor;
  96. self.strokeColor = self.gridColor.CGColor;
  97. CGRect rct = self.gridRect;
  98. UIBezierPath *path = [[UIBezierPath alloc] init];
  99. CGFloat dW = 0;
  100. for(int i=0;i<4;++i){ /** 竖线 */
  101. [path moveToPoint:CGPointMake(rct.origin.x+dW, rct.origin.y)];
  102. [path addLineToPoint:CGPointMake(rct.origin.x+dW, rct.origin.y+rct.size.height)];
  103. dW += _gridRect.size.width/3;
  104. }
  105. dW = 0;
  106. for(int i=0;i<4;++i){ /** 横线 */
  107. [path moveToPoint:CGPointMake(rct.origin.x, rct.origin.y+dW)];
  108. [path addLineToPoint:CGPointMake(rct.origin.x+rct.size.width, rct.origin.y+dW)];
  109. dW += rct.size.height/3;
  110. }
  111. /** 偏移量 */
  112. CGFloat offset = 1;
  113. /** 长度 */
  114. CGFloat cornerlength = 15.f;
  115. CGRect newRct = CGRectInset(rct, -offset, -offset);
  116. /** 左上角 */
  117. [path moveToPoint:CGPointMake(CGRectGetMinX(newRct) , CGRectGetMinY(newRct)+cornerlength)];
  118. [path addLineToPoint:CGPointMake(CGRectGetMinX(newRct) , CGRectGetMinY(newRct))];
  119. [path addLineToPoint:CGPointMake(CGRectGetMinX(newRct)+cornerlength , CGRectGetMinY(newRct))];
  120. /** 右上角 */
  121. [path moveToPoint:CGPointMake(CGRectGetMaxX(newRct)-cornerlength , CGRectGetMinY(newRct))];
  122. [path addLineToPoint:CGPointMake(CGRectGetMaxX(newRct) , CGRectGetMinY(newRct))];
  123. [path addLineToPoint:CGPointMake(CGRectGetMaxX(newRct) , CGRectGetMinY(newRct)+cornerlength)];
  124. /** 右下角 */
  125. [path moveToPoint:CGPointMake(CGRectGetMaxX(newRct) , CGRectGetMaxY(newRct)-cornerlength)];
  126. [path addLineToPoint:CGPointMake(CGRectGetMaxX(newRct) , CGRectGetMaxY(newRct))];
  127. [path addLineToPoint:CGPointMake(CGRectGetMaxX(newRct)-cornerlength , CGRectGetMaxY(newRct))];
  128. /** 左下角 */
  129. [path moveToPoint:CGPointMake(CGRectGetMinX(newRct)+cornerlength , CGRectGetMaxY(newRct))];
  130. [path addLineToPoint:CGPointMake(CGRectGetMinX(newRct) , CGRectGetMaxY(newRct))];
  131. [path addLineToPoint:CGPointMake(CGRectGetMinX(newRct) , CGRectGetMaxY(newRct)-cornerlength)];
  132. return path.CGPath;
  133. }
  134. @end
  135. @class SLResizeControl;
  136. @protocol SLResizeControlDelegate <NSObject>
  137. /// 开始
  138. - (void)resizeConrolDidBeginResizing:(SLResizeControl *)resizeConrol;
  139. - (void)resizeConrolDidResizing:(SLResizeControl *)resizeConrol;
  140. - (void)resizeConrolDidEndResizing:(SLResizeControl *)resizeConrol;
  141. @end
  142. /// 网格四边和四角控制大小的透明视图
  143. @interface SLResizeControl : UIView
  144. @property (weak, nonatomic) id<SLResizeControlDelegate> delegate;
  145. @property (nonatomic, readwrite) CGPoint translation;
  146. @property (nonatomic) CGPoint startPoint;
  147. @property (nonatomic, getter=isEnabled) BOOL enabled; //手势是否可用
  148. @property (nonatomic, strong) UIPanGestureRecognizer *gestureRecognizer;
  149. @end
  150. @implementation SLResizeControl
  151. - (id)initWithFrame:(CGRect)frame {
  152. self = [super initWithFrame:frame];
  153. if (self) {
  154. self.backgroundColor = [UIColor clearColor];
  155. UIPanGestureRecognizer *gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
  156. [self addGestureRecognizer:gestureRecognizer];
  157. _gestureRecognizer = gestureRecognizer;
  158. }
  159. return self;
  160. }
  161. - (BOOL)isEnabled {
  162. return _gestureRecognizer.isEnabled;
  163. }
  164. - (void)setEnabled:(BOOL)enabled {
  165. _gestureRecognizer.enabled = enabled;
  166. }
  167. - (void)handlePan:(UIPanGestureRecognizer *)gestureRecognizer {
  168. if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
  169. CGPoint translationInView = [gestureRecognizer translationInView:self.superview];
  170. self.startPoint = CGPointMake(roundf(translationInView.x), translationInView.y);
  171. if ([self.delegate respondsToSelector:@selector(resizeConrolDidBeginResizing:)]) {
  172. [self.delegate resizeConrolDidBeginResizing:self];
  173. }
  174. } else if (gestureRecognizer.state == UIGestureRecognizerStateChanged) {
  175. CGPoint translation = [gestureRecognizer translationInView:self.superview];
  176. self.translation = CGPointMake(roundf(self.startPoint.x + translation.x),
  177. roundf(self.startPoint.y + translation.y));
  178. if ([self.delegate respondsToSelector:@selector(resizeConrolDidResizing:)]) {
  179. [self.delegate resizeConrolDidResizing:self];
  180. }
  181. } else if (gestureRecognizer.state == UIGestureRecognizerStateEnded || gestureRecognizer.state == UIGestureRecognizerStateCancelled) {
  182. if ([self.delegate respondsToSelector:@selector(resizeConrolDidEndResizing:)]) {
  183. [self.delegate resizeConrolDidEndResizing:self];
  184. }
  185. }
  186. }
  187. @end
  188. // 网格四角和边的 可控范围
  189. const CGFloat kSLControlWidth = 30.f;
  190. //网格视图
  191. @interface SLGridView ()<SLResizeControlDelegate>
  192. @property (nonatomic, strong) SLGridLayer *gridLayer; //网格层
  193. @property (nonatomic, strong) SLGridMaskLayer *gridMaskLayer; // 半透明遮罩层
  194. @property (nonatomic, assign) CGRect initialRect; //高亮网格框的初始区域
  195. //四个角
  196. @property (nonatomic, strong) SLResizeControl *topLeftCornerView;
  197. @property (nonatomic, strong) SLResizeControl *topRightCornerView;
  198. @property (nonatomic, strong) SLResizeControl *bottomLeftCornerView;
  199. @property (nonatomic, strong) SLResizeControl *bottomRightCornerView;
  200. //四条边
  201. @property (nonatomic, strong) SLResizeControl *topEdgeView;
  202. @property (nonatomic, strong) SLResizeControl *leftEdgeView;
  203. @property (nonatomic, strong) SLResizeControl *bottomEdgeView;
  204. @property (nonatomic, strong) SLResizeControl *rightEdgeView;
  205. @end
  206. @implementation SLGridView
  207. #pragma mark - Override
  208. - (instancetype)initWithFrame:(CGRect)frame {
  209. self = [super initWithFrame:frame];
  210. if (self) {
  211. [self setupUI];
  212. }
  213. return self;
  214. }
  215. - (void)layoutSubviews {
  216. [super layoutSubviews];
  217. self.gridLayer.frame = self.bounds;
  218. self.gridMaskLayer.frame = self.bounds;
  219. [self updateResizeControlFrame];
  220. }
  221. // 事件传给下层的缩放视图SLZoomView
  222. - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
  223. UIView *view = [super hitTest:point withEvent:event];
  224. if (self == view) {
  225. return nil;
  226. }
  227. [self enableCornerViewUserInteraction:view];
  228. return view;
  229. }
  230. // 设置控制网格大小视图的用户交互 防止手指同时控制多个按钮
  231. - (void)enableCornerViewUserInteraction:(UIView *)view {
  232. for (UIView *control in self.subviews) {
  233. if ([control isKindOfClass:[SLResizeControl class]]) {
  234. if (view) {
  235. if (control == view) {
  236. control.userInteractionEnabled = YES;
  237. } else {
  238. control.userInteractionEnabled = NO;
  239. }
  240. } else {
  241. control.userInteractionEnabled = YES;
  242. }
  243. }
  244. }
  245. }
  246. #pragma mark - UI
  247. - (void)setupUI {
  248. self.minGridSize = CGSizeMake(60, 60);
  249. self.maxGridRect = CGRectInset(self.bounds, 20, 20);
  250. self.originalGridSize = self.gridRect.size;
  251. self.showMaskLayer = YES;
  252. [self.layer addSublayer:self.gridMaskLayer];
  253. [self.layer addSublayer:self.gridLayer];
  254. self.topLeftCornerView = [self createResizeControl];
  255. self.topRightCornerView = [self createResizeControl];
  256. self.bottomLeftCornerView = [self createResizeControl];
  257. self.bottomRightCornerView = [self createResizeControl];
  258. self.topEdgeView = [self createResizeControl];
  259. self.leftEdgeView = [self createResizeControl];
  260. self.bottomEdgeView = [self createResizeControl];
  261. self.rightEdgeView = [self createResizeControl];
  262. }
  263. - (SLResizeControl *)createResizeControl {
  264. SLResizeControl *control = [[SLResizeControl alloc] initWithFrame:(CGRect){CGPointZero, CGSizeMake(kSLControlWidth, kSLControlWidth)}];
  265. control.delegate = self;
  266. // control.backgroundColor = [UIColor redColor];
  267. [self addSubview:control];
  268. control.userInteractionEnabled = YES;
  269. return control;
  270. }
  271. #pragma mark - Getter
  272. - (SLGridMaskLayer *)gridMaskLayer {
  273. if (!_gridMaskLayer) {
  274. _gridMaskLayer = [[SLGridMaskLayer alloc] init];
  275. _gridMaskLayer.frame = self.bounds;
  276. _gridMaskLayer.maskColor = [UIColor colorWithWhite:.0f alpha:0.6f].CGColor;
  277. }
  278. return _gridMaskLayer;
  279. }
  280. - (SLGridLayer *)gridLayer {
  281. if (!_gridLayer) {
  282. _gridLayer = [[SLGridLayer alloc] init];
  283. _gridLayer.frame = self.bounds;
  284. _gridLayer.lineWidth = 2.f;
  285. _gridLayer.gridColor = [UIColor whiteColor];
  286. _gridLayer.gridRect = CGRectInset(self.bounds, 20, 20);
  287. }
  288. return _gridLayer;
  289. }
  290. #pragma mark - Setter
  291. - (void)setGridRect:(CGRect)gridRect {
  292. [self setGridRect:gridRect maskLayer:YES];
  293. }
  294. - (void)setShowMaskLayer:(BOOL)showMaskLayer {
  295. if (_showMaskLayer != showMaskLayer) {
  296. _showMaskLayer = showMaskLayer;
  297. if (showMaskLayer) {
  298. /** 还原遮罩 */
  299. [self.gridMaskLayer setMaskRect:self.gridRect animated:YES];
  300. } else {
  301. /** 扩大遮罩范围 */
  302. [self.gridMaskLayer setMaskRect:self.gridMaskLayer.bounds animated:YES];
  303. }
  304. }
  305. /** 简单粗暴的禁用拖动事件 */
  306. self.userInteractionEnabled = showMaskLayer;
  307. }
  308. #pragma mark - HelpMethods
  309. - (void)setGridRect:(CGRect)gridRect maskLayer:(BOOL)isMaskLayer {
  310. [self setGridRect:gridRect maskLayer:isMaskLayer animated:NO];
  311. }
  312. //- (void)setGridRect:(CGRect)gridRect animated:(BOOL)animated {
  313. // [self setGridRect:gridRect maskLayer:NO animated:animated];
  314. //}
  315. // 更新网格区域和遮罩状态
  316. - (void)setGridRect:(CGRect)gridRect maskLayer:(BOOL)isMaskLayer animated:(BOOL)animated {
  317. if (!CGRectEqualToRect(_gridRect, gridRect)) {
  318. _gridRect = gridRect;
  319. [self setNeedsLayout];
  320. [self.gridLayer setGridRect:gridRect animated:animated];
  321. if (isMaskLayer) {
  322. [self.gridMaskLayer setMaskRect:gridRect animated:YES];
  323. }
  324. }
  325. }
  326. // 更新控制调整网格大小的四个角和边的frame
  327. - (void)updateResizeControlFrame {
  328. CGRect rect = self.gridRect;
  329. self.topLeftCornerView.frame = (CGRect){CGRectGetMinX(rect) - CGRectGetWidth(self.topLeftCornerView.bounds) / 2, CGRectGetMinY(rect) - CGRectGetHeight(self.topLeftCornerView.bounds) / 2, self.topLeftCornerView.bounds.size};
  330. self.topRightCornerView.frame = (CGRect){CGRectGetMaxX(rect) - CGRectGetWidth(self.topRightCornerView.bounds) / 2, CGRectGetMinY(rect) - CGRectGetHeight(self.topRightCornerView.bounds) / 2, self.topRightCornerView.bounds.size};
  331. self.bottomLeftCornerView.frame = (CGRect){CGRectGetMinX(rect) - CGRectGetWidth(self.bottomLeftCornerView.bounds) / 2, CGRectGetMaxY(rect) - CGRectGetHeight(self.bottomLeftCornerView.bounds) / 2, self.bottomLeftCornerView.bounds.size};
  332. self.bottomRightCornerView.frame = (CGRect){CGRectGetMaxX(rect) - CGRectGetWidth(self.bottomRightCornerView.bounds) / 2, CGRectGetMaxY(rect) - CGRectGetHeight(self.bottomRightCornerView.bounds) / 2, self.bottomRightCornerView.bounds.size};
  333. self.topEdgeView.frame = (CGRect){CGRectGetMaxX(self.topLeftCornerView.frame), CGRectGetMinY(rect) - CGRectGetHeight(self.topEdgeView.frame) / 2, CGRectGetMinX(self.topRightCornerView.frame) - CGRectGetMaxX(self.topLeftCornerView.frame), CGRectGetHeight(self.topEdgeView.bounds)};
  334. self.leftEdgeView.frame = (CGRect){CGRectGetMinX(rect) - CGRectGetWidth(self.leftEdgeView.frame) / 2, CGRectGetMaxY(self.topLeftCornerView.frame), CGRectGetWidth(self.leftEdgeView.bounds), CGRectGetMinY(self.bottomLeftCornerView.frame) - CGRectGetMaxY(self.topLeftCornerView.frame)};
  335. self.bottomEdgeView.frame = (CGRect){CGRectGetMaxX(self.bottomLeftCornerView.frame), CGRectGetMinY(self.bottomLeftCornerView.frame), CGRectGetMinX(self.bottomRightCornerView.frame) - CGRectGetMaxX(self.bottomLeftCornerView.frame), CGRectGetHeight(self.bottomEdgeView.bounds)};
  336. self.rightEdgeView.frame = (CGRect){CGRectGetMaxX(rect) - CGRectGetWidth(self.rightEdgeView.bounds) / 2, CGRectGetMaxY(self.topRightCornerView.frame), CGRectGetWidth(self.rightEdgeView.bounds), CGRectGetMinY(self.bottomRightCornerView.frame) - CGRectGetMaxY(self.topRightCornerView.frame)};
  337. }
  338. //返回正在调整网格大小时的网格区域
  339. - (CGRect)cropRectMakeWithResizeControlView:(SLResizeControl *)resizeControlView {
  340. CGRect rect = self.gridRect;
  341. if (resizeControlView == self.topEdgeView) {
  342. rect = CGRectMake(CGRectGetMinX(self.initialRect),
  343. CGRectGetMinY(self.initialRect) + resizeControlView.translation.y,
  344. CGRectGetWidth(self.initialRect),
  345. CGRectGetHeight(self.initialRect) - resizeControlView.translation.y);
  346. } else if (resizeControlView == self.leftEdgeView) {
  347. rect = CGRectMake(CGRectGetMinX(self.initialRect) + resizeControlView.translation.x,
  348. CGRectGetMinY(self.initialRect) ,
  349. CGRectGetWidth(self.initialRect) - resizeControlView.translation.x,
  350. CGRectGetHeight(self.initialRect));
  351. } else if (resizeControlView == self.bottomEdgeView) {
  352. rect = CGRectMake(CGRectGetMinX(self.initialRect) ,
  353. CGRectGetMinY(self.initialRect),
  354. CGRectGetWidth(self.initialRect) ,
  355. CGRectGetHeight(self.initialRect) + resizeControlView.translation.y);
  356. } else if (resizeControlView == self.rightEdgeView) {
  357. rect = CGRectMake(CGRectGetMinX(self.initialRect),
  358. CGRectGetMinY(self.initialRect),
  359. CGRectGetWidth(self.initialRect) + resizeControlView.translation.x,
  360. CGRectGetHeight(self.initialRect));
  361. } else if (resizeControlView == self.topLeftCornerView) {
  362. rect = CGRectMake(CGRectGetMinX(self.initialRect) + resizeControlView.translation.x,
  363. CGRectGetMinY(self.initialRect) + resizeControlView.translation.y,
  364. CGRectGetWidth(self.initialRect) - resizeControlView.translation.x,
  365. CGRectGetHeight(self.initialRect) - resizeControlView.translation.y);
  366. } else if (resizeControlView == self.topRightCornerView) {
  367. rect = CGRectMake(CGRectGetMinX(self.initialRect),
  368. CGRectGetMinY(self.initialRect) + resizeControlView.translation.y,
  369. CGRectGetWidth(self.initialRect) + resizeControlView.translation.x,
  370. CGRectGetHeight(self.initialRect) - resizeControlView.translation.y);
  371. } else if (resizeControlView == self.bottomLeftCornerView) {
  372. rect = CGRectMake(CGRectGetMinX(self.initialRect) + resizeControlView.translation.x,
  373. CGRectGetMinY(self.initialRect),
  374. CGRectGetWidth(self.initialRect) - resizeControlView.translation.x,
  375. CGRectGetHeight(self.initialRect) + resizeControlView.translation.y);
  376. } else if (resizeControlView == self.bottomRightCornerView) {
  377. rect = CGRectMake(CGRectGetMinX(self.initialRect),
  378. CGRectGetMinY(self.initialRect),
  379. CGRectGetWidth(self.initialRect) + resizeControlView.translation.x,
  380. CGRectGetHeight(self.initialRect) + resizeControlView.translation.y);
  381. }
  382. /** 限制x/y 超出左上角 最大限度 */
  383. if (ceil(rect.origin.x) < ceil(CGRectGetMinX(_maxGridRect))) {
  384. rect.origin.x = _maxGridRect.origin.x;
  385. rect.size.width = CGRectGetMaxX(self.initialRect)-rect.origin.x;
  386. }
  387. if (ceil(rect.origin.y) < ceil(CGRectGetMinY(_maxGridRect))) {
  388. rect.origin.y = _maxGridRect.origin.y;
  389. rect.size.height = CGRectGetMaxY(self.initialRect)-rect.origin.y;
  390. }
  391. /** 限制宽度/高度 超出 最大限度 */
  392. if (ceil(rect.origin.x+rect.size.width) > ceil(CGRectGetMaxX(_maxGridRect))) {
  393. rect.size.width = CGRectGetMaxX(_maxGridRect) - CGRectGetMinX(rect);
  394. }
  395. if (ceil(rect.origin.y+rect.size.height) > ceil(CGRectGetMaxY(_maxGridRect))) {
  396. rect.size.height = CGRectGetMaxY(_maxGridRect) - CGRectGetMinY(rect);
  397. }
  398. /** 限制宽度/高度 小于 最小限度 */
  399. if (ceil(rect.size.width) <= ceil(_minGridSize.width)) {
  400. /** 左上、左、左下 处理x最小值 */
  401. if (resizeControlView == self.topLeftCornerView || resizeControlView == self.leftEdgeView || resizeControlView == self.bottomLeftCornerView) {
  402. rect.origin.x = CGRectGetMaxX(self.initialRect) - _minGridSize.width;
  403. }
  404. rect.size.width = _minGridSize.width;
  405. }
  406. if (ceil(rect.size.height) <= ceil(_minGridSize.height)) {
  407. /** 左上、上、右上 处理y最小值底部 */
  408. if (resizeControlView == self.topLeftCornerView || resizeControlView == self.topEdgeView || resizeControlView == self.topRightCornerView) {
  409. rect.origin.y = CGRectGetMaxY(self.initialRect) - _minGridSize.height;
  410. }
  411. rect.size.height = _minGridSize.height;
  412. }
  413. return rect;
  414. }
  415. #pragma mark - SLResizeControlDelegate
  416. - (void)resizeConrolDidBeginResizing:(SLResizeControl *)resizeConrol {
  417. self.initialRect = self.gridRect;
  418. _dragging = YES;
  419. self.showMaskLayer = NO;
  420. if ([self.delegate respondsToSelector:@selector(gridViewDidBeginResizing:)]) {
  421. [self.delegate gridViewDidBeginResizing:self];
  422. }
  423. }
  424. - (void)resizeConrolDidResizing:(SLResizeControl *)resizeConrol {
  425. CGRect gridRect = [self cropRectMakeWithResizeControlView:resizeConrol];
  426. [self setGridRect:gridRect maskLayer:NO];
  427. if ([self.delegate respondsToSelector:@selector(gridViewDidResizing:)]) {
  428. [self.delegate gridViewDidResizing:self];
  429. }
  430. }
  431. - (void)resizeConrolDidEndResizing:(SLResizeControl *)resizeConrol {
  432. [self enableCornerViewUserInteraction:nil];
  433. _dragging = NO;
  434. self.showMaskLayer = YES;
  435. if ([self.delegate respondsToSelector:@selector(gridViewDidEndResizing:)]) {
  436. [self.delegate gridViewDidEndResizing:self];
  437. }
  438. }
  439. @end