Skip to content
This repository has been archived by the owner on Feb 17, 2021. It is now read-only.

Commit

Permalink
Objective C builders support chaining style. (#202)
Browse files Browse the repository at this point in the history
  • Loading branch information
staguer authored Apr 21, 2018
1 parent 81ea591 commit 7629faa
Show file tree
Hide file tree
Showing 22 changed files with 528 additions and 28 deletions.
2 changes: 1 addition & 1 deletion LayoutKitObjCSampleApp/RotationLayout.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

#import <UIKit/UIKit.h>
#import <LayoutKitObjC/LayoutKitObjC-Swift.h>
#import <LayoutKitObjC/LayoutKitObjC.h>

@interface RotationLayout: NSObject <LOKLayout>

Expand Down
1 change: 1 addition & 0 deletions LayoutKitObjCSampleApp/RotationLayout.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

#import <Foundation/Foundation.h>
#import <LayoutKitObjC/LayoutKitObjC.h>

#import "RotationLayout.h"

Expand Down
1 change: 0 additions & 1 deletion LayoutKitObjCSampleApp/ViewController.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

#import <UIKit/UIKit.h>
#import <LayoutKit/LayoutKit-Swift.h>

@interface ViewController : UIViewController

Expand Down
45 changes: 24 additions & 21 deletions LayoutKitObjCSampleApp/ViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,7 @@ - (void)viewDidLoad {
collectionView.delegate = self.adapter;
collectionView.dataSource = self.adapter;

LOKSizeLayoutBuilder *cellLayoutBuilder = [LOKSizeLayoutBuilder withSublayout:self.helloWorldLayout];
cellLayoutBuilder.width = self.view.bounds.size.width;
LOKSizeLayout *cellLayout = [cellLayoutBuilder build];
__auto_type cellLayout = [LOKSizeLayoutBuilder withSublayout:self.helloWorldLayout].withWidth(self.view.bounds.size.width).layout;

NSArray *items = @[
cellLayout, cellLayout, cellLayout, cellLayout,
Expand Down Expand Up @@ -106,26 +104,31 @@ - (void)viewDidLayoutSubviews {
}

+ (id<LOKLayout>)makeHelloLayout {
LOKLabelLayoutBuilder *labelLayoutBuilderA = [LOKLabelLayoutBuilder withString:@"Hello"];
labelLayoutBuilderA.viewClass = MyLabelView.class;
labelLayoutBuilderA.configure = ^(UIView * _Nonnull label) {
__auto_type labelLayoutA =
[LOKLabelLayoutBuilder withString:@"Hello"]
.withViewClass([MyLabelView class])
.withConfig(^(UIView * _Nonnull label) {
label.backgroundColor = UIColor.whiteColor;
};
LOKLabelLayout *labelLayoutA = [labelLayoutBuilderA build];
LOKLabelLayoutBuilder *labelLayoutBuilderB = [LOKLabelLayoutBuilder withString:@"world!"];
labelLayoutBuilderB.viewClass = MyLabelView.class;
labelLayoutBuilderB.configure = ^(UIView * _Nonnull label) {
})
.layout;

__auto_type labelLayoutB = [LOKLabelLayoutBuilder withString:@"world!"]
.withViewClass([MyLabelView class])
.withConfig(^(UIView * _Nonnull label) {
label.backgroundColor = UIColor.whiteColor;
};
LOKLabelLayout *labelLayoutB = [labelLayoutBuilderB build];
LOKStackLayoutBuilder *stackLayoutBuilder = [LOKStackLayoutBuilder withSublayouts:@[labelLayoutA, labelLayoutB]];
stackLayoutBuilder.axis = LOKAxisHorizontal;
stackLayoutBuilder.spacing = 10;
LOKInsetLayoutBuilder *insetLayoutBuilder = [LOKInsetLayoutBuilder withInsets:UIEdgeInsetsMake(20, 20, 20, 20) around:[stackLayoutBuilder build]];
insetLayoutBuilder.alignment = LOKAlignment.fill;
insetLayoutBuilder.viewClass = LabelBackgroundView.class;
insetLayoutBuilder.configure = ^(UIView * _Nonnull view) { };
return [[RotationLayout alloc] initWithSublayout:[insetLayoutBuilder build]
})
.layout;

__auto_type layout = [LOKStackLayoutBuilder withSublayouts:@[labelLayoutA, labelLayoutB]]
.withAxis(LOKAxisHorizontal)
.withSpacing(10)
.withInsets(UIEdgeInsetsMake(20, 20, 20, 20))
.withAlignment(LOKAlignment.fill)
.withViewClass(LabelBackgroundView.class)
.withConfig(^(UIView * _Nonnull view) { })
.layout;

return [[RotationLayout alloc] initWithSublayout:layout
alignment:LOKAlignment.center
viewReuseId:nil];
}
Expand Down
5 changes: 5 additions & 0 deletions Sources/LayoutKitObjC.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ FOUNDATION_EXPORT double LayoutKitObjCVersionNumber;
FOUNDATION_EXPORT const unsigned char LayoutKitObjCVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <LayoutKitObjC/PublicHeader.h>

#import "LOKBaseLayoutBuilder.h"
#if __has_include("LOKButtonLayoutBuilder.h")
#import "LOKButtonLayoutBuilder.h"
Expand All @@ -29,3 +30,7 @@ FOUNDATION_EXPORT const unsigned char LayoutKitObjCVersionString[];
#if __has_include("LOKTextViewLayoutBuilder.h")
#import "LOKTextViewLayoutBuilder.h"
#endif

#if __has_include("LayoutKitObjC-Swift.h")
#import "LayoutKitObjC-Swift.h"
#endif
5 changes: 5 additions & 0 deletions Sources/ObjCSupport/Builders/LOKBaseLayoutBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ typedef NSView View;
@class LOKAlignment;
@class LOKFlexibility;
@protocol LOKLayout;
@class LOKInsetLayoutBuilder;

@interface LOKBaseLayoutBuilder : NSObject

Expand All @@ -34,4 +35,8 @@ typedef NSView View;

- (nonnull id<LOKLayout>)build;

@property (nonatomic, nonnull, readonly) LOKInsetLayoutBuilder * _Nonnull(^withInsets)(EdgeInsets);

@property (nonatomic, nonnull) id<LOKLayout> layout;

@end
12 changes: 12 additions & 0 deletions Sources/ObjCSupport/Builders/LOKBaseLayoutBuilder.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,23 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

#import "LOKBaseLayoutBuilder.h"
#import "LOKInsetLayoutBuilder.h"

@implementation LOKBaseLayoutBuilder

- (id<LOKLayout>)build {
NSAssert(NO, @"This method is expected to be overridden by a superclass.");
return nil;
}

- (id<LOKLayout>)layout {
return [self build];
}

- (LOKInsetLayoutBuilder * _Nonnull (^)(EdgeInsets))withInsets {
return ^LOKInsetLayoutBuilder *(EdgeInsets insets){
return [LOKInsetLayoutBuilder withInsets:insets around:[self build]];
};
}

@end
13 changes: 13 additions & 0 deletions Sources/ObjCSupport/Builders/LOKButtonLayoutBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,19 @@ typedef NS_ENUM(NSInteger, LOKButtonLayoutType) {
@property (nonatomic) CGSize imageSize;
@property (nonatomic, nullable) NSValue *contentEdgeInsets;

@property (nonatomic, nonnull, readonly) LOKButtonLayoutBuilder * _Nonnull(^withType)(LOKButtonLayoutType);
@property (nonatomic, nonnull, readonly) LOKButtonLayoutBuilder * _Nonnull(^withFont)(UIFont * _Nullable);
@property (nonatomic, nonnull, readonly) LOKButtonLayoutBuilder * _Nonnull(^withImage)(UIImage * _Nullable);
@property (nonatomic, nonnull, readonly) LOKButtonLayoutBuilder * _Nonnull(^withImageSize)(CGSize);
@property (nonatomic, nonnull, readonly) LOKButtonLayoutBuilder * _Nonnull(^withContentEdgeInsets)(NSValue * _Nullable);

@property (nonatomic, nonnull, readonly) LOKButtonLayoutBuilder * _Nonnull(^withAlignment)(LOKAlignment * _Nonnull);
@property (nonatomic, nonnull, readonly) LOKButtonLayoutBuilder * _Nonnull(^withFlexibility)(LOKFlexibility * _Nonnull);
@property (nonatomic, nonnull, readonly) LOKButtonLayoutBuilder * _Nonnull(^withViewReuseId)(NSString * _Nonnull);
@property (nonatomic, nonnull, readonly) LOKButtonLayoutBuilder * _Nonnull(^withViewClass)(Class _Nonnull);

@property (nonatomic, nonnull, readonly) LOKButtonLayoutBuilder * _Nonnull(^withConfig)( void(^ _Nonnull)(View *_Nonnull));

- (nonnull LOKButtonLayout *)build;

@end
70 changes: 70 additions & 0 deletions Sources/ObjCSupport/Builders/LOKButtonLayoutBuilder.m
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,74 @@ - (LOKButtonLayout *)build {
config:self.configure];
}

- (LOKButtonLayoutBuilder * _Nonnull (^)(LOKButtonLayoutType))withType {
return ^LOKButtonLayoutBuilder *(LOKButtonLayoutType type){
self.type = type;
return self;
};
}

- (LOKButtonLayoutBuilder * _Nonnull (^)(UIFont * _Nullable))withFont {
return ^LOKButtonLayoutBuilder *(UIFont * font){
self.font = font;
return self;
};
}

- (LOKButtonLayoutBuilder * _Nonnull (^)(UIImage * _Nullable))withImage {
return ^LOKButtonLayoutBuilder *(UIImage * image){
self.image = image;
return self;
};
}

- (LOKButtonLayoutBuilder * _Nonnull (^)(CGSize))withImageSize {
return ^LOKButtonLayoutBuilder *(CGSize imageSize){
self.imageSize = imageSize;
return self;
};
}

- (LOKButtonLayoutBuilder * _Nonnull (^)(NSValue * _Nullable))withContentEdgeInsets {
return ^LOKButtonLayoutBuilder *(NSValue * _Nullable contentEdgeInsets){
self.contentEdgeInsets = contentEdgeInsets;
return self;
};
}

- (LOKButtonLayoutBuilder * _Nonnull (^)(LOKAlignment * _Nonnull))withAlignment {
return ^LOKButtonLayoutBuilder *(LOKAlignment * alignment){
self.alignment = alignment;
return self;
};
}

- (LOKButtonLayoutBuilder * _Nonnull (^)(LOKFlexibility * _Nonnull))withFlexibility {
return ^LOKButtonLayoutBuilder *(LOKFlexibility * flexibility){
self.flexibility = flexibility;
return self;
};
}

- (LOKButtonLayoutBuilder * _Nonnull (^)(NSString * _Nonnull))withViewReuseId {
return ^LOKButtonLayoutBuilder *(NSString * viewReuseId){
self.viewReuseId = viewReuseId;
return self;
};
}

- (LOKButtonLayoutBuilder * _Nonnull (^)(Class _Nonnull))withViewClass {
return ^LOKButtonLayoutBuilder *(Class viewClass){
self.viewClass = viewClass;
return self;
};
}

- (LOKButtonLayoutBuilder * _Nonnull (^)(void(^ _Nonnull)(View *_Nonnull)))withConfig {
return ^LOKButtonLayoutBuilder *(void(^ _Nonnull config)(View *_Nonnull)){
self.configure = config;
return self;
};
}

@end
7 changes: 7 additions & 0 deletions Sources/ObjCSupport/Builders/LOKInsetLayoutBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@
@property (nonatomic) EdgeInsets insets;
@property (nonatomic, nonnull) id<LOKLayout> sublayout;

@property (nonatomic, nonnull, readonly) LOKInsetLayoutBuilder * _Nonnull(^withAlignment)(LOKAlignment * _Nonnull);
@property (nonatomic, nonnull, readonly) LOKInsetLayoutBuilder * _Nonnull(^withFlexibility)(LOKFlexibility * _Nonnull);
@property (nonatomic, nonnull, readonly) LOKInsetLayoutBuilder * _Nonnull(^withViewReuseId)(NSString * _Nonnull);
@property (nonatomic, nonnull, readonly) LOKInsetLayoutBuilder * _Nonnull(^withViewClass)(Class _Nonnull);

@property (nonatomic, nonnull, readonly) LOKInsetLayoutBuilder * _Nonnull(^withConfig)( void(^ _Nonnull)(View *_Nonnull));

- (nonnull LOKInsetLayout *)build;

@end
41 changes: 37 additions & 4 deletions Sources/ObjCSupport/Builders/LOKInsetLayoutBuilder.m
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,8 @@ @implementation LOKInsetLayoutBuilder

+ (nonnull instancetype)withInsets:(EdgeInsets)insets around:(nonnull id<LOKLayout>)sublayout {
LOKInsetLayoutBuilder *builder = [[self alloc] init];
if (builder) {
builder.insets = insets;
builder.sublayout = sublayout;
}
builder.insets = insets;
builder.sublayout = sublayout;
return builder;
}

Expand All @@ -30,4 +28,39 @@ - (nonnull LOKInsetLayout *)build {
configure:self.configure];
}

- (LOKInsetLayoutBuilder * _Nonnull (^)(LOKAlignment * _Nonnull))withAlignment {
return ^LOKInsetLayoutBuilder *(LOKAlignment * alignment){
self.alignment = alignment;
return self;
};
}

- (LOKInsetLayoutBuilder * _Nonnull (^)(LOKFlexibility * _Nonnull))withFlexibility {
return ^LOKInsetLayoutBuilder *(LOKFlexibility * flexibility){
self.flexibility = flexibility;
return self;
};
}

- (LOKInsetLayoutBuilder * _Nonnull (^)(NSString * _Nonnull))withViewReuseId {
return ^LOKInsetLayoutBuilder *(NSString * viewReuseId){
self.viewReuseId = viewReuseId;
return self;
};
}

- (LOKInsetLayoutBuilder * _Nonnull (^)(Class _Nonnull))withViewClass {
return ^LOKInsetLayoutBuilder *(Class viewClass){
self.viewClass = viewClass;
return self;
};
}

- (LOKInsetLayoutBuilder * _Nonnull (^)(void(^ _Nonnull)(View *_Nonnull)))withConfig {
return ^LOKInsetLayoutBuilder *(void(^ _Nonnull config)(View *_Nonnull)){
self.configure = config;
return self;
};
}

@end
11 changes: 11 additions & 0 deletions Sources/ObjCSupport/Builders/LOKLabelLayoutBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,17 @@
@property (nonatomic) NSInteger numberOfLines;
@property (nonatomic) CGFloat lineHeight;

@property (nonatomic, nonnull, readonly) LOKLabelLayoutBuilder * _Nonnull(^withFont)(UIFont * _Nullable);
@property (nonatomic, nonnull, readonly) LOKLabelLayoutBuilder * _Nonnull(^withNumberOfLines)(NSInteger);
@property (nonatomic, nonnull, readonly) LOKLabelLayoutBuilder * _Nonnull(^withLineHeight)(CGFloat);

@property (nonatomic, nonnull, readonly) LOKLabelLayoutBuilder * _Nonnull(^withAlignment)(LOKAlignment * _Nonnull);
@property (nonatomic, nonnull, readonly) LOKLabelLayoutBuilder * _Nonnull(^withFlexibility)(LOKFlexibility * _Nonnull);
@property (nonatomic, nonnull, readonly) LOKLabelLayoutBuilder * _Nonnull(^withViewReuseId)(NSString * _Nonnull);
@property (nonatomic, nonnull, readonly) LOKLabelLayoutBuilder * _Nonnull(^withViewClass)(Class _Nonnull);

@property (nonatomic, nonnull, readonly) LOKLabelLayoutBuilder * _Nonnull(^withConfig)( void(^ _Nonnull)(View *_Nonnull));

- (nonnull LOKLabelLayout *)build;

@end
56 changes: 56 additions & 0 deletions Sources/ObjCSupport/Builders/LOKLabelLayoutBuilder.m
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,60 @@ - (nonnull LOKLabelLayout *)build {
}
}

- (LOKLabelLayoutBuilder * _Nonnull (^)(UIFont * _Nullable))withFont {
return ^LOKLabelLayoutBuilder *(UIFont * font){
self.font = font;
return self;
};
}

- (LOKLabelLayoutBuilder * _Nonnull (^)(NSInteger))withNumberOfLines {
return ^LOKLabelLayoutBuilder *(NSInteger numberOfLines){
self.numberOfLines = numberOfLines;
return self;
};
}

- (LOKLabelLayoutBuilder * _Nonnull (^)(CGFloat))withLineHeight {
return ^LOKLabelLayoutBuilder *(CGFloat lineHeight){
self.lineHeight = lineHeight;
return self;
};
}

- (LOKLabelLayoutBuilder * _Nonnull (^)(LOKAlignment * _Nonnull))withAlignment {
return ^LOKLabelLayoutBuilder *(LOKAlignment * alignment){
self.alignment = alignment;
return self;
};
}

- (LOKLabelLayoutBuilder * _Nonnull (^)(LOKFlexibility * _Nonnull))withFlexibility {
return ^LOKLabelLayoutBuilder *(LOKFlexibility * flexibility){
self.flexibility = flexibility;
return self;
};
}

- (LOKLabelLayoutBuilder * _Nonnull (^)(NSString * _Nonnull))withViewReuseId {
return ^LOKLabelLayoutBuilder *(NSString * viewReuseId){
self.viewReuseId = viewReuseId;
return self;
};
}

- (LOKLabelLayoutBuilder * _Nonnull (^)(Class _Nonnull))withViewClass {
return ^LOKLabelLayoutBuilder *(Class viewClass){
self.viewClass = viewClass;
return self;
};
}

- (LOKLabelLayoutBuilder * _Nonnull (^)(void(^ _Nonnull)(View *_Nonnull)))withConfig {
return ^LOKLabelLayoutBuilder *(void(^ _Nonnull config)(View *_Nonnull)){
self.configure = config;
return self;
};
}

@end
Loading

0 comments on commit 7629faa

Please sign in to comment.