├── README.md ├── UIView+MMLayout.h └── UIView+MMLayout.m /README.md: -------------------------------------------------------------------------------- 1 | # MMLayout 2 | - 简单的Frame 设置封装 支持链接方式编程 3 | 4 | ### 链接方式编写 5 | 6 | ```objc 7 | 8 | UIView *newView = [UIView new]; 9 | [self.view addSubview:newView]; 10 | newView.m_height(50).m_width(100).m_right(10).m_top(10); 11 | 12 | ``` 13 | ### 父类居中 14 | ```objc 15 | 16 | 设置父类居中前提是自己本身有宽度和高度 17 | UIView *newView = [UIView new]; 18 | [self.view addSubview:newView]; 19 | newView.m_height(50).m_width(100).m_center(); 20 | 21 | ``` 22 | 23 | ### 相同设置 24 | ```objc 25 | 26 | UIView *redView = [UIView new]; 27 | [self.view addSubview:redView]; 28 | 29 | UIView *redView1 = [UIView new]; 30 | [self.view addSubview:redView1]; 31 | 32 | UIView *redView2 = [UIView new]; 33 | [self.view addSubview:redView2]; 34 | 35 | UIView *redView3 = [UIView new]; 36 | [self.view addSubview:redView3]; 37 | 38 | redView.m_left(10).m_top(10).m_size(CGSize(50,50)); 39 | 40 | redView1.m_equalToTop(redView).m_equalToSize(redView).m_left(redView.mm_maxX + 10); 41 | 42 | redView2.m_equalToTop(redView1).m_equalToSize(redView1).m_left(redView1.mm_maxX + 10); 43 | 44 | redView3.m_equalToTop(redView2).m_equalToSize(redView2).m_left(redView2.mm_maxX + 10); 45 | 46 | 47 | ``` 48 | 49 | 50 | 以上就是简单的使用方式 链接方式 和block的方式 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /UIView+MMLayout.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+MM.h 3 | /* 4 | 杜蒙 iOS开发 5 | */ 6 | 7 | #define m_weakify(object) autoreleasepool {} __weak typeof(object) weak##object = object 8 | #define m_strongify(object) autoreleasepool {} __strong typeof(weak##object) object = weak##object 9 | 10 | #import 11 | @class MMLayout; 12 | @interface UIView (Layout) 13 | @property (strong , nonatomic , readonly) MMLayout *mm_selfLayout; 14 | - (void)setMm_x:(CGFloat)mm_x; ///<< set frame.x 15 | - (CGFloat)mm_x; ///<< get frame.x 16 | - (void)setMm_y:(CGFloat)mm_y; ///<< set frame.y 17 | - (CGFloat)mm_y; ///<< get frame.y 18 | - (void)setMm_w:(CGFloat)mm_w; ///<< set frame.bounds.size.width 19 | - (CGFloat)mm_w; ///<< get frame.bounds.size.width 20 | - (void)setMm_h:(CGFloat)mm_h; ///<< set frame.bounds.size.height 21 | - (CGFloat)mm_h; ///<< get frame.bounds.size.height 22 | - (void)setMm_center:(CGPoint )mm_center; ///<< set frame.origin 23 | - (CGPoint)mm_center; ///<< get frame origin 24 | - (CGFloat)mm_centerX; ///<< get self.center.x 25 | - (CGFloat)mm_centerY; ///<< get self.center.y 26 | - (CGFloat)mm_maxY; ///<< get CGRectGetMaxY 27 | - (CGFloat)mm_minY; ///<< get CGRectGetMinY 28 | - (CGFloat)mm_maxX; ///<< get CGRectGetMaxX 29 | - (CGFloat)mm_minX; ///<< get CGRectGetMinX 30 | - (CGFloat)mm_halfW; ///<< get self.width / 2 31 | - (CGFloat)mm_halfH; ///<< get self.height / 2 32 | - (CGFloat)mm_halfX; ///<< get self.x / 2 33 | - (CGFloat)mm_halfY; ///<< get self.y / 2 34 | - (CGFloat)mm_halfCenterX; ///<< get self.centerX / 2 35 | - (CGFloat)mm_halfCenterY; ///<< get self.centerY / 2 36 | - (void)setMm_size:(CGSize)mm_size; 37 | - (CGSize)mm_size; ///<< get self.bounds.size 38 | 39 | /* 40 | 示例链接编程 41 | self.width(100).height(100).left(10).top(10) 42 | */ 43 | - (UIView * (^)(CGFloat top))m_top; ///< set frame y 44 | - (UIView * (^)(CGFloat bottom))m_bottom; ///< set frame y 45 | - (UIView * (^)(CGFloat left))m_left; ///< set frame x 46 | - (UIView * (^)(CGFloat right))m_right; ///< set frame x 47 | - (UIView * (^)(CGFloat width))m_width; ///< set frame width 48 | - (UIView * (^)(CGFloat height))m_height; ///< set frame height 49 | - (UIView * (^)(CGSize size))m_size; ///< set frame size 50 | - (UIView * (^)(CGPoint center))m__center; ///< set frame point 51 | - (UIView * (^)())m_center; ///< set frame center 前提是有w h 调用次方法居中父类 52 | 53 | 54 | - (UIView * (^)(UIView *obj))m_equalToFrame; /// equalTo frame 55 | - (UIView * (^)(UIView *obj))m_equalToTop; /// equalTo top 56 | - (UIView * (^)(UIView *obj))m_equalToBottom; /// equalTo Bottom 57 | - (UIView * (^)(UIView *obj))m_equalToLeft; /// equalTo left 58 | - (UIView * (^)(UIView *obj))m_equalToRight; /// equalTo right 59 | - (UIView * (^)(UIView *obj))m_equalToWidth; /// equalTo width 60 | - (UIView * (^)(UIView *obj))m_equalToHeight; /// equalTo height 61 | - (UIView * (^)(UIView *obj))m_equalToSize; /// equalTo size 62 | - (UIView * (^)(UIView *obj))m_equalToCenter; /// equalTo center 63 | 64 | 65 | - (NSData *)mm_createPDF;/// create self PDF 66 | 67 | - (UIViewController *)viewController; //self Responder UIViewControler 68 | 69 | @end 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /UIView+MMLayout.m: -------------------------------------------------------------------------------- 1 | 2 | 3 | #import "UIView+MMLayout.h" 4 | #import 5 | 6 | #pragma mark - MMLayout 7 | @interface MMLayout : NSObject 8 | /* 9 | @LayoutView 传入进去 View 10 | */ 11 | -(instancetype)initWithLayoutView:(UIView *)LayoutView; 12 | @property (assign , nonatomic) CGFloat top; ///<< frame y 13 | @property (assign , nonatomic) CGFloat bottom; ///<< y = super.h - LayoutView.h - bottom 14 | @property (assign , nonatomic) CGFloat left; ///<< frame x 15 | @property (assign , nonatomic) CGFloat right; ///<< x = super.w - LayoutView.h - right 16 | @property (assign , nonatomic) CGFloat width; ///<< frame w 17 | @property (assign , nonatomic) CGFloat height; ///<< frame height 18 | @property (assign , nonatomic) CGSize size; ///<< frame bounds size width height 19 | @property (assign , nonatomic) CGPoint point; ///<< frame point 20 | - (void)center; ///<<调用此方法前必须先设置自己的宽高 (默认是居中父控件) 21 | @property (weak , nonatomic) UIView *layoutView; 22 | @end 23 | @implementation MMLayout 24 | -(instancetype)initWithLayoutView:(UIView *)LayoutView{ 25 | if (self=[super init]) { 26 | self.layoutView = LayoutView; 27 | } 28 | return self; 29 | } 30 | -(void)setLeft:(CGFloat)left{ 31 | CGRect frame = self.layoutView.frame; 32 | frame.origin.x = left; 33 | self.layoutView.frame = frame; 34 | 35 | } 36 | -(CGFloat)left{ 37 | return self.layoutView.frame.origin.x; 38 | } 39 | -(void)setTop:(CGFloat)top{ 40 | CGRect frame = self.layoutView.frame; 41 | frame.origin.y = top; 42 | self.layoutView.frame = frame; 43 | } 44 | - (CGFloat)top{ 45 | return self.layoutView.frame.origin.y; 46 | } 47 | -(void)setRight:(CGFloat)right{ 48 | 49 | UIView *superview = self.layoutView.superview; 50 | self.layoutView.mm_x = superview.mm_w - self.layoutView.mm_w - right; 51 | } 52 | -(CGFloat)right{ 53 | CGRect superFrame = self.layoutView.superview.frame; 54 | return superFrame.size.width - self.layoutView.mm_maxX; 55 | } 56 | -(void)setBottom:(CGFloat)bottom{ 57 | UIView *superview = self.layoutView.superview; 58 | self.layoutView.mm_y = superview.mm_h - self.layoutView.mm_h - bottom; 59 | } 60 | -(CGFloat)bottom{ 61 | CGRect superFrame = self.layoutView.superview.frame; 62 | return superFrame.size.height - self.layoutView.mm_maxY; 63 | } 64 | -(void)setHeight:(CGFloat)height{ 65 | CGRect frame = self.layoutView.frame; 66 | frame.size.height = height; 67 | self.layoutView.frame = frame; 68 | } 69 | -(CGFloat)height{ 70 | return self.layoutView.frame.size.height; 71 | } 72 | -(void)setWidth:(CGFloat)width{ 73 | CGRect frame = self.layoutView.frame; 74 | frame.size.width = width; 75 | self.layoutView.frame = frame; 76 | } 77 | -(CGFloat)width{ 78 | return self.layoutView.frame.size.width; 79 | } 80 | -(void)setPoint:(CGPoint)point{ 81 | CGRect frame = self.layoutView.frame; 82 | frame.origin = point; 83 | self.layoutView.frame = frame; 84 | } 85 | -(CGPoint)point{ 86 | return self.layoutView.frame.origin; 87 | } 88 | -(void)setSize:(CGSize )size{ 89 | CGRect frame = self.layoutView.frame; 90 | frame.size = size; 91 | self.layoutView.frame = frame; 92 | } 93 | -(CGSize)size{ 94 | return self.layoutView.mm_size; 95 | } 96 | 97 | -(void)center{ 98 | UIView *superview = self.layoutView.superview; 99 | self.layoutView.mm_x = superview.mm_halfW - self.layoutView.mm_halfW; 100 | self.layoutView.mm_y = superview.mm_halfH - self.layoutView.mm_halfH; 101 | } 102 | @end 103 | const void *_layoutKey; 104 | @implementation UIView (Layout) 105 | #pragma mark - frame 106 | - (void)setMm_x:(CGFloat)mm_x{ 107 | [self mm_selfLayout].left = mm_x; 108 | } 109 | - (CGFloat)mm_x{ 110 | return self.frame.origin.x; 111 | } 112 | - (void)setMm_y:(CGFloat)mm_y{ 113 | [self mm_selfLayout].top = mm_y; 114 | } 115 | - (CGFloat)mm_y{ 116 | return self.frame.origin.y; 117 | } 118 | - (void)setMm_w:(CGFloat)mm_w{ 119 | [self mm_selfLayout].width = mm_w; 120 | } 121 | - (CGFloat)mm_w{ 122 | return self.frame.size.width; 123 | } 124 | - (void)setMm_h:(CGFloat)mm_h{ 125 | [self mm_selfLayout].height = mm_h; 126 | } 127 | - (CGFloat)mm_h{ 128 | return self.frame.size.height; 129 | } 130 | -(void)setMm_center:(CGPoint)mm_center{ 131 | [self mm_selfLayout].point = mm_center; 132 | 133 | } 134 | -(CGPoint)mm_center{ 135 | return self.frame.origin; 136 | } 137 | -(CGFloat)mm_centerX{ 138 | return self.center.x; 139 | } 140 | -(CGFloat)mm_centerY{ 141 | return self.center.y; 142 | } 143 | - (CGFloat)mm_maxY{ 144 | return CGRectGetMaxY(self.frame); 145 | } 146 | - (CGFloat)mm_minY{ 147 | return CGRectGetMinY(self.frame); 148 | } 149 | - (CGFloat)mm_maxX{ 150 | return CGRectGetMaxX(self.frame); 151 | } 152 | - (CGFloat)mm_minX{ 153 | return CGRectGetMinX(self.frame); 154 | } 155 | - (CGFloat)mm_halfW{ 156 | return self.mm_w / 2; 157 | } 158 | - (CGFloat)mm_halfH{ 159 | return self.mm_h / 2; 160 | } 161 | - (CGFloat)mm_halfX{ 162 | return self.mm_x / 2; 163 | } 164 | - (CGFloat)mm_halfY{ 165 | return self.mm_y / 2; 166 | } 167 | -(CGFloat)mm_halfCenterX{ 168 | return self.mm_centerX / 2; 169 | } 170 | -(CGFloat)mm_halfCenterY{ 171 | return self.mm_centerY / 2; 172 | } 173 | -(void)setMm_size:(CGSize)mm_size{ 174 | [self mm_selfLayout].size = mm_size; 175 | } 176 | -(CGSize)mm_size{ 177 | return self.bounds.size; 178 | } 179 | #pragma mark - set_ frame 180 | - (MMLayout *)mm_selfLayout{ 181 | MMLayout *layout = objc_getAssociatedObject(self, &_layoutKey); 182 | if (layout == nil) { 183 | layout = [[MMLayout alloc] initWithLayoutView:self]; 184 | objc_setAssociatedObject(self, &_layoutKey, layout, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 185 | } 186 | return layout; 187 | } 188 | -(UIView *(^)(CGFloat))m_top{ 189 | @m_weakify(self); 190 | return ^(CGFloat m_top){ 191 | @m_strongify(self); 192 | [self mm_selfLayout].top = m_top; 193 | return self; 194 | }; 195 | } 196 | -(UIView *(^)(CGFloat))m_bottom{ 197 | @m_weakify(self); 198 | return ^(CGFloat m_bottom){ 199 | @m_strongify(self); 200 | [self mm_selfLayout].bottom = m_bottom; 201 | return self; 202 | }; 203 | } 204 | -(UIView *(^)(CGFloat))m_left{ 205 | @m_weakify(self); 206 | return ^(CGFloat m_left){ 207 | @m_strongify(self); 208 | [self mm_selfLayout].left = m_left; 209 | return self; 210 | }; 211 | } 212 | -(UIView *(^)(CGFloat))m_right{ 213 | @m_weakify(self); 214 | return ^(CGFloat m_right){ 215 | @m_strongify(self); 216 | [self mm_selfLayout].right = m_right; 217 | return self; 218 | }; 219 | } 220 | -(UIView *(^)(CGFloat))m_width{ 221 | @m_weakify(self); 222 | return ^(CGFloat m_width){ 223 | @m_strongify(self); 224 | [self mm_selfLayout].width = m_width; 225 | return self; 226 | }; 227 | } 228 | -(UIView *(^)(CGFloat))m_height{ 229 | @m_weakify(self); 230 | return ^(CGFloat m_height){ 231 | @m_strongify(self); 232 | [self mm_selfLayout].height = m_height; 233 | return self; 234 | }; 235 | } 236 | -(UIView *(^)(CGSize))m_size{ 237 | @m_weakify(self); 238 | return ^(CGSize m_size){ 239 | @m_strongify(self); 240 | [self mm_selfLayout].size = m_size; 241 | return self; 242 | }; 243 | } 244 | - (UIView *(^)(CGPoint))m__center{ 245 | @m_weakify(self); 246 | return ^(CGPoint m__center){ 247 | @m_strongify(self); 248 | [self mm_selfLayout].point = m__center; 249 | return self; 250 | }; 251 | 252 | } 253 | -(UIView *(^)())m_center{ 254 | @m_weakify(self); 255 | return ^{ 256 | @m_strongify(self); 257 | [[self mm_selfLayout] center]; 258 | return self; 259 | }; 260 | } 261 | 262 | #pragma mark - m_equalTo 263 | -(UIView *(^)(UIView *))m_equalToFrame{ 264 | @m_weakify(self); 265 | return ^(UIView *obj){ 266 | @m_strongify(self); 267 | self.frame = obj.frame; 268 | return self; 269 | }; 270 | } 271 | -(UIView *(^)(UIView *))m_equalToTop{ 272 | @m_weakify(self); 273 | return ^(UIView *obj){ 274 | @m_strongify(self); 275 | self.mm_selfLayout.top = obj.mm_selfLayout.top; 276 | return self; 277 | }; 278 | 279 | } 280 | -(UIView *(^)(UIView *))m_equalToBottom{ 281 | @m_weakify(self); 282 | return ^(UIView *obj){ 283 | @m_strongify(self); 284 | self.mm_selfLayout.bottom = obj.mm_selfLayout.bottom; 285 | return self; 286 | }; 287 | } 288 | -(UIView *(^)(UIView *))m_equalToLeft{ 289 | @m_weakify(self); 290 | return ^(UIView *obj){ 291 | @m_strongify(self); 292 | self.mm_selfLayout.left = obj.mm_selfLayout.left; 293 | return self; 294 | }; 295 | 296 | } 297 | -(UIView *(^)(UIView *))m_equalToRight{ 298 | @m_weakify(self); 299 | return ^(UIView *obj){ 300 | @m_strongify(self); 301 | self.mm_selfLayout.right = obj.mm_selfLayout.right; 302 | return self; 303 | }; 304 | 305 | } 306 | -(UIView *(^)(UIView *))m_equalToWidth{ 307 | @m_weakify(self); 308 | return ^(UIView *obj){ 309 | @m_strongify(self); 310 | self.mm_selfLayout.width = obj.mm_selfLayout.width; 311 | return self; 312 | }; 313 | } 314 | -(UIView *(^)(UIView *))m_equalToHeight{ 315 | @m_weakify(self); 316 | return ^(UIView *obj){ 317 | @m_strongify(self); 318 | self.mm_selfLayout.height = obj.mm_selfLayout.height; 319 | return self; 320 | }; 321 | } 322 | -(UIView *(^)(UIView *))m_equalToSize{ 323 | @m_weakify(self); 324 | return ^(UIView *obj){ 325 | @m_strongify(self); 326 | [self mm_selfLayout].size = obj.mm_selfLayout.size; 327 | return self; 328 | }; 329 | } 330 | - (UIView *(^)(UIView *))m_equalToCenter{ 331 | @m_weakify(self); 332 | return ^(UIView *obj){ 333 | @m_strongify(self); 334 | [self mm_selfLayout].point = obj.mm_selfLayout.point; 335 | return self; 336 | }; 337 | } 338 | 339 | 340 | - (NSData *)mm_createPDF{ 341 | CGRect bounds = self.bounds; 342 | NSMutableData *data = [NSMutableData data]; 343 | CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData((__bridge CFMutableDataRef)data); 344 | CGContextRef context = CGPDFContextCreate(consumer, &bounds, NULL); 345 | CGDataConsumerRelease(consumer); 346 | if (!context) return nil; 347 | CGPDFContextBeginPage(context, NULL); 348 | CGContextTranslateCTM(context, 0, bounds.size.height); 349 | CGContextScaleCTM(context, 1.0, -1.0); 350 | [self.layer renderInContext:context]; 351 | CGPDFContextEndPage(context); 352 | CGPDFContextClose(context); 353 | CGContextRelease(context); 354 | return data; 355 | } 356 | 357 | - (UIViewController *)viewController { 358 | UIView *view = self; 359 | while (view) { 360 | UIResponder *nextResponder = [view nextResponder]; 361 | if ([nextResponder isKindOfClass:[UIViewController class]]) { 362 | return (UIViewController *)nextResponder; 363 | } 364 | view = view.superview; 365 | } 366 | return nil; 367 | } 368 | 369 | 370 | 371 | @end 372 | 373 | 374 | 375 | --------------------------------------------------------------------------------