讀autolayout開源框架masonry想MVC
下午上班時間閒來無事,閱讀了下autolayout開源框架masonry示例Demo,被他們優雅的程式碼吸引住了。
或許這才是真正的MVC。
C:Controller像這樣,一個Controller控制N多個View,多麼優雅。而我之前都是習慣一個View對應一個ViewController,多麼low…
MASExampleListViewController.h
#import <UIKit/UIKit.h>
@interface MASExampleListViewController : UITableViewController
@end
MASExampleListViewController.m
#import "MASExampleListViewController.h"
#import "MASExampleViewController.h"
#import "MASExampleBasicView.h"
#import "MASExampleConstantsView.h"
#import "MASExampleSidesView.h"
#import "MASExampleAnimatedView.h"
#import "MASExampleDebuggingView.h"
#import "MASExampleLabelView.h"
#import "MASExampleUpdateView.h"
#import "MASExampleRemakeView.h"
#import "MASExampleScrollView.h"
#import "MASExampleLayoutGuideViewController.h"
#import "MASExampleArrayView.h"
#import "MASExampleAttributeChainingView.h"
#import "MASExampleAspectFitView.h"
#import "MASExampleMarginView.h"
#import "MASExampleDistributeView.h"
static NSString * const kMASCellReuseIdentifier = @"kMASCellReuseIdentifier";
@interface MASExampleListViewController ()
@property (nonatomic, strong) NSArray *exampleControllers;
@end
@implementation MASExampleListViewController
- (id)init {
self = [super init];
if (!self) return nil;
self.title = @"Examples";
self.exampleControllers = @[
[[MASExampleViewController alloc] initWithTitle:@"Basic"
viewClass:MASExampleBasicView.class],
[[MASExampleViewController alloc] initWithTitle:@"Update Constraints"
viewClass:MASExampleUpdateView.class],
[[MASExampleViewController alloc] initWithTitle:@"Remake Constraints"
viewClass:MASExampleRemakeView.class],
[[MASExampleViewController alloc] initWithTitle:@"Using Constants"
viewClass:MASExampleConstantsView.class],
[[MASExampleViewController alloc] initWithTitle:@"Composite Edges"
viewClass:MASExampleSidesView.class],
[[MASExampleViewController alloc] initWithTitle:@"Aspect Fit"
viewClass:MASExampleAspectFitView.class],
[[MASExampleViewController alloc] initWithTitle:@"Basic Animated"
viewClass:MASExampleAnimatedView.class],
[[MASExampleViewController alloc] initWithTitle:@"Debugging Helpers"
viewClass:MASExampleDebuggingView.class],
[[MASExampleViewController alloc] initWithTitle:@"Bacony Labels"
viewClass:MASExampleLabelView.class],
[[MASExampleViewController alloc] initWithTitle:@"UIScrollView"
viewClass:MASExampleScrollView.class],
[[MASExampleViewController alloc] initWithTitle:@"Array"
viewClass:MASExampleArrayView.class],
[[MASExampleViewController alloc] initWithTitle:@"Attribute Chaining"
viewClass:MASExampleAttributeChainingView.class],
[[MASExampleViewController alloc] initWithTitle:@"Margins"
viewClass:MASExampleMarginView.class],
[[MASExampleViewController alloc] initWithTitle:@"Views Distribute"
viewClass:MASExampleDistributeView.class],
];
if ([UIViewController instancesRespondToSelector:@selector(topLayoutGuide)])
{
self.exampleControllers = [self.exampleControllers arrayByAddingObject:[[MASExampleLayoutGuideViewController alloc] init]];
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[self.tableView registerClass:UITableViewCell.class forCellReuseIdentifier:kMASCellReuseIdentifier];
}
#pragma mark - UITableViewDataSource
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UIViewController *viewController = self.exampleControllers[indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kMASCellReuseIdentifier forIndexPath:indexPath];
cell.textLabel.text = viewController.title;
return cell;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.exampleControllers.count;
}
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UIViewController *viewController = self.exampleControllers[indexPath.row];
[self.navigationController pushViewController:viewController animated:YES];
}
@end
MASExampleViewController.h
#import <UIKit/UIKit.h>
@interface MASExampleViewController : UIViewController
- (id)initWithTitle:(NSString *)title viewClass:(Class)viewClass;
@end
MASExampleViewController.m
#import "MASExampleViewController.h"
@interface MASExampleViewController ()
@property (nonatomic, strong) Class viewClass;
@end
@implementation MASExampleViewController
- (id)initWithTitle:(NSString *)title viewClass:(Class)viewClass {
self = [super init];
if (!self) return nil;
self.title = title;
self.viewClass = viewClass;
return self;
}
- (void)loadView {
self.view = self.viewClass.new;
self.view.backgroundColor = [UIColor whiteColor];
}
#ifdef __IPHONE_7_0
- (UIRectEdge)edgesForExtendedLayout {
return UIRectEdgeNone;
}
#endif
@end
V: View 這裡列出一個MASExampleBasicView示例下,下面還可以有N多View。而這些View共用一個MASExampleViewController。通過MASExampleViewController例項方法- (id)initWithTitle:(NSString *)title viewClass:(Class)viewClass 為MASExampleViewController賦值不同view。帥呆了。
MASExampleBasicView.m
#import "MASExampleBasicView.h"
@implementation MASExampleBasicView
- (id)init {
self = [super init];
if (!self) return nil;
UIView *greenView = UIView.new;
greenView.backgroundColor = UIColor.greenColor;
greenView.layer.borderColor = UIColor.blackColor.CGColor;
greenView.layer.borderWidth = 2;
[self addSubview:greenView];
UIView *redView = UIView.new;
redView.backgroundColor = UIColor.redColor;
redView.layer.borderColor = UIColor.blackColor.CGColor;
redView.layer.borderWidth = 2;
[self addSubview:redView];
UIView *blueView = UIView.new;
blueView.backgroundColor = UIColor.blueColor;
blueView.layer.borderColor = UIColor.blackColor.CGColor;
blueView.layer.borderWidth = 2;
[self addSubview:blueView];
UIView *superview = self;
int padding = 10;
//if you want to use Masonry without the mas_ prefix
//define MAS_SHORTHAND before importing Masonry.h see Masonry iOS Examples-Prefix.pch
[greenView makeConstraints:^(MASConstraintMaker *make) {
make.top.greaterThanOrEqualTo(superview.top).offset(padding);
make.left.equalTo(superview.left).offset(padding);
make.bottom.equalTo(blueView.top).offset(-padding);
make.right.equalTo(redView.left).offset(-padding);
make.width.equalTo(redView.width);
make.height.equalTo(redView.height);
make.height.equalTo(blueView.height);
}];
//with is semantic and option
[redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(superview.mas_top).with.offset(padding); //with with
make.left.equalTo(greenView.mas_right).offset(padding); //without with
make.bottom.equalTo(blueView.mas_top).offset(-padding);
make.right.equalTo(superview.mas_right).offset(-padding);
make.width.equalTo(greenView.mas_width);
make.height.equalTo(@[greenView, blueView]); //can pass array of views
}];
[blueView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(greenView.mas_bottom).offset(padding);
make.left.equalTo(superview.mas_left).offset(padding);
make.bottom.equalTo(superview.mas_bottom).offset(-padding);
make.right.equalTo(superview.mas_right).offset(-padding);
make.height.equalTo(@[greenView.mas_height, redView.mas_height]); //can pass array of attributes
}];
return self;
}
@end
相關文章
- Masonry原始碼解讀原始碼
- Masonry 原始碼解讀(下)原始碼
- Masonry 原始碼解讀(上)原始碼
- MVC框架MVC框架
- golang 版本的MVC開發框架GolangMVC框架
- 原始碼閱讀:Masonry(一)——從使用入手原始碼
- iOS開發之 Autolayout 詳解iOS
- Dewdrop:開源事件源框架事件框架
- UIScrollView AutoLayoutUIView
- AutoLayout Tips
- 手寫Spring MVC框架(一) 實現簡易版mvc框架SpringMVC框架
- phpGrace開源PHP框架PHP框架
- cell label autoLayout
- go語言web開發框架_Iris框架講解(五)MVC包使用GoWeb框架MVC
- 基於GO語言框架Gin開發的MVC輪子框架:GinLaravelGo框架MVCLaravel
- 從零開始實現一個簡易的Java MVC框架(七)–實現MVCJavaMVC框架
- 從零開始實現一個簡易的Java MVC框架(七)--實現MVCJavaMVC框架
- 實現MVC基礎框架MVC框架
- 手寫mini版MVC框架MVC框架
- iOS開發-Masonry約束寬高比iOS
- Workerman開源框架的作者框架
- 開源RAG框架彙總框架
- IDEA升級開源框架Idea框架
- iOS AutoLayout使用技巧iOS
- 位元組開源RPC框架Kitex的日誌庫klog原始碼解讀RPC框架原始碼
- Spring Boot + Mybatis + Spring MVC環境配置(四):MVC框架搭建Spring BootMyBatisMVC框架
- spring mvc 框架搭建及詳解SpringMVC框架
- Spring MVC框架有哪些優點SpringMVC框架
- 滴滴開源小程式框架Mpx框架
- Android 面試開源框架篇Android面試框架
- Android中使用AndroidTagGroup開源框架Android框架
- 開源 POC 框架學習 (kunpeng)框架
- EacooPHP框架【開源、免費、好用】OOPPHP框架
- 開源漏洞檢測框架收集框架
- 一套MVC5+EasyUI企業快速開發框架原始碼 BS開發框架原始碼MVCUI框架原始碼
- ASP.NET MVC隨想錄——漫談OWINASP.NETMVC
- 使用第三方框架 Masonry 實現自動佈局框架
- AutoLayout螢幕適配
- 想學習 GO 有什麼好的文章,框架,資源推薦?Go框架