讀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
相關文章
- Android的MVC開源框架AndroidMVC框架
- Masonry介紹與使用實踐:快速上手Autolayout
- AutoLayout框架之序言框架
- Masonry原始碼解讀原始碼
- Masonry 原始碼解讀(上)原始碼
- Masonry 原始碼解讀(下)原始碼
- golang 版本的MVC開發框架GolangMVC框架
- MVC框架MVC框架
- iOS 自動佈局框架 – Masonry 詳解iOS框架
- iOS自動佈局框架 - Masonry詳解iOS框架
- Dewdrop:開源事件源框架事件框架
- 開源框架(整理)框架
- 原始碼閱讀:Masonry(一)——從使用入手原始碼
- AutoLayout和Masonry兩種方式實現自動佈局的內容包裹和檢視均分
- phpGrace開源PHP框架PHP框架
- Californium 開源框架分析框架
- PHP開源AJAX框架PHP框架
- iOS開發之 Autolayout 詳解iOS
- Swift開發開源框架KatanaSwift框架
- 開源,想說愛你不容易
- 如何透過閱讀原始碼來學習優秀開源框架原始碼框架
- iOS開發之原始碼解析 - MasonryiOS原始碼
- iOS學習之Masonry第三方框架iOS框架
- Workerman開源框架的作者框架
- 開源RAG框架彙總框架
- 微軟在 Apache 下開源 ASP.NET MVC微軟ApacheASP.NETMVC
- 解讀ASP.NET 5 & MVC6系列(9):日誌框架ASP.NETMVC框架
- 手寫Spring MVC框架(一) 實現簡易版mvc框架SpringMVC框架
- go語言web開發框架_Iris框架講解(五)MVC包使用GoWeb框架MVC
- 基於GO語言框架Gin開發的MVC輪子框架:GinLaravelGo框架MVCLaravel
- PhalApi(π框架) - PHP輕量級開源介面框架API框架PHP
- 從MVC框架看MVC架構的設計MVC框架架構
- iOS開發-Masonry約束寬高比iOS
- 從零開始實現一個簡易的Java MVC框架(七)–實現MVCJavaMVC框架
- 從零開始實現一個簡易的Java MVC框架(七)--實現MVCJavaMVC框架
- 開源 POC 框架學習 (kunpeng)框架
- 分享個人開源爬蟲框架爬蟲框架
- EacooPHP框架【開源、免費、好用】OOPPHP框架