├── screens
└── 1.PNG
├── Example
├── Assets.xcassets
│ ├── Contents.json
│ ├── event.imageset
│ │ ├── event.png
│ │ └── Contents.json
│ ├── line.imageset
│ │ ├── line.png
│ │ └── Contents.json
│ ├── point.imageset
│ │ ├── point.png
│ │ └── Contents.json
│ ├── checkmark-on.imageset
│ │ ├── checkmark.png
│ │ └── Contents.json
│ ├── checkmark-off.imageset
│ │ ├── checkmark-off.png
│ │ └── Contents.json
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── ViewController.h
├── AppDelegate.h
├── main.m
├── Info.plist
├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
├── AppDelegate.m
└── ViewController.m
├── WCSTimeline.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
└── project.pbxproj
├── Libraries
└── WCSTimeLine
│ ├── Dependencies
│ ├── WCSLabel
│ │ ├── WCSLabel.h
│ │ └── WCSLabel.m
│ ├── Masonry
│ │ ├── MASLayoutConstraint.m
│ │ ├── NSLayoutConstraint+MASDebugAdditions.h
│ │ ├── MASLayoutConstraint.h
│ │ ├── MASCompositeConstraint.h
│ │ ├── Masonry.h
│ │ ├── ViewController+MASAdditions.h
│ │ ├── NSArray+MASShorthandAdditions.h
│ │ ├── MASViewAttribute.m
│ │ ├── MASViewAttribute.h
│ │ ├── ViewController+MASAdditions.m
│ │ ├── MASViewConstraint.h
│ │ ├── MASConstraint+Private.h
│ │ ├── NSArray+MASAdditions.h
│ │ ├── View+MASShorthandAdditions.h
│ │ ├── View+MASAdditions.h
│ │ ├── MASCompositeConstraint.m
│ │ ├── MASConstraintMaker.h
│ │ ├── View+MASAdditions.m
│ │ ├── NSLayoutConstraint+MASDebugAdditions.m
│ │ ├── MASUtilities.h
│ │ ├── NSArray+MASAdditions.m
│ │ ├── MASConstraint.h
│ │ ├── MASConstraint.m
│ │ ├── MASConstraintMaker.m
│ │ └── MASViewConstraint.m
│ └── NSDate+TimeAgo
│ │ ├── NSDate+TimeAgo.h
│ │ └── NSDate+TimeAgo.m
│ ├── WCSTimelineCell.h
│ ├── WCSTimelineModel.h
│ ├── WCSTimelineModel.m
│ └── WCSTimelineCell.m
├── README.md
└── LICENSE
/screens/1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WrightsCS/WCSTimeline/HEAD/screens/1.PNG
--------------------------------------------------------------------------------
/Example/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Example/Assets.xcassets/event.imageset/event.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WrightsCS/WCSTimeline/HEAD/Example/Assets.xcassets/event.imageset/event.png
--------------------------------------------------------------------------------
/Example/Assets.xcassets/line.imageset/line.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WrightsCS/WCSTimeline/HEAD/Example/Assets.xcassets/line.imageset/line.png
--------------------------------------------------------------------------------
/Example/Assets.xcassets/point.imageset/point.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WrightsCS/WCSTimeline/HEAD/Example/Assets.xcassets/point.imageset/point.png
--------------------------------------------------------------------------------
/Example/Assets.xcassets/checkmark-on.imageset/checkmark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WrightsCS/WCSTimeline/HEAD/Example/Assets.xcassets/checkmark-on.imageset/checkmark.png
--------------------------------------------------------------------------------
/Example/Assets.xcassets/checkmark-off.imageset/checkmark-off.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WrightsCS/WCSTimeline/HEAD/Example/Assets.xcassets/checkmark-off.imageset/checkmark-off.png
--------------------------------------------------------------------------------
/WCSTimeline.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/WCSLabel/WCSLabel.h:
--------------------------------------------------------------------------------
1 | //
2 | // WCSLabel.h
3 | // WCSTimeline
4 | //
5 | // Created by Aaron Wright on 3/16/17.
6 | // Copyright © 2017 Wrights Creative Services, L.L.C. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface WCSLabel : UILabel
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Example/ViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.h
3 | // WCSTimeline
4 | //
5 | // Created by Aaron Wright on 3/15/17.
6 | // Copyright © 2017 Wrights Creative Services, L.L.C. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface ViewController : UIViewController
12 |
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/MASLayoutConstraint.m:
--------------------------------------------------------------------------------
1 | //
2 | // MASLayoutConstraint.m
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 3/08/13.
6 | // Copyright (c) 2013 Jonas Budelmann. All rights reserved.
7 | //
8 |
9 | #import "MASLayoutConstraint.h"
10 |
11 | @implementation MASLayoutConstraint
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Example/AppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.h
3 | // WCSTimeline
4 | //
5 | // Created by Aaron Wright on 3/15/17.
6 | // Copyright © 2017 Wrights Creative Services, L.L.C. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface AppDelegate : UIResponder
12 |
13 | @property (strong, nonatomic) UIWindow *window;
14 |
15 |
16 | @end
17 |
18 |
--------------------------------------------------------------------------------
/Example/Assets.xcassets/line.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "universal",
9 | "filename" : "line.png",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/Example/Assets.xcassets/event.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "universal",
9 | "scale" : "2x"
10 | },
11 | {
12 | "idiom" : "universal",
13 | "filename" : "event.png",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/Example/Assets.xcassets/point.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "universal",
9 | "filename" : "point.png",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/Example/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // WCSTimeline
4 | //
5 | // Created by Aaron Wright on 3/15/17.
6 | // Copyright © 2017 Wrights Creative Services, L.L.C. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "AppDelegate.h"
11 |
12 | int main(int argc, char * argv[]) {
13 | @autoreleasepool {
14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Example/Assets.xcassets/checkmark-on.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "universal",
9 | "scale" : "2x"
10 | },
11 | {
12 | "idiom" : "universal",
13 | "filename" : "checkmark.png",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/Example/Assets.xcassets/checkmark-off.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "universal",
9 | "scale" : "2x"
10 | },
11 | {
12 | "idiom" : "universal",
13 | "filename" : "checkmark-off.png",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/NSLayoutConstraint+MASDebugAdditions.h:
--------------------------------------------------------------------------------
1 | //
2 | // NSLayoutConstraint+MASDebugAdditions.h
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 3/08/13.
6 | // Copyright (c) 2013 Jonas Budelmann. All rights reserved.
7 | //
8 |
9 | #import "MASUtilities.h"
10 |
11 | /**
12 | * makes debug and log output of NSLayoutConstraints more readable
13 | */
14 | @interface NSLayoutConstraint (MASDebugAdditions)
15 |
16 | @end
17 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/WCSTimelineCell.h:
--------------------------------------------------------------------------------
1 | //
2 | // WCSTimelineCell.h
3 | // WCSTimeline
4 | //
5 | // Created by Aaron Wright on 3/15/17.
6 | // Copyright © 2017 Wrights Creative Services, L.L.C. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "WCSLabel.h"
11 | #import "WCSTimelineModel.h"
12 |
13 | #define ARC4RANDOM_MAX 0x100000000
14 |
15 | @interface WCSTimelineCell : UITableViewCell
16 | @property (nonatomic, strong) WCSTimelineModel * model;
17 | @end
18 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/MASLayoutConstraint.h:
--------------------------------------------------------------------------------
1 | //
2 | // MASLayoutConstraint.h
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 3/08/13.
6 | // Copyright (c) 2013 Jonas Budelmann. All rights reserved.
7 | //
8 |
9 | #import "MASUtilities.h"
10 |
11 | /**
12 | * When you are debugging or printing the constraints attached to a view this subclass
13 | * makes it easier to identify which constraints have been created via Masonry
14 | */
15 | @interface MASLayoutConstraint : NSLayoutConstraint
16 |
17 | /**
18 | * a key to associate with this constraint
19 | */
20 | @property (nonatomic, strong) id mas_key;
21 |
22 | @end
23 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/MASCompositeConstraint.h:
--------------------------------------------------------------------------------
1 | //
2 | // MASCompositeConstraint.h
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 21/07/13.
6 | // Copyright (c) 2013 cloudling. All rights reserved.
7 | //
8 |
9 | #import "MASConstraint.h"
10 | #import "MASUtilities.h"
11 |
12 | /**
13 | * A group of MASConstraint objects
14 | */
15 | @interface MASCompositeConstraint : MASConstraint
16 |
17 | /**
18 | * Creates a composite with a predefined array of children
19 | *
20 | * @param children child MASConstraints
21 | *
22 | * @return a composite constraint
23 | */
24 | - (id)initWithChildren:(NSArray *)children;
25 |
26 | @end
27 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # WCSTimeline
2 | Simple timeline with data model written in Objective-C.
3 |
4 |
5 |
6 | Example
7 | ------------
8 |
9 | ```objc
10 | for ( NSInteger i = 0; i < 10; i++ )
11 | {
12 | WCSTimelineModel * model = [WCSTimelineModel new];
13 | model.icon = [UIImage imageNamed:@"event"];
14 | model.time = [self randomDate];
15 | model.event = [NSString stringWithFormat:@"Event %li", (long)i];
16 | model.state = arc4random_uniform(3);
17 | model.content = [self randomString:i];
18 | [self.timelineData addObject:model];
19 | }
20 | ```
21 |
22 | @WrightsCS
23 | ------------
24 |
25 | Twitter: @WrightsCS
26 | http://www.wrightscsapps.com
27 |
28 | Apps using WCSTimeline
29 | ------------
30 |
31 | If you are using this in your app, please let me know and I will add your app here!
32 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/WCSTimelineModel.h:
--------------------------------------------------------------------------------
1 | //
2 | // WCSTimelineModel.h
3 | // WCSTimeline
4 | //
5 | // Created by Aaron Wright on 3/15/17.
6 | // Copyright © 2017 Wrights Creative Services, L.L.C. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | typedef NS_ENUM(NSInteger, WCSState) {
12 | WCSStateUnknown,
13 | WCSStateInactive,
14 | WCSStateActive
15 | };
16 |
17 | @interface WCSTimelineModel : NSObject
18 |
19 | @property (nonatomic, strong) UIImage * icon;
20 | @property (nonatomic, strong) NSDate * time;
21 | @property (nonatomic, strong) NSString * event;
22 | @property (nonatomic, strong) NSString * content;
23 | @property (nonatomic, assign) BOOL isLast;
24 | @property (nonatomic, assign) WCSState state;
25 | @property (nonatomic, readonly) CGFloat cellHeight;
26 | @property (nonatomic, assign) UIFont * contentFont;
27 |
28 | @end
29 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/Masonry.h:
--------------------------------------------------------------------------------
1 | //
2 | // Masonry.h
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 20/07/13.
6 | // Copyright (c) 2013 cloudling. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | //! Project version number for Masonry.
12 | FOUNDATION_EXPORT double MasonryVersionNumber;
13 |
14 | //! Project version string for Masonry.
15 | FOUNDATION_EXPORT const unsigned char MasonryVersionString[];
16 |
17 | #import "MASUtilities.h"
18 | #import "View+MASAdditions.h"
19 | #import "View+MASShorthandAdditions.h"
20 | #import "ViewController+MASAdditions.h"
21 | #import "NSArray+MASAdditions.h"
22 | #import "NSArray+MASShorthandAdditions.h"
23 | #import "MASConstraint.h"
24 | #import "MASCompositeConstraint.h"
25 | #import "MASViewAttribute.h"
26 | #import "MASViewConstraint.h"
27 | #import "MASConstraintMaker.h"
28 | #import "MASLayoutConstraint.h"
29 | #import "NSLayoutConstraint+MASDebugAdditions.h"
30 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/WCSLabel/WCSLabel.m:
--------------------------------------------------------------------------------
1 | //
2 | // WCSLabel.m
3 | // WCSTimeline
4 | //
5 | // Created by Aaron Wright on 3/16/17.
6 | // Copyright © 2017 Wrights Creative Services, L.L.C. All rights reserved.
7 | //
8 |
9 | #import "WCSLabel.h"
10 |
11 | @implementation WCSLabel
12 |
13 | - (void)drawTextInRect:(CGRect)rect {
14 | if (self.text) {
15 | CGSize labelStringSize = [self.text boundingRectWithSize:CGSizeMake(CGRectGetWidth(self.frame), CGFLOAT_MAX)
16 | options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
17 | attributes:@{NSFontAttributeName:self.font}
18 | context:nil].size;
19 | [super drawTextInRect:CGRectMake(0, 0, ceilf(CGRectGetWidth(self.frame)),ceilf(labelStringSize.height))];
20 | } else {
21 | [super drawTextInRect:rect];
22 | }
23 | }
24 |
25 | @end
26 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/ViewController+MASAdditions.h:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+MASAdditions.h
3 | // Masonry
4 | //
5 | // Created by Craig Siemens on 2015-06-23.
6 | //
7 | //
8 |
9 | #import "MASUtilities.h"
10 | #import "MASConstraintMaker.h"
11 | #import "MASViewAttribute.h"
12 |
13 | #ifdef MAS_VIEW_CONTROLLER
14 |
15 | @interface MAS_VIEW_CONTROLLER (MASAdditions)
16 |
17 | /**
18 | * following properties return a new MASViewAttribute with appropriate UILayoutGuide and NSLayoutAttribute
19 | */
20 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_topLayoutGuide;
21 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_bottomLayoutGuide;
22 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_topLayoutGuideTop;
23 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_topLayoutGuideBottom;
24 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_bottomLayoutGuideTop;
25 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_bottomLayoutGuideBottom;
26 |
27 |
28 | @end
29 |
30 | #endif
31 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/NSArray+MASShorthandAdditions.h:
--------------------------------------------------------------------------------
1 | //
2 | // NSArray+MASShorthandAdditions.h
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 22/07/13.
6 | // Copyright (c) 2013 Jonas Budelmann. All rights reserved.
7 | //
8 |
9 | #import "NSArray+MASAdditions.h"
10 |
11 | #ifdef MAS_SHORTHAND
12 |
13 | /**
14 | * Shorthand array additions without the 'mas_' prefixes,
15 | * only enabled if MAS_SHORTHAND is defined
16 | */
17 | @interface NSArray (MASShorthandAdditions)
18 |
19 | - (NSArray *)makeConstraints:(void(^)(MASConstraintMaker *make))block;
20 | - (NSArray *)updateConstraints:(void(^)(MASConstraintMaker *make))block;
21 | - (NSArray *)remakeConstraints:(void(^)(MASConstraintMaker *make))block;
22 |
23 | @end
24 |
25 | @implementation NSArray (MASShorthandAdditions)
26 |
27 | - (NSArray *)makeConstraints:(void(^)(MASConstraintMaker *))block {
28 | return [self mas_makeConstraints:block];
29 | }
30 |
31 | - (NSArray *)updateConstraints:(void(^)(MASConstraintMaker *))block {
32 | return [self mas_updateConstraints:block];
33 | }
34 |
35 | - (NSArray *)remakeConstraints:(void(^)(MASConstraintMaker *))block {
36 | return [self mas_remakeConstraints:block];
37 | }
38 |
39 | @end
40 |
41 | #endif
42 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/WCSTimelineModel.m:
--------------------------------------------------------------------------------
1 | //
2 | // WCSTimelineModel.m
3 | // WCSTimeline
4 | //
5 | // Created by Aaron Wright on 3/15/17.
6 | // Copyright © 2017 Wrights Creative Services, L.L.C. All rights reserved.
7 | //
8 |
9 | #import "WCSTimelineModel.h"
10 |
11 | @implementation WCSTimelineModel
12 |
13 | @synthesize cellHeight = _cellHeight;
14 |
15 | - (NSString*)description {
16 | return [NSString stringWithFormat:@"< time=%@, event=%@, content=%@, cellHeight=%f>",
17 | self,
18 | self.time,
19 | self.event,
20 | self.content,
21 | self.cellHeight
22 | ];
23 | }
24 |
25 | - (CGFloat)cellHeight {
26 | return [self heightForContent:self.content];
27 | }
28 |
29 | - (CGFloat)heightForContent:(NSString *)stringContent
30 | {
31 | NSDictionary * attributes = @{NSFontAttributeName:[UIFont systemFontOfSize:10.f]};
32 | NSMutableAttributedString * contentString = [[NSMutableAttributedString alloc] initWithString:stringContent attributes:attributes];
33 | CGRect rect = [contentString boundingRectWithSize:(CGSize){320, MAXFLOAT}
34 | options:NSStringDrawingUsesLineFragmentOrigin
35 | context:nil];
36 | return rect.size.height + 45;
37 | }
38 |
39 | @end
40 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/MASViewAttribute.m:
--------------------------------------------------------------------------------
1 | //
2 | // MASAttribute.m
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 21/07/13.
6 | // Copyright (c) 2013 cloudling. All rights reserved.
7 | //
8 |
9 | #import "MASViewAttribute.h"
10 |
11 | @implementation MASViewAttribute
12 |
13 | - (id)initWithView:(MAS_VIEW *)view layoutAttribute:(NSLayoutAttribute)layoutAttribute {
14 | self = [self initWithView:view item:view layoutAttribute:layoutAttribute];
15 | return self;
16 | }
17 |
18 | - (id)initWithView:(MAS_VIEW *)view item:(id)item layoutAttribute:(NSLayoutAttribute)layoutAttribute {
19 | self = [super init];
20 | if (!self) return nil;
21 |
22 | _view = view;
23 | _item = item;
24 | _layoutAttribute = layoutAttribute;
25 |
26 | return self;
27 | }
28 |
29 | - (BOOL)isSizeAttribute {
30 | return self.layoutAttribute == NSLayoutAttributeWidth
31 | || self.layoutAttribute == NSLayoutAttributeHeight;
32 | }
33 |
34 | - (BOOL)isEqual:(MASViewAttribute *)viewAttribute {
35 | if ([viewAttribute isKindOfClass:self.class]) {
36 | return self.view == viewAttribute.view
37 | && self.layoutAttribute == viewAttribute.layoutAttribute;
38 | }
39 | return [super isEqual:viewAttribute];
40 | }
41 |
42 | - (NSUInteger)hash {
43 | return MAS_NSUINTROTATE([self.view hash], MAS_NSUINT_BIT / 2) ^ self.layoutAttribute;
44 | }
45 |
46 | @end
47 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/MASViewAttribute.h:
--------------------------------------------------------------------------------
1 | //
2 | // MASAttribute.h
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 21/07/13.
6 | // Copyright (c) 2013 cloudling. All rights reserved.
7 | //
8 |
9 | #import "MASUtilities.h"
10 |
11 | /**
12 | * An immutable tuple which stores the view and the related NSLayoutAttribute.
13 | * Describes part of either the left or right hand side of a constraint equation
14 | */
15 | @interface MASViewAttribute : NSObject
16 |
17 | /**
18 | * The view which the reciever relates to. Can be nil if item is not a view.
19 | */
20 | @property (nonatomic, weak, readonly) MAS_VIEW *view;
21 |
22 | /**
23 | * The item which the reciever relates to.
24 | */
25 | @property (nonatomic, weak, readonly) id item;
26 |
27 | /**
28 | * The attribute which the reciever relates to
29 | */
30 | @property (nonatomic, assign, readonly) NSLayoutAttribute layoutAttribute;
31 |
32 | /**
33 | * Convenience initializer.
34 | */
35 | - (id)initWithView:(MAS_VIEW *)view layoutAttribute:(NSLayoutAttribute)layoutAttribute;
36 |
37 | /**
38 | * The designated initializer.
39 | */
40 | - (id)initWithView:(MAS_VIEW *)view item:(id)item layoutAttribute:(NSLayoutAttribute)layoutAttribute;
41 |
42 | /**
43 | * Determine whether the layoutAttribute is a size attribute
44 | *
45 | * @return YES if layoutAttribute is equal to NSLayoutAttributeWidth or NSLayoutAttributeHeight
46 | */
47 | - (BOOL)isSizeAttribute;
48 |
49 | @end
50 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/ViewController+MASAdditions.m:
--------------------------------------------------------------------------------
1 | //
2 | // UIViewController+MASAdditions.m
3 | // Masonry
4 | //
5 | // Created by Craig Siemens on 2015-06-23.
6 | //
7 | //
8 |
9 | #import "ViewController+MASAdditions.h"
10 |
11 | #ifdef MAS_VIEW_CONTROLLER
12 |
13 | @implementation MAS_VIEW_CONTROLLER (MASAdditions)
14 |
15 | - (MASViewAttribute *)mas_topLayoutGuide {
16 | return [[MASViewAttribute alloc] initWithView:self.view item:self.topLayoutGuide layoutAttribute:NSLayoutAttributeBottom];
17 | }
18 | - (MASViewAttribute *)mas_topLayoutGuideTop {
19 | return [[MASViewAttribute alloc] initWithView:self.view item:self.topLayoutGuide layoutAttribute:NSLayoutAttributeTop];
20 | }
21 | - (MASViewAttribute *)mas_topLayoutGuideBottom {
22 | return [[MASViewAttribute alloc] initWithView:self.view item:self.topLayoutGuide layoutAttribute:NSLayoutAttributeBottom];
23 | }
24 |
25 | - (MASViewAttribute *)mas_bottomLayoutGuide {
26 | return [[MASViewAttribute alloc] initWithView:self.view item:self.bottomLayoutGuide layoutAttribute:NSLayoutAttributeTop];
27 | }
28 | - (MASViewAttribute *)mas_bottomLayoutGuideTop {
29 | return [[MASViewAttribute alloc] initWithView:self.view item:self.bottomLayoutGuide layoutAttribute:NSLayoutAttributeTop];
30 | }
31 | - (MASViewAttribute *)mas_bottomLayoutGuideBottom {
32 | return [[MASViewAttribute alloc] initWithView:self.view item:self.bottomLayoutGuide layoutAttribute:NSLayoutAttributeBottom];
33 | }
34 |
35 |
36 |
37 | @end
38 |
39 | #endif
40 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/MASViewConstraint.h:
--------------------------------------------------------------------------------
1 | //
2 | // MASConstraint.h
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 20/07/13.
6 | // Copyright (c) 2013 cloudling. All rights reserved.
7 | //
8 |
9 | #import "MASViewAttribute.h"
10 | #import "MASConstraint.h"
11 | #import "MASLayoutConstraint.h"
12 | #import "MASUtilities.h"
13 |
14 | /**
15 | * A single constraint.
16 | * Contains the attributes neccessary for creating a NSLayoutConstraint and adding it to the appropriate view
17 | */
18 | @interface MASViewConstraint : MASConstraint
19 |
20 | /**
21 | * First item/view and first attribute of the NSLayoutConstraint
22 | */
23 | @property (nonatomic, strong, readonly) MASViewAttribute *firstViewAttribute;
24 |
25 | /**
26 | * Second item/view and second attribute of the NSLayoutConstraint
27 | */
28 | @property (nonatomic, strong, readonly) MASViewAttribute *secondViewAttribute;
29 |
30 | /**
31 | * initialises the MASViewConstraint with the first part of the equation
32 | *
33 | * @param firstViewAttribute view.mas_left, view.mas_width etc.
34 | *
35 | * @return a new view constraint
36 | */
37 | - (id)initWithFirstViewAttribute:(MASViewAttribute *)firstViewAttribute;
38 |
39 | /**
40 | * Returns all MASViewConstraints installed with this view as a first item.
41 | *
42 | * @param view A view to retrieve constraints for.
43 | *
44 | * @return An array of MASViewConstraints.
45 | */
46 | + (NSArray *)installedConstraintsForView:(MAS_VIEW *)view;
47 |
48 | @end
49 |
--------------------------------------------------------------------------------
/Example/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UILaunchStoryboardName
24 | LaunchScreen
25 | UIMainStoryboardFile
26 | Main
27 | UIRequiredDeviceCapabilities
28 |
29 | armv7
30 |
31 | UISupportedInterfaceOrientations
32 |
33 | UIInterfaceOrientationPortrait
34 | UIInterfaceOrientationLandscapeLeft
35 | UIInterfaceOrientationLandscapeRight
36 |
37 | UISupportedInterfaceOrientations~ipad
38 |
39 | UIInterfaceOrientationPortrait
40 | UIInterfaceOrientationPortraitUpsideDown
41 | UIInterfaceOrientationLandscapeLeft
42 | UIInterfaceOrientationLandscapeRight
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/Example/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/Example/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | }
88 | ],
89 | "info" : {
90 | "version" : 1,
91 | "author" : "xcode"
92 | }
93 | }
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/MASConstraint+Private.h:
--------------------------------------------------------------------------------
1 | //
2 | // MASConstraint+Private.h
3 | // Masonry
4 | //
5 | // Created by Nick Tymchenko on 29/04/14.
6 | // Copyright (c) 2014 cloudling. All rights reserved.
7 | //
8 |
9 | #import "MASConstraint.h"
10 |
11 | @protocol MASConstraintDelegate;
12 |
13 |
14 | @interface MASConstraint ()
15 |
16 | /**
17 | * Whether or not to check for an existing constraint instead of adding constraint
18 | */
19 | @property (nonatomic, assign) BOOL updateExisting;
20 |
21 | /**
22 | * Usually MASConstraintMaker but could be a parent MASConstraint
23 | */
24 | @property (nonatomic, weak) id delegate;
25 |
26 | /**
27 | * Based on a provided value type, is equal to calling:
28 | * NSNumber - setOffset:
29 | * NSValue with CGPoint - setPointOffset:
30 | * NSValue with CGSize - setSizeOffset:
31 | * NSValue with MASEdgeInsets - setInsets:
32 | */
33 | - (void)setLayoutConstantWithValue:(NSValue *)value;
34 |
35 | @end
36 |
37 |
38 | @interface MASConstraint (Abstract)
39 |
40 | /**
41 | * Sets the constraint relation to given NSLayoutRelation
42 | * returns a block which accepts one of the following:
43 | * MASViewAttribute, UIView, NSValue, NSArray
44 | * see readme for more details.
45 | */
46 | - (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation;
47 |
48 | /**
49 | * Override to set a custom chaining behaviour
50 | */
51 | - (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute;
52 |
53 | @end
54 |
55 |
56 | @protocol MASConstraintDelegate
57 |
58 | /**
59 | * Notifies the delegate when the constraint needs to be replaced with another constraint. For example
60 | * A MASViewConstraint may turn into a MASCompositeConstraint when an array is passed to one of the equality blocks
61 | */
62 | - (void)constraint:(MASConstraint *)constraint shouldBeReplacedWithConstraint:(MASConstraint *)replacementConstraint;
63 |
64 | - (MASConstraint *)constraint:(MASConstraint *)constraint addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute;
65 |
66 | @end
67 |
--------------------------------------------------------------------------------
/Example/AppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.m
3 | // WCSTimeline
4 | //
5 | // Created by Aaron Wright on 3/15/17.
6 | // Copyright © 2017 Wrights Creative Services, L.L.C. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate.h"
10 |
11 | @interface AppDelegate ()
12 |
13 | @end
14 |
15 | @implementation AppDelegate
16 |
17 |
18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
19 | // Override point for customization after application launch.
20 | return YES;
21 | }
22 |
23 |
24 | - (void)applicationWillResignActive:(UIApplication *)application {
25 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
26 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
27 | }
28 |
29 |
30 | - (void)applicationDidEnterBackground:(UIApplication *)application {
31 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
32 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
33 | }
34 |
35 |
36 | - (void)applicationWillEnterForeground:(UIApplication *)application {
37 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
38 | }
39 |
40 |
41 | - (void)applicationDidBecomeActive:(UIApplication *)application {
42 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
43 | }
44 |
45 |
46 | - (void)applicationWillTerminate:(UIApplication *)application {
47 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
48 | }
49 |
50 |
51 | @end
52 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/NSDate+TimeAgo/NSDate+TimeAgo.h:
--------------------------------------------------------------------------------
1 | //
2 | // NSDate+NVTimeAgo.h
3 | // Adventures
4 | //
5 | // Created by Nikil Viswanathan on 4/18/13.
6 | // Copyright (c) 2013 Nikil Viswanathan. All rights reserved.
7 | //
8 |
9 | /*
10 | This NSDate category adds the facebook style "time ago" date formatting.
11 | This mimics Facebook mobile (the desktop version has slightly different date formatting).
12 | This assumes all dates are in the past.
13 |
14 |
15 | To use this in your iOS project:
16 | --------------------------------
17 | 1. Drag both NSDate+NVTimeAgo.m aand NSDate+NVTimeAgo.h into your iOS project in XCode
18 | 2. In the files that you want to use this functionality in,itType:
19 |
20 | #import "NSDate+NVTimeAgo.h"
21 |
22 | somewhere near the top of your file.
23 |
24 | 3. Use the date formatter on a date by calling:
25 |
26 | [date formattedAsTimeAgo];
27 |
28 | where date is an (NSDate *) and represents a date IN THE PAST (relative to now).
29 |
30 |
31 | If you have a mysql datetime string and you want to convert it to the time ago format, do:
32 |
33 | NSString *mysqlDatetime =
34 | NSString *timeAgoFormattedDate = [NSDate mysqlDatetimeFormattedAsTimeAgo:mysqlDatetime];
35 |
36 |
37 |
38 |
39 | Made By Nikil Viswanathan
40 | -------------------------
41 | 4/18/2013
42 | You can contact me on: www.nikilster.com
43 |
44 |
45 |
46 | Date Format
47 | -----------
48 | < 1 minute = "Just now"
49 | < 1 hour = "x minutes ago"
50 | Today = "x hours ago"
51 | Yesterday = "Yesterday at 1:28pm"
52 | < Last 7 days = "Friday at 1:48am"
53 | < Last 30 days = "March 30 at 1:14 pm"
54 | < 1 year = "September 15"
55 | Anything else = "September 9, 2011"
56 |
57 |
58 | */
59 |
60 | #import
61 |
62 | @interface NSDate (NVFacebookTimeAgo)
63 |
64 | /*
65 | Mysql Datetime Formatted As Time Ago
66 | Takes in a mysql datetime string and returns the Time Ago date format
67 | */
68 | + (NSString*)mysqlDatetimeFormattedAsTimeAgo:(NSString *)mysqlDatetime;
69 |
70 |
71 | /*
72 | Formatted As Time Ago
73 | Returns the time formatted as Time Ago (in the style of Facebook's mobile date formatting)
74 | */
75 | - (NSString *)formattedAsTimeAgo;
76 |
77 | @end
78 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/NSArray+MASAdditions.h:
--------------------------------------------------------------------------------
1 | //
2 | // NSArray+MASAdditions.h
3 | //
4 | //
5 | // Created by Daniel Hammond on 11/26/13.
6 | //
7 | //
8 |
9 | #import "MASUtilities.h"
10 | #import "MASConstraintMaker.h"
11 | #import "MASViewAttribute.h"
12 |
13 | typedef NS_ENUM(NSUInteger, MASAxisType) {
14 | MASAxisTypeHorizontal,
15 | MASAxisTypeVertical
16 | };
17 |
18 | @interface NSArray (MASAdditions)
19 |
20 | /**
21 | * Creates a MASConstraintMaker with each view in the callee.
22 | * Any constraints defined are added to the view or the appropriate superview once the block has finished executing on each view
23 | *
24 | * @param block scope within which you can build up the constraints which you wish to apply to each view.
25 | *
26 | * @return Array of created MASConstraints
27 | */
28 | - (NSArray *)mas_makeConstraints:(void (^)(MASConstraintMaker *make))block;
29 |
30 | /**
31 | * Creates a MASConstraintMaker with each view in the callee.
32 | * Any constraints defined are added to each view or the appropriate superview once the block has finished executing on each view.
33 | * If an existing constraint exists then it will be updated instead.
34 | *
35 | * @param block scope within which you can build up the constraints which you wish to apply to each view.
36 | *
37 | * @return Array of created/updated MASConstraints
38 | */
39 | - (NSArray *)mas_updateConstraints:(void (^)(MASConstraintMaker *make))block;
40 |
41 | /**
42 | * Creates a MASConstraintMaker with each view in the callee.
43 | * Any constraints defined are added to each view or the appropriate superview once the block has finished executing on each view.
44 | * All constraints previously installed for the views will be removed.
45 | *
46 | * @param block scope within which you can build up the constraints which you wish to apply to each view.
47 | *
48 | * @return Array of created/updated MASConstraints
49 | */
50 | - (NSArray *)mas_remakeConstraints:(void (^)(MASConstraintMaker *make))block;
51 |
52 | /**
53 | * distribute with fixed spacing
54 | *
55 | * @param axisType which axis to distribute items along
56 | * @param fixedSpacing the spacing between each item
57 | * @param leadSpacing the spacing before the first item and the container
58 | * @param tailSpacing the spacing after the last item and the container
59 | */
60 | - (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType withFixedSpacing:(CGFloat)fixedSpacing leadSpacing:(CGFloat)leadSpacing tailSpacing:(CGFloat)tailSpacing;
61 |
62 | /**
63 | * distribute with fixed item size
64 | *
65 | * @param axisType which axis to distribute items along
66 | * @param fixedItemLength the fixed length of each item
67 | * @param leadSpacing the spacing before the first item and the container
68 | * @param tailSpacing the spacing after the last item and the container
69 | */
70 | - (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType withFixedItemLength:(CGFloat)fixedItemLength leadSpacing:(CGFloat)leadSpacing tailSpacing:(CGFloat)tailSpacing;
71 |
72 | @end
73 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/View+MASShorthandAdditions.h:
--------------------------------------------------------------------------------
1 | //
2 | // UIView+MASShorthandAdditions.h
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 22/07/13.
6 | // Copyright (c) 2013 Jonas Budelmann. All rights reserved.
7 | //
8 |
9 | #import "View+MASAdditions.h"
10 |
11 | #ifdef MAS_SHORTHAND
12 |
13 | /**
14 | * Shorthand view additions without the 'mas_' prefixes,
15 | * only enabled if MAS_SHORTHAND is defined
16 | */
17 | @interface MAS_VIEW (MASShorthandAdditions)
18 |
19 | @property (nonatomic, strong, readonly) MASViewAttribute *left;
20 | @property (nonatomic, strong, readonly) MASViewAttribute *top;
21 | @property (nonatomic, strong, readonly) MASViewAttribute *right;
22 | @property (nonatomic, strong, readonly) MASViewAttribute *bottom;
23 | @property (nonatomic, strong, readonly) MASViewAttribute *leading;
24 | @property (nonatomic, strong, readonly) MASViewAttribute *trailing;
25 | @property (nonatomic, strong, readonly) MASViewAttribute *width;
26 | @property (nonatomic, strong, readonly) MASViewAttribute *height;
27 | @property (nonatomic, strong, readonly) MASViewAttribute *centerX;
28 | @property (nonatomic, strong, readonly) MASViewAttribute *centerY;
29 | @property (nonatomic, strong, readonly) MASViewAttribute *baseline;
30 | @property (nonatomic, strong, readonly) MASViewAttribute *(^attribute)(NSLayoutAttribute attr);
31 |
32 | #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
33 |
34 | @property (nonatomic, strong, readonly) MASViewAttribute *firstBaseline;
35 | @property (nonatomic, strong, readonly) MASViewAttribute *lastBaseline;
36 |
37 | #endif
38 |
39 | #if TARGET_OS_IPHONE || TARGET_OS_TV
40 |
41 | @property (nonatomic, strong, readonly) MASViewAttribute *leftMargin;
42 | @property (nonatomic, strong, readonly) MASViewAttribute *rightMargin;
43 | @property (nonatomic, strong, readonly) MASViewAttribute *topMargin;
44 | @property (nonatomic, strong, readonly) MASViewAttribute *bottomMargin;
45 | @property (nonatomic, strong, readonly) MASViewAttribute *leadingMargin;
46 | @property (nonatomic, strong, readonly) MASViewAttribute *trailingMargin;
47 | @property (nonatomic, strong, readonly) MASViewAttribute *centerXWithinMargins;
48 | @property (nonatomic, strong, readonly) MASViewAttribute *centerYWithinMargins;
49 |
50 | #endif
51 |
52 | - (NSArray *)makeConstraints:(void(^)(MASConstraintMaker *make))block;
53 | - (NSArray *)updateConstraints:(void(^)(MASConstraintMaker *make))block;
54 | - (NSArray *)remakeConstraints:(void(^)(MASConstraintMaker *make))block;
55 |
56 | @end
57 |
58 | #define MAS_ATTR_FORWARD(attr) \
59 | - (MASViewAttribute *)attr { \
60 | return [self mas_##attr]; \
61 | }
62 |
63 | @implementation MAS_VIEW (MASShorthandAdditions)
64 |
65 | MAS_ATTR_FORWARD(top);
66 | MAS_ATTR_FORWARD(left);
67 | MAS_ATTR_FORWARD(bottom);
68 | MAS_ATTR_FORWARD(right);
69 | MAS_ATTR_FORWARD(leading);
70 | MAS_ATTR_FORWARD(trailing);
71 | MAS_ATTR_FORWARD(width);
72 | MAS_ATTR_FORWARD(height);
73 | MAS_ATTR_FORWARD(centerX);
74 | MAS_ATTR_FORWARD(centerY);
75 | MAS_ATTR_FORWARD(baseline);
76 |
77 | #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
78 |
79 | MAS_ATTR_FORWARD(firstBaseline);
80 | MAS_ATTR_FORWARD(lastBaseline);
81 |
82 | #endif
83 |
84 | #if TARGET_OS_IPHONE || TARGET_OS_TV
85 |
86 | MAS_ATTR_FORWARD(leftMargin);
87 | MAS_ATTR_FORWARD(rightMargin);
88 | MAS_ATTR_FORWARD(topMargin);
89 | MAS_ATTR_FORWARD(bottomMargin);
90 | MAS_ATTR_FORWARD(leadingMargin);
91 | MAS_ATTR_FORWARD(trailingMargin);
92 | MAS_ATTR_FORWARD(centerXWithinMargins);
93 | MAS_ATTR_FORWARD(centerYWithinMargins);
94 |
95 | #endif
96 |
97 | - (MASViewAttribute *(^)(NSLayoutAttribute))attribute {
98 | return [self mas_attribute];
99 | }
100 |
101 | - (NSArray *)makeConstraints:(void(^)(MASConstraintMaker *))block {
102 | return [self mas_makeConstraints:block];
103 | }
104 |
105 | - (NSArray *)updateConstraints:(void(^)(MASConstraintMaker *))block {
106 | return [self mas_updateConstraints:block];
107 | }
108 |
109 | - (NSArray *)remakeConstraints:(void(^)(MASConstraintMaker *))block {
110 | return [self mas_remakeConstraints:block];
111 | }
112 |
113 | @end
114 |
115 | #endif
116 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/View+MASAdditions.h:
--------------------------------------------------------------------------------
1 | //
2 | // UIView+MASAdditions.h
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 20/07/13.
6 | // Copyright (c) 2013 cloudling. All rights reserved.
7 | //
8 |
9 | #import "MASUtilities.h"
10 | #import "MASConstraintMaker.h"
11 | #import "MASViewAttribute.h"
12 |
13 | /**
14 | * Provides constraint maker block
15 | * and convience methods for creating MASViewAttribute which are view + NSLayoutAttribute pairs
16 | */
17 | @interface MAS_VIEW (MASAdditions)
18 |
19 | /**
20 | * following properties return a new MASViewAttribute with current view and appropriate NSLayoutAttribute
21 | */
22 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_left;
23 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_top;
24 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_right;
25 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_bottom;
26 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_leading;
27 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_trailing;
28 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_width;
29 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_height;
30 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_centerX;
31 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_centerY;
32 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_baseline;
33 | @property (nonatomic, strong, readonly) MASViewAttribute *(^mas_attribute)(NSLayoutAttribute attr);
34 |
35 | #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
36 |
37 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_firstBaseline;
38 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_lastBaseline;
39 |
40 | #endif
41 |
42 | #if TARGET_OS_IPHONE || TARGET_OS_TV
43 |
44 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_leftMargin;
45 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_rightMargin;
46 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_topMargin;
47 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_bottomMargin;
48 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_leadingMargin;
49 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_trailingMargin;
50 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_centerXWithinMargins;
51 | @property (nonatomic, strong, readonly) MASViewAttribute *mas_centerYWithinMargins;
52 |
53 | #endif
54 |
55 | /**
56 | * a key to associate with this view
57 | */
58 | @property (nonatomic, strong) id mas_key;
59 |
60 | /**
61 | * Finds the closest common superview between this view and another view
62 | *
63 | * @param view other view
64 | *
65 | * @return returns nil if common superview could not be found
66 | */
67 | - (instancetype)mas_closestCommonSuperview:(MAS_VIEW *)view;
68 |
69 | /**
70 | * Creates a MASConstraintMaker with the callee view.
71 | * Any constraints defined are added to the view or the appropriate superview once the block has finished executing
72 | *
73 | * @param block scope within which you can build up the constraints which you wish to apply to the view.
74 | *
75 | * @return Array of created MASConstraints
76 | */
77 | - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block;
78 |
79 | /**
80 | * Creates a MASConstraintMaker with the callee view.
81 | * Any constraints defined are added to the view or the appropriate superview once the block has finished executing.
82 | * If an existing constraint exists then it will be updated instead.
83 | *
84 | * @param block scope within which you can build up the constraints which you wish to apply to the view.
85 | *
86 | * @return Array of created/updated MASConstraints
87 | */
88 | - (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block;
89 |
90 | /**
91 | * Creates a MASConstraintMaker with the callee view.
92 | * Any constraints defined are added to the view or the appropriate superview once the block has finished executing.
93 | * All constraints previously installed for the view will be removed.
94 | *
95 | * @param block scope within which you can build up the constraints which you wish to apply to the view.
96 | *
97 | * @return Array of created/updated MASConstraints
98 | */
99 | - (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block;
100 |
101 | @end
102 |
--------------------------------------------------------------------------------
/Example/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/MASCompositeConstraint.m:
--------------------------------------------------------------------------------
1 | //
2 | // MASCompositeConstraint.m
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 21/07/13.
6 | // Copyright (c) 2013 cloudling. All rights reserved.
7 | //
8 |
9 | #import "MASCompositeConstraint.h"
10 | #import "MASConstraint+Private.h"
11 |
12 | @interface MASCompositeConstraint ()
13 |
14 | @property (nonatomic, strong) id mas_key;
15 | @property (nonatomic, strong) NSMutableArray *childConstraints;
16 |
17 | @end
18 |
19 | @implementation MASCompositeConstraint
20 |
21 | - (id)initWithChildren:(NSArray *)children {
22 | self = [super init];
23 | if (!self) return nil;
24 |
25 | _childConstraints = [children mutableCopy];
26 | for (MASConstraint *constraint in _childConstraints) {
27 | constraint.delegate = self;
28 | }
29 |
30 | return self;
31 | }
32 |
33 | #pragma mark - MASConstraintDelegate
34 |
35 | - (void)constraint:(MASConstraint *)constraint shouldBeReplacedWithConstraint:(MASConstraint *)replacementConstraint {
36 | NSUInteger index = [self.childConstraints indexOfObject:constraint];
37 | NSAssert(index != NSNotFound, @"Could not find constraint %@", constraint);
38 | [self.childConstraints replaceObjectAtIndex:index withObject:replacementConstraint];
39 | }
40 |
41 | - (MASConstraint *)constraint:(MASConstraint __unused *)constraint addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
42 | id strongDelegate = self.delegate;
43 | MASConstraint *newConstraint = [strongDelegate constraint:self addConstraintWithLayoutAttribute:layoutAttribute];
44 | newConstraint.delegate = self;
45 | [self.childConstraints addObject:newConstraint];
46 | return newConstraint;
47 | }
48 |
49 | #pragma mark - NSLayoutConstraint multiplier proxies
50 |
51 | - (MASConstraint * (^)(CGFloat))multipliedBy {
52 | return ^id(CGFloat multiplier) {
53 | for (MASConstraint *constraint in self.childConstraints) {
54 | constraint.multipliedBy(multiplier);
55 | }
56 | return self;
57 | };
58 | }
59 |
60 | - (MASConstraint * (^)(CGFloat))dividedBy {
61 | return ^id(CGFloat divider) {
62 | for (MASConstraint *constraint in self.childConstraints) {
63 | constraint.dividedBy(divider);
64 | }
65 | return self;
66 | };
67 | }
68 |
69 | #pragma mark - MASLayoutPriority proxy
70 |
71 | - (MASConstraint * (^)(MASLayoutPriority))priority {
72 | return ^id(MASLayoutPriority priority) {
73 | for (MASConstraint *constraint in self.childConstraints) {
74 | constraint.priority(priority);
75 | }
76 | return self;
77 | };
78 | }
79 |
80 | #pragma mark - NSLayoutRelation proxy
81 |
82 | - (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation {
83 | return ^id(id attr, NSLayoutRelation relation) {
84 | for (MASConstraint *constraint in self.childConstraints.copy) {
85 | constraint.equalToWithRelation(attr, relation);
86 | }
87 | return self;
88 | };
89 | }
90 |
91 | #pragma mark - attribute chaining
92 |
93 | - (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
94 | [self constraint:self addConstraintWithLayoutAttribute:layoutAttribute];
95 | return self;
96 | }
97 |
98 | #pragma mark - Animator proxy
99 |
100 | #if TARGET_OS_MAC && !(TARGET_OS_IPHONE || TARGET_OS_TV)
101 |
102 | - (MASConstraint *)animator {
103 | for (MASConstraint *constraint in self.childConstraints) {
104 | [constraint animator];
105 | }
106 | return self;
107 | }
108 |
109 | #endif
110 |
111 | #pragma mark - debug helpers
112 |
113 | - (MASConstraint * (^)(id))key {
114 | return ^id(id key) {
115 | self.mas_key = key;
116 | int i = 0;
117 | for (MASConstraint *constraint in self.childConstraints) {
118 | constraint.key([NSString stringWithFormat:@"%@[%d]", key, i++]);
119 | }
120 | return self;
121 | };
122 | }
123 |
124 | #pragma mark - NSLayoutConstraint constant setters
125 |
126 | - (void)setInsets:(MASEdgeInsets)insets {
127 | for (MASConstraint *constraint in self.childConstraints) {
128 | constraint.insets = insets;
129 | }
130 | }
131 |
132 | - (void)setOffset:(CGFloat)offset {
133 | for (MASConstraint *constraint in self.childConstraints) {
134 | constraint.offset = offset;
135 | }
136 | }
137 |
138 | - (void)setSizeOffset:(CGSize)sizeOffset {
139 | for (MASConstraint *constraint in self.childConstraints) {
140 | constraint.sizeOffset = sizeOffset;
141 | }
142 | }
143 |
144 | - (void)setCenterOffset:(CGPoint)centerOffset {
145 | for (MASConstraint *constraint in self.childConstraints) {
146 | constraint.centerOffset = centerOffset;
147 | }
148 | }
149 |
150 | #pragma mark - MASConstraint
151 |
152 | - (void)activate {
153 | for (MASConstraint *constraint in self.childConstraints) {
154 | [constraint activate];
155 | }
156 | }
157 |
158 | - (void)deactivate {
159 | for (MASConstraint *constraint in self.childConstraints) {
160 | [constraint deactivate];
161 | }
162 | }
163 |
164 | - (void)install {
165 | for (MASConstraint *constraint in self.childConstraints) {
166 | constraint.updateExisting = self.updateExisting;
167 | [constraint install];
168 | }
169 | }
170 |
171 | - (void)uninstall {
172 | for (MASConstraint *constraint in self.childConstraints) {
173 | [constraint uninstall];
174 | }
175 | }
176 |
177 | @end
178 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/MASConstraintMaker.h:
--------------------------------------------------------------------------------
1 | //
2 | // MASConstraintBuilder.h
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 20/07/13.
6 | // Copyright (c) 2013 cloudling. All rights reserved.
7 | //
8 |
9 | #import "MASConstraint.h"
10 | #import "MASUtilities.h"
11 |
12 | typedef NS_OPTIONS(NSInteger, MASAttribute) {
13 | MASAttributeLeft = 1 << NSLayoutAttributeLeft,
14 | MASAttributeRight = 1 << NSLayoutAttributeRight,
15 | MASAttributeTop = 1 << NSLayoutAttributeTop,
16 | MASAttributeBottom = 1 << NSLayoutAttributeBottom,
17 | MASAttributeLeading = 1 << NSLayoutAttributeLeading,
18 | MASAttributeTrailing = 1 << NSLayoutAttributeTrailing,
19 | MASAttributeWidth = 1 << NSLayoutAttributeWidth,
20 | MASAttributeHeight = 1 << NSLayoutAttributeHeight,
21 | MASAttributeCenterX = 1 << NSLayoutAttributeCenterX,
22 | MASAttributeCenterY = 1 << NSLayoutAttributeCenterY,
23 | MASAttributeBaseline = 1 << NSLayoutAttributeBaseline,
24 |
25 | #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
26 |
27 | MASAttributeFirstBaseline = 1 << NSLayoutAttributeFirstBaseline,
28 | MASAttributeLastBaseline = 1 << NSLayoutAttributeLastBaseline,
29 |
30 | #endif
31 |
32 | #if TARGET_OS_IPHONE || TARGET_OS_TV
33 |
34 | MASAttributeLeftMargin = 1 << NSLayoutAttributeLeftMargin,
35 | MASAttributeRightMargin = 1 << NSLayoutAttributeRightMargin,
36 | MASAttributeTopMargin = 1 << NSLayoutAttributeTopMargin,
37 | MASAttributeBottomMargin = 1 << NSLayoutAttributeBottomMargin,
38 | MASAttributeLeadingMargin = 1 << NSLayoutAttributeLeadingMargin,
39 | MASAttributeTrailingMargin = 1 << NSLayoutAttributeTrailingMargin,
40 | MASAttributeCenterXWithinMargins = 1 << NSLayoutAttributeCenterXWithinMargins,
41 | MASAttributeCenterYWithinMargins = 1 << NSLayoutAttributeCenterYWithinMargins,
42 |
43 | #endif
44 |
45 | };
46 |
47 | /**
48 | * Provides factory methods for creating MASConstraints.
49 | * Constraints are collected until they are ready to be installed
50 | *
51 | */
52 | @interface MASConstraintMaker : NSObject
53 |
54 | /**
55 | * The following properties return a new MASViewConstraint
56 | * with the first item set to the makers associated view and the appropriate MASViewAttribute
57 | */
58 | @property (nonatomic, strong, readonly) MASConstraint *left;
59 | @property (nonatomic, strong, readonly) MASConstraint *top;
60 | @property (nonatomic, strong, readonly) MASConstraint *right;
61 | @property (nonatomic, strong, readonly) MASConstraint *bottom;
62 | @property (nonatomic, strong, readonly) MASConstraint *leading;
63 | @property (nonatomic, strong, readonly) MASConstraint *trailing;
64 | @property (nonatomic, strong, readonly) MASConstraint *width;
65 | @property (nonatomic, strong, readonly) MASConstraint *height;
66 | @property (nonatomic, strong, readonly) MASConstraint *centerX;
67 | @property (nonatomic, strong, readonly) MASConstraint *centerY;
68 | @property (nonatomic, strong, readonly) MASConstraint *baseline;
69 |
70 | #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
71 |
72 | @property (nonatomic, strong, readonly) MASConstraint *firstBaseline;
73 | @property (nonatomic, strong, readonly) MASConstraint *lastBaseline;
74 |
75 | #endif
76 |
77 | #if TARGET_OS_IPHONE || TARGET_OS_TV
78 |
79 | @property (nonatomic, strong, readonly) MASConstraint *leftMargin;
80 | @property (nonatomic, strong, readonly) MASConstraint *rightMargin;
81 | @property (nonatomic, strong, readonly) MASConstraint *topMargin;
82 | @property (nonatomic, strong, readonly) MASConstraint *bottomMargin;
83 | @property (nonatomic, strong, readonly) MASConstraint *leadingMargin;
84 | @property (nonatomic, strong, readonly) MASConstraint *trailingMargin;
85 | @property (nonatomic, strong, readonly) MASConstraint *centerXWithinMargins;
86 | @property (nonatomic, strong, readonly) MASConstraint *centerYWithinMargins;
87 |
88 | #endif
89 |
90 | /**
91 | * Returns a block which creates a new MASCompositeConstraint with the first item set
92 | * to the makers associated view and children corresponding to the set bits in the
93 | * MASAttribute parameter. Combine multiple attributes via binary-or.
94 | */
95 | @property (nonatomic, strong, readonly) MASConstraint *(^attributes)(MASAttribute attrs);
96 |
97 | /**
98 | * Creates a MASCompositeConstraint with type MASCompositeConstraintTypeEdges
99 | * which generates the appropriate MASViewConstraint children (top, left, bottom, right)
100 | * with the first item set to the makers associated view
101 | */
102 | @property (nonatomic, strong, readonly) MASConstraint *edges;
103 |
104 | /**
105 | * Creates a MASCompositeConstraint with type MASCompositeConstraintTypeSize
106 | * which generates the appropriate MASViewConstraint children (width, height)
107 | * with the first item set to the makers associated view
108 | */
109 | @property (nonatomic, strong, readonly) MASConstraint *size;
110 |
111 | /**
112 | * Creates a MASCompositeConstraint with type MASCompositeConstraintTypeCenter
113 | * which generates the appropriate MASViewConstraint children (centerX, centerY)
114 | * with the first item set to the makers associated view
115 | */
116 | @property (nonatomic, strong, readonly) MASConstraint *center;
117 |
118 | /**
119 | * Whether or not to check for an existing constraint instead of adding constraint
120 | */
121 | @property (nonatomic, assign) BOOL updateExisting;
122 |
123 | /**
124 | * Whether or not to remove existing constraints prior to installing
125 | */
126 | @property (nonatomic, assign) BOOL removeExisting;
127 |
128 | /**
129 | * initialises the maker with a default view
130 | *
131 | * @param view any MASConstrait are created with this view as the first item
132 | *
133 | * @return a new MASConstraintMaker
134 | */
135 | - (id)initWithView:(MAS_VIEW *)view;
136 |
137 | /**
138 | * Calls install method on any MASConstraints which have been created by this maker
139 | *
140 | * @return an array of all the installed MASConstraints
141 | */
142 | - (NSArray *)install;
143 |
144 | - (MASConstraint * (^)(dispatch_block_t))group;
145 |
146 | @end
147 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/View+MASAdditions.m:
--------------------------------------------------------------------------------
1 | //
2 | // UIView+MASAdditions.m
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 20/07/13.
6 | // Copyright (c) 2013 cloudling. All rights reserved.
7 | //
8 |
9 | #import "View+MASAdditions.h"
10 | #import
11 |
12 | @implementation MAS_VIEW (MASAdditions)
13 |
14 | - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
15 | self.translatesAutoresizingMaskIntoConstraints = NO;
16 | MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
17 | block(constraintMaker);
18 | return [constraintMaker install];
19 | }
20 |
21 | - (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block {
22 | self.translatesAutoresizingMaskIntoConstraints = NO;
23 | MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
24 | constraintMaker.updateExisting = YES;
25 | block(constraintMaker);
26 | return [constraintMaker install];
27 | }
28 |
29 | - (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block {
30 | self.translatesAutoresizingMaskIntoConstraints = NO;
31 | MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
32 | constraintMaker.removeExisting = YES;
33 | block(constraintMaker);
34 | return [constraintMaker install];
35 | }
36 |
37 | #pragma mark - NSLayoutAttribute properties
38 |
39 | - (MASViewAttribute *)mas_left {
40 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeft];
41 | }
42 |
43 | - (MASViewAttribute *)mas_top {
44 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTop];
45 | }
46 |
47 | - (MASViewAttribute *)mas_right {
48 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeRight];
49 | }
50 |
51 | - (MASViewAttribute *)mas_bottom {
52 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBottom];
53 | }
54 |
55 | - (MASViewAttribute *)mas_leading {
56 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeading];
57 | }
58 |
59 | - (MASViewAttribute *)mas_trailing {
60 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTrailing];
61 | }
62 |
63 | - (MASViewAttribute *)mas_width {
64 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeWidth];
65 | }
66 |
67 | - (MASViewAttribute *)mas_height {
68 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeHeight];
69 | }
70 |
71 | - (MASViewAttribute *)mas_centerX {
72 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterX];
73 | }
74 |
75 | - (MASViewAttribute *)mas_centerY {
76 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterY];
77 | }
78 |
79 | - (MASViewAttribute *)mas_baseline {
80 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBaseline];
81 | }
82 |
83 | - (MASViewAttribute *(^)(NSLayoutAttribute))mas_attribute
84 | {
85 | return ^(NSLayoutAttribute attr) {
86 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:attr];
87 | };
88 | }
89 |
90 | #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
91 |
92 | - (MASViewAttribute *)mas_firstBaseline {
93 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeFirstBaseline];
94 | }
95 | - (MASViewAttribute *)mas_lastBaseline {
96 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLastBaseline];
97 | }
98 |
99 | #endif
100 |
101 | #if TARGET_OS_IPHONE || TARGET_OS_TV
102 |
103 | - (MASViewAttribute *)mas_leftMargin {
104 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeftMargin];
105 | }
106 |
107 | - (MASViewAttribute *)mas_rightMargin {
108 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeRightMargin];
109 | }
110 |
111 | - (MASViewAttribute *)mas_topMargin {
112 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTopMargin];
113 | }
114 |
115 | - (MASViewAttribute *)mas_bottomMargin {
116 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBottomMargin];
117 | }
118 |
119 | - (MASViewAttribute *)mas_leadingMargin {
120 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeadingMargin];
121 | }
122 |
123 | - (MASViewAttribute *)mas_trailingMargin {
124 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTrailingMargin];
125 | }
126 |
127 | - (MASViewAttribute *)mas_centerXWithinMargins {
128 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterXWithinMargins];
129 | }
130 |
131 | - (MASViewAttribute *)mas_centerYWithinMargins {
132 | return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterYWithinMargins];
133 | }
134 |
135 | #endif
136 |
137 | #pragma mark - associated properties
138 |
139 | - (id)mas_key {
140 | return objc_getAssociatedObject(self, @selector(mas_key));
141 | }
142 |
143 | - (void)setMas_key:(id)key {
144 | objc_setAssociatedObject(self, @selector(mas_key), key, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
145 | }
146 |
147 | #pragma mark - heirachy
148 |
149 | - (instancetype)mas_closestCommonSuperview:(MAS_VIEW *)view {
150 | MAS_VIEW *closestCommonSuperview = nil;
151 |
152 | MAS_VIEW *secondViewSuperview = view;
153 | while (!closestCommonSuperview && secondViewSuperview) {
154 | MAS_VIEW *firstViewSuperview = self;
155 | while (!closestCommonSuperview && firstViewSuperview) {
156 | if (secondViewSuperview == firstViewSuperview) {
157 | closestCommonSuperview = secondViewSuperview;
158 | }
159 | firstViewSuperview = firstViewSuperview.superview;
160 | }
161 | secondViewSuperview = secondViewSuperview.superview;
162 | }
163 | return closestCommonSuperview;
164 | }
165 |
166 | @end
167 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/NSLayoutConstraint+MASDebugAdditions.m:
--------------------------------------------------------------------------------
1 | //
2 | // NSLayoutConstraint+MASDebugAdditions.m
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 3/08/13.
6 | // Copyright (c) 2013 Jonas Budelmann. All rights reserved.
7 | //
8 |
9 | #import "NSLayoutConstraint+MASDebugAdditions.h"
10 | #import "MASConstraint.h"
11 | #import "MASLayoutConstraint.h"
12 |
13 | @implementation NSLayoutConstraint (MASDebugAdditions)
14 |
15 | #pragma mark - description maps
16 |
17 | + (NSDictionary *)layoutRelationDescriptionsByValue {
18 | static dispatch_once_t once;
19 | static NSDictionary *descriptionMap;
20 | dispatch_once(&once, ^{
21 | descriptionMap = @{
22 | @(NSLayoutRelationEqual) : @"==",
23 | @(NSLayoutRelationGreaterThanOrEqual) : @">=",
24 | @(NSLayoutRelationLessThanOrEqual) : @"<=",
25 | };
26 | });
27 | return descriptionMap;
28 | }
29 |
30 | + (NSDictionary *)layoutAttributeDescriptionsByValue {
31 | static dispatch_once_t once;
32 | static NSDictionary *descriptionMap;
33 | dispatch_once(&once, ^{
34 | descriptionMap = @{
35 | @(NSLayoutAttributeTop) : @"top",
36 | @(NSLayoutAttributeLeft) : @"left",
37 | @(NSLayoutAttributeBottom) : @"bottom",
38 | @(NSLayoutAttributeRight) : @"right",
39 | @(NSLayoutAttributeLeading) : @"leading",
40 | @(NSLayoutAttributeTrailing) : @"trailing",
41 | @(NSLayoutAttributeWidth) : @"width",
42 | @(NSLayoutAttributeHeight) : @"height",
43 | @(NSLayoutAttributeCenterX) : @"centerX",
44 | @(NSLayoutAttributeCenterY) : @"centerY",
45 | @(NSLayoutAttributeBaseline) : @"baseline",
46 |
47 | #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
48 | @(NSLayoutAttributeFirstBaseline) : @"firstBaseline",
49 | @(NSLayoutAttributeLastBaseline) : @"lastBaseline",
50 | #endif
51 |
52 | #if TARGET_OS_IPHONE || TARGET_OS_TV
53 | @(NSLayoutAttributeLeftMargin) : @"leftMargin",
54 | @(NSLayoutAttributeRightMargin) : @"rightMargin",
55 | @(NSLayoutAttributeTopMargin) : @"topMargin",
56 | @(NSLayoutAttributeBottomMargin) : @"bottomMargin",
57 | @(NSLayoutAttributeLeadingMargin) : @"leadingMargin",
58 | @(NSLayoutAttributeTrailingMargin) : @"trailingMargin",
59 | @(NSLayoutAttributeCenterXWithinMargins) : @"centerXWithinMargins",
60 | @(NSLayoutAttributeCenterYWithinMargins) : @"centerYWithinMargins",
61 | #endif
62 |
63 | };
64 |
65 | });
66 | return descriptionMap;
67 | }
68 |
69 |
70 | + (NSDictionary *)layoutPriorityDescriptionsByValue {
71 | static dispatch_once_t once;
72 | static NSDictionary *descriptionMap;
73 | dispatch_once(&once, ^{
74 | #if TARGET_OS_IPHONE || TARGET_OS_TV
75 | descriptionMap = @{
76 | @(MASLayoutPriorityDefaultHigh) : @"high",
77 | @(MASLayoutPriorityDefaultLow) : @"low",
78 | @(MASLayoutPriorityDefaultMedium) : @"medium",
79 | @(MASLayoutPriorityRequired) : @"required",
80 | @(MASLayoutPriorityFittingSizeLevel) : @"fitting size",
81 | };
82 | #elif TARGET_OS_MAC
83 | descriptionMap = @{
84 | @(MASLayoutPriorityDefaultHigh) : @"high",
85 | @(MASLayoutPriorityDragThatCanResizeWindow) : @"drag can resize window",
86 | @(MASLayoutPriorityDefaultMedium) : @"medium",
87 | @(MASLayoutPriorityWindowSizeStayPut) : @"window size stay put",
88 | @(MASLayoutPriorityDragThatCannotResizeWindow) : @"drag cannot resize window",
89 | @(MASLayoutPriorityDefaultLow) : @"low",
90 | @(MASLayoutPriorityFittingSizeCompression) : @"fitting size",
91 | @(MASLayoutPriorityRequired) : @"required",
92 | };
93 | #endif
94 | });
95 | return descriptionMap;
96 | }
97 |
98 | #pragma mark - description override
99 |
100 | + (NSString *)descriptionForObject:(id)obj {
101 | if ([obj respondsToSelector:@selector(mas_key)] && [obj mas_key]) {
102 | return [NSString stringWithFormat:@"%@:%@", [obj class], [obj mas_key]];
103 | }
104 | return [NSString stringWithFormat:@"%@:%p", [obj class], obj];
105 | }
106 |
107 | - (NSString *)description {
108 | NSMutableString *description = [[NSMutableString alloc] initWithString:@"<"];
109 |
110 | [description appendString:[self.class descriptionForObject:self]];
111 |
112 | [description appendFormat:@" %@", [self.class descriptionForObject:self.firstItem]];
113 | if (self.firstAttribute != NSLayoutAttributeNotAnAttribute) {
114 | [description appendFormat:@".%@", self.class.layoutAttributeDescriptionsByValue[@(self.firstAttribute)]];
115 | }
116 |
117 | [description appendFormat:@" %@", self.class.layoutRelationDescriptionsByValue[@(self.relation)]];
118 |
119 | if (self.secondItem) {
120 | [description appendFormat:@" %@", [self.class descriptionForObject:self.secondItem]];
121 | }
122 | if (self.secondAttribute != NSLayoutAttributeNotAnAttribute) {
123 | [description appendFormat:@".%@", self.class.layoutAttributeDescriptionsByValue[@(self.secondAttribute)]];
124 | }
125 |
126 | if (self.multiplier != 1) {
127 | [description appendFormat:@" * %g", self.multiplier];
128 | }
129 |
130 | if (self.secondAttribute == NSLayoutAttributeNotAnAttribute) {
131 | [description appendFormat:@" %g", self.constant];
132 | } else {
133 | if (self.constant) {
134 | [description appendFormat:@" %@ %g", (self.constant < 0 ? @"-" : @"+"), ABS(self.constant)];
135 | }
136 | }
137 |
138 | if (self.priority != MASLayoutPriorityRequired) {
139 | [description appendFormat:@" ^%@", self.class.layoutPriorityDescriptionsByValue[@(self.priority)] ?: [NSNumber numberWithDouble:self.priority]];
140 | }
141 |
142 | [description appendString:@">"];
143 | return description;
144 | }
145 |
146 | @end
147 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/MASUtilities.h:
--------------------------------------------------------------------------------
1 | //
2 | // MASUtilities.h
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 19/08/13.
6 | // Copyright (c) 2013 Jonas Budelmann. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 |
12 |
13 | #if TARGET_OS_IPHONE || TARGET_OS_TV
14 |
15 | #import
16 | #define MAS_VIEW UIView
17 | #define MAS_VIEW_CONTROLLER UIViewController
18 | #define MASEdgeInsets UIEdgeInsets
19 |
20 | typedef UILayoutPriority MASLayoutPriority;
21 | static const MASLayoutPriority MASLayoutPriorityRequired = UILayoutPriorityRequired;
22 | static const MASLayoutPriority MASLayoutPriorityDefaultHigh = UILayoutPriorityDefaultHigh;
23 | static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 500;
24 | static const MASLayoutPriority MASLayoutPriorityDefaultLow = UILayoutPriorityDefaultLow;
25 | static const MASLayoutPriority MASLayoutPriorityFittingSizeLevel = UILayoutPriorityFittingSizeLevel;
26 |
27 | #elif TARGET_OS_MAC
28 |
29 | #import
30 | #define MAS_VIEW NSView
31 | #define MASEdgeInsets NSEdgeInsets
32 |
33 | typedef NSLayoutPriority MASLayoutPriority;
34 | static const MASLayoutPriority MASLayoutPriorityRequired = NSLayoutPriorityRequired;
35 | static const MASLayoutPriority MASLayoutPriorityDefaultHigh = NSLayoutPriorityDefaultHigh;
36 | static const MASLayoutPriority MASLayoutPriorityDragThatCanResizeWindow = NSLayoutPriorityDragThatCanResizeWindow;
37 | static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 501;
38 | static const MASLayoutPriority MASLayoutPriorityWindowSizeStayPut = NSLayoutPriorityWindowSizeStayPut;
39 | static const MASLayoutPriority MASLayoutPriorityDragThatCannotResizeWindow = NSLayoutPriorityDragThatCannotResizeWindow;
40 | static const MASLayoutPriority MASLayoutPriorityDefaultLow = NSLayoutPriorityDefaultLow;
41 | static const MASLayoutPriority MASLayoutPriorityFittingSizeCompression = NSLayoutPriorityFittingSizeCompression;
42 |
43 | #endif
44 |
45 | /**
46 | * Allows you to attach keys to objects matching the variable names passed.
47 | *
48 | * view1.mas_key = @"view1", view2.mas_key = @"view2";
49 | *
50 | * is equivalent to:
51 | *
52 | * MASAttachKeys(view1, view2);
53 | */
54 | #define MASAttachKeys(...) \
55 | { \
56 | NSDictionary *keyPairs = NSDictionaryOfVariableBindings(__VA_ARGS__); \
57 | for (id key in keyPairs.allKeys) { \
58 | id obj = keyPairs[key]; \
59 | NSAssert([obj respondsToSelector:@selector(setMas_key:)], \
60 | @"Cannot attach mas_key to %@", obj); \
61 | [obj setMas_key:key]; \
62 | } \
63 | }
64 |
65 | /**
66 | * Used to create object hashes
67 | * Based on http://www.mikeash.com/pyblog/friday-qa-2010-06-18-implementing-equality-and-hashing.html
68 | */
69 | #define MAS_NSUINT_BIT (CHAR_BIT * sizeof(NSUInteger))
70 | #define MAS_NSUINTROTATE(val, howmuch) ((((NSUInteger)val) << howmuch) | (((NSUInteger)val) >> (MAS_NSUINT_BIT - howmuch)))
71 |
72 | /**
73 | * Given a scalar or struct value, wraps it in NSValue
74 | * Based on EXPObjectify: https://github.com/specta/expecta
75 | */
76 | static inline id _MASBoxValue(const char *type, ...) {
77 | va_list v;
78 | va_start(v, type);
79 | id obj = nil;
80 | if (strcmp(type, @encode(id)) == 0) {
81 | id actual = va_arg(v, id);
82 | obj = actual;
83 | } else if (strcmp(type, @encode(CGPoint)) == 0) {
84 | CGPoint actual = (CGPoint)va_arg(v, CGPoint);
85 | obj = [NSValue value:&actual withObjCType:type];
86 | } else if (strcmp(type, @encode(CGSize)) == 0) {
87 | CGSize actual = (CGSize)va_arg(v, CGSize);
88 | obj = [NSValue value:&actual withObjCType:type];
89 | } else if (strcmp(type, @encode(MASEdgeInsets)) == 0) {
90 | MASEdgeInsets actual = (MASEdgeInsets)va_arg(v, MASEdgeInsets);
91 | obj = [NSValue value:&actual withObjCType:type];
92 | } else if (strcmp(type, @encode(double)) == 0) {
93 | double actual = (double)va_arg(v, double);
94 | obj = [NSNumber numberWithDouble:actual];
95 | } else if (strcmp(type, @encode(float)) == 0) {
96 | float actual = (float)va_arg(v, double);
97 | obj = [NSNumber numberWithFloat:actual];
98 | } else if (strcmp(type, @encode(int)) == 0) {
99 | int actual = (int)va_arg(v, int);
100 | obj = [NSNumber numberWithInt:actual];
101 | } else if (strcmp(type, @encode(long)) == 0) {
102 | long actual = (long)va_arg(v, long);
103 | obj = [NSNumber numberWithLong:actual];
104 | } else if (strcmp(type, @encode(long long)) == 0) {
105 | long long actual = (long long)va_arg(v, long long);
106 | obj = [NSNumber numberWithLongLong:actual];
107 | } else if (strcmp(type, @encode(short)) == 0) {
108 | short actual = (short)va_arg(v, int);
109 | obj = [NSNumber numberWithShort:actual];
110 | } else if (strcmp(type, @encode(char)) == 0) {
111 | char actual = (char)va_arg(v, int);
112 | obj = [NSNumber numberWithChar:actual];
113 | } else if (strcmp(type, @encode(bool)) == 0) {
114 | bool actual = (bool)va_arg(v, int);
115 | obj = [NSNumber numberWithBool:actual];
116 | } else if (strcmp(type, @encode(unsigned char)) == 0) {
117 | unsigned char actual = (unsigned char)va_arg(v, unsigned int);
118 | obj = [NSNumber numberWithUnsignedChar:actual];
119 | } else if (strcmp(type, @encode(unsigned int)) == 0) {
120 | unsigned int actual = (unsigned int)va_arg(v, unsigned int);
121 | obj = [NSNumber numberWithUnsignedInt:actual];
122 | } else if (strcmp(type, @encode(unsigned long)) == 0) {
123 | unsigned long actual = (unsigned long)va_arg(v, unsigned long);
124 | obj = [NSNumber numberWithUnsignedLong:actual];
125 | } else if (strcmp(type, @encode(unsigned long long)) == 0) {
126 | unsigned long long actual = (unsigned long long)va_arg(v, unsigned long long);
127 | obj = [NSNumber numberWithUnsignedLongLong:actual];
128 | } else if (strcmp(type, @encode(unsigned short)) == 0) {
129 | unsigned short actual = (unsigned short)va_arg(v, unsigned int);
130 | obj = [NSNumber numberWithUnsignedShort:actual];
131 | }
132 | va_end(v);
133 | return obj;
134 | }
135 |
136 | #define MASBoxValue(value) _MASBoxValue(@encode(__typeof__((value))), (value))
137 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/NSArray+MASAdditions.m:
--------------------------------------------------------------------------------
1 | //
2 | // NSArray+MASAdditions.m
3 | //
4 | //
5 | // Created by Daniel Hammond on 11/26/13.
6 | //
7 | //
8 |
9 | #import "NSArray+MASAdditions.h"
10 | #import "View+MASAdditions.h"
11 |
12 | @implementation NSArray (MASAdditions)
13 |
14 | - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block {
15 | NSMutableArray *constraints = [NSMutableArray array];
16 | for (MAS_VIEW *view in self) {
17 | NSAssert([view isKindOfClass:[MAS_VIEW class]], @"All objects in the array must be views");
18 | [constraints addObjectsFromArray:[view mas_makeConstraints:block]];
19 | }
20 | return constraints;
21 | }
22 |
23 | - (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block {
24 | NSMutableArray *constraints = [NSMutableArray array];
25 | for (MAS_VIEW *view in self) {
26 | NSAssert([view isKindOfClass:[MAS_VIEW class]], @"All objects in the array must be views");
27 | [constraints addObjectsFromArray:[view mas_updateConstraints:block]];
28 | }
29 | return constraints;
30 | }
31 |
32 | - (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block {
33 | NSMutableArray *constraints = [NSMutableArray array];
34 | for (MAS_VIEW *view in self) {
35 | NSAssert([view isKindOfClass:[MAS_VIEW class]], @"All objects in the array must be views");
36 | [constraints addObjectsFromArray:[view mas_remakeConstraints:block]];
37 | }
38 | return constraints;
39 | }
40 |
41 | - (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType withFixedSpacing:(CGFloat)fixedSpacing leadSpacing:(CGFloat)leadSpacing tailSpacing:(CGFloat)tailSpacing {
42 | if (self.count < 2) {
43 | NSAssert(self.count>1,@"views to distribute need to bigger than one");
44 | return;
45 | }
46 |
47 | MAS_VIEW *tempSuperView = [self mas_commonSuperviewOfViews];
48 | if (axisType == MASAxisTypeHorizontal) {
49 | MAS_VIEW *prev;
50 | for (int i = 0; i < self.count; i++) {
51 | MAS_VIEW *v = self[i];
52 | [v mas_makeConstraints:^(MASConstraintMaker *make) {
53 | if (prev) {
54 | make.width.equalTo(prev);
55 | make.left.equalTo(prev.mas_right).offset(fixedSpacing);
56 | if (i == self.count - 1) {//last one
57 | make.right.equalTo(tempSuperView).offset(-tailSpacing);
58 | }
59 | }
60 | else {//first one
61 | make.left.equalTo(tempSuperView).offset(leadSpacing);
62 | }
63 |
64 | }];
65 | prev = v;
66 | }
67 | }
68 | else {
69 | MAS_VIEW *prev;
70 | for (int i = 0; i < self.count; i++) {
71 | MAS_VIEW *v = self[i];
72 | [v mas_makeConstraints:^(MASConstraintMaker *make) {
73 | if (prev) {
74 | make.height.equalTo(prev);
75 | make.top.equalTo(prev.mas_bottom).offset(fixedSpacing);
76 | if (i == self.count - 1) {//last one
77 | make.bottom.equalTo(tempSuperView).offset(-tailSpacing);
78 | }
79 | }
80 | else {//first one
81 | make.top.equalTo(tempSuperView).offset(leadSpacing);
82 | }
83 |
84 | }];
85 | prev = v;
86 | }
87 | }
88 | }
89 |
90 | - (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType withFixedItemLength:(CGFloat)fixedItemLength leadSpacing:(CGFloat)leadSpacing tailSpacing:(CGFloat)tailSpacing {
91 | if (self.count < 2) {
92 | NSAssert(self.count>1,@"views to distribute need to bigger than one");
93 | return;
94 | }
95 |
96 | MAS_VIEW *tempSuperView = [self mas_commonSuperviewOfViews];
97 | if (axisType == MASAxisTypeHorizontal) {
98 | MAS_VIEW *prev;
99 | for (int i = 0; i < self.count; i++) {
100 | MAS_VIEW *v = self[i];
101 | [v mas_makeConstraints:^(MASConstraintMaker *make) {
102 | make.width.equalTo(@(fixedItemLength));
103 | if (prev) {
104 | if (i == self.count - 1) {//last one
105 | make.right.equalTo(tempSuperView).offset(-tailSpacing);
106 | }
107 | else {
108 | CGFloat offset = (1-(i/((CGFloat)self.count-1)))*(fixedItemLength+leadSpacing)-i*tailSpacing/(((CGFloat)self.count-1));
109 | make.right.equalTo(tempSuperView).multipliedBy(i/((CGFloat)self.count-1)).with.offset(offset);
110 | }
111 | }
112 | else {//first one
113 | make.left.equalTo(tempSuperView).offset(leadSpacing);
114 | }
115 | }];
116 | prev = v;
117 | }
118 | }
119 | else {
120 | MAS_VIEW *prev;
121 | for (int i = 0; i < self.count; i++) {
122 | MAS_VIEW *v = self[i];
123 | [v mas_makeConstraints:^(MASConstraintMaker *make) {
124 | make.height.equalTo(@(fixedItemLength));
125 | if (prev) {
126 | if (i == self.count - 1) {//last one
127 | make.bottom.equalTo(tempSuperView).offset(-tailSpacing);
128 | }
129 | else {
130 | CGFloat offset = (1-(i/((CGFloat)self.count-1)))*(fixedItemLength+leadSpacing)-i*tailSpacing/(((CGFloat)self.count-1));
131 | make.bottom.equalTo(tempSuperView).multipliedBy(i/((CGFloat)self.count-1)).with.offset(offset);
132 | }
133 | }
134 | else {//first one
135 | make.top.equalTo(tempSuperView).offset(leadSpacing);
136 | }
137 | }];
138 | prev = v;
139 | }
140 | }
141 | }
142 |
143 | - (MAS_VIEW *)mas_commonSuperviewOfViews
144 | {
145 | MAS_VIEW *commonSuperview = nil;
146 | MAS_VIEW *previousView = nil;
147 | for (id object in self) {
148 | if ([object isKindOfClass:[MAS_VIEW class]]) {
149 | MAS_VIEW *view = (MAS_VIEW *)object;
150 | if (previousView) {
151 | commonSuperview = [view mas_closestCommonSuperview:commonSuperview];
152 | } else {
153 | commonSuperview = view;
154 | }
155 | previousView = view;
156 | }
157 | }
158 | NSAssert(commonSuperview, @"Can't constrain views that do not share a common superview. Make sure that all the views in this array have been added into the same view hierarchy.");
159 | return commonSuperview;
160 | }
161 |
162 | @end
163 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/WCSTimelineCell.m:
--------------------------------------------------------------------------------
1 | //
2 | // WCSTimelineCell.m
3 | // WCSTimeline
4 | //
5 | // Created by Aaron Wright on 3/15/17.
6 | // Copyright © 2017 Wrights Creative Services, L.L.C. All rights reserved.
7 | //
8 |
9 | #import "WCSTimelineCell.h"
10 | #import "NSDate+TimeAgo.h"
11 | #import "Masonry.h"
12 |
13 | @interface WCSTimelineCell ()
14 | @property(nonatomic, strong) UIImageView * pointView;
15 | @property(nonatomic, strong) UIImageView * lineView;
16 | @property(nonatomic, strong) UILabel * timeLabel;
17 | @property(nonatomic, strong) UILabel * eventLabel;
18 | @property(nonatomic, strong) WCSLabel * contentLabel;
19 | @property(nonatomic, strong) UIImageView * checkImage;
20 | @end
21 |
22 | @implementation WCSTimelineCell
23 |
24 | - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
25 | {
26 | self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
27 | if ( self )
28 | {
29 | self.lineView = [[UIImageView alloc] init];
30 | self.lineView.image = [UIImage imageNamed:@"line"];
31 | self.lineView.frame = CGRectMake(20, 20, 13, 13);
32 | [self.contentView addSubview:_lineView];
33 |
34 | self.pointView = [[UIImageView alloc] init];
35 | self.pointView.image = [UIImage imageNamed:@"point"];
36 | [self.contentView addSubview:_pointView];
37 |
38 | self.timeLabel = [[UILabel alloc] init];
39 | self.timeLabel.text = @"12:34 PM";
40 | self.timeLabel.font = [UIFont boldSystemFontOfSize:10.f];
41 | self.timeLabel.textAlignment = NSTextAlignmentCenter;
42 | self.timeLabel.numberOfLines = 0;
43 | [self.contentView addSubview:self.timeLabel];
44 |
45 | self.eventLabel = [[UILabel alloc] init];
46 | self.eventLabel.text = @"Event";
47 | self.eventLabel.font = [UIFont boldSystemFontOfSize:10.f];
48 | self.eventLabel.textAlignment = NSTextAlignmentLeft;
49 | [self.contentView addSubview:self.eventLabel];
50 |
51 | self.contentLabel = [[WCSLabel alloc] init];
52 | self.contentLabel.text = @"Content";
53 | self.contentLabel.font = [UIFont systemFontOfSize:10.f];
54 | self.contentLabel.textAlignment = NSTextAlignmentLeft;
55 | self.contentLabel.numberOfLines = 0;
56 | [self.contentView addSubview:self.contentLabel];
57 |
58 | self.checkImage = [[UIImageView alloc] init];
59 | self.checkImage.image = nil;
60 | [self.contentView addSubview:self.checkImage];
61 |
62 | [self layoutTimeline];
63 |
64 | return self;
65 | }
66 | return nil;
67 | }
68 |
69 | - (void)awakeFromNib {
70 | [super awakeFromNib];
71 | // Initialization code
72 | }
73 |
74 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
75 | [super setSelected:selected animated:animated];
76 | // Configure the view for the selected state
77 | }
78 |
79 | - (void)layoutTimeline
80 | {
81 | [self.pointView mas_makeConstraints:^(MASConstraintMaker *make) {
82 | make.top.equalTo(@10);
83 | make.left.equalTo(self.contentView).offset(60);
84 | make.width.height.equalTo(@14);
85 | }];
86 |
87 | [self.lineView mas_makeConstraints:^(MASConstraintMaker *make) {
88 | make.centerX.equalTo(self.pointView);
89 | make.width.equalTo(@1);
90 | make.top.equalTo(self.contentView.mas_top);
91 | make.bottom.equalTo(self.contentView.mas_bottom);
92 | }];
93 |
94 | [self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
95 | make.width.equalTo(@50);
96 | make.left.equalTo(@10);
97 | make.centerY.equalTo(self.pointView);
98 | }];
99 |
100 | [self.eventLabel mas_makeConstraints:^(MASConstraintMaker *make) {
101 | make.left.equalTo(self.pointView).offset(15);
102 | make.centerY.equalTo(self.pointView);
103 | make.width.equalTo(self.contentView).offset(-120);
104 | }];
105 |
106 | [self.contentLabel mas_makeConstraints:^(MASConstraintMaker *make) {
107 | make.left.equalTo(self.eventLabel);
108 | make.top.equalTo(self.eventLabel).offset(20);
109 | make.width.equalTo(self.eventLabel);
110 | }];
111 |
112 | [self.checkImage mas_makeConstraints:^(MASConstraintMaker *make) {
113 | make.right.equalTo(@(self.contentView.frame.size.width)).offset(-10);
114 | make.centerY.equalTo(self.contentView);
115 | make.width.height.equalTo(@20);
116 | }];
117 | }
118 |
119 | - (void)setModel:(WCSTimelineModel *)model
120 | {
121 | //NSLog(@"Date: %@ Time Ago: %@", model.time, [model.time formattedAsTimeAgo]);
122 | self.timeLabel.text = [model.time formattedAsTimeAgo];
123 |
124 | if ( model.icon )
125 | {
126 | self.eventLabel.attributedText = [self title:model.event withIcon:model.icon];
127 | }
128 | else
129 | {
130 | self.eventLabel.text = model.event;
131 | }
132 |
133 | self.contentLabel.text = model.content;
134 | self.lineView.hidden = model.isLast ? false : false; // don't hide the line, but maybe do soemthing better n the future.
135 |
136 | [self.contentLabel sizeToFit];
137 | [self.contentLabel mas_makeConstraints:^(MASConstraintMaker *make) {
138 | make.height.equalTo(@(model.cellHeight-self.eventLabel.frame.size.height-25));
139 | }];
140 |
141 | switch ( model.state ) {
142 | default:
143 | case WCSStateUnknown: {
144 | self.checkImage.image = nil;
145 | break;
146 | }
147 | case WCSStateInactive: {
148 | self.checkImage.image = [UIImage imageNamed:@"checkmark-off"];
149 | break;
150 | }
151 | case WCSStateActive: {
152 | self.checkImage.image = [UIImage imageNamed:@"checkmark-on"];
153 | break;
154 | }
155 | }
156 | }
157 |
158 | - (NSAttributedString*)title:(NSString*)title withIcon:(UIImage*)icon
159 | {
160 | NSMutableAttributedString * attributedDetails =
161 | [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@" %@", title] attributes:nil];
162 |
163 | CGRect _attachmentFrame = CGRectMake(0, -5, 20, 20);
164 |
165 | NSTextAttachment * attachment = [[NSTextAttachment alloc] init];
166 | attachment.image = icon;
167 | attachment.bounds = _attachmentFrame;
168 |
169 | NSAttributedString *attachmentString = [NSAttributedString attributedStringWithAttachment:attachment];
170 | NSMutableAttributedString * attributed = [[NSMutableAttributedString alloc] initWithAttributedString:attachmentString];
171 | [attributed appendAttributedString:attributedDetails];
172 | [attributed addAttribute:NSFontAttributeName value:self.eventLabel.font range:[attributed.string rangeOfString:title]];
173 |
174 | return attributed;
175 | }
176 |
177 | @end
178 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/MASConstraint.h:
--------------------------------------------------------------------------------
1 | //
2 | // MASConstraint.h
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 22/07/13.
6 | // Copyright (c) 2013 cloudling. All rights reserved.
7 | //
8 |
9 | #import "MASUtilities.h"
10 |
11 | /**
12 | * Enables Constraints to be created with chainable syntax
13 | * Constraint can represent single NSLayoutConstraint (MASViewConstraint)
14 | * or a group of NSLayoutConstraints (MASComposisteConstraint)
15 | */
16 | @interface MASConstraint : NSObject
17 |
18 | // Chaining Support
19 |
20 | /**
21 | * Modifies the NSLayoutConstraint constant,
22 | * only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following
23 | * NSLayoutAttributeTop, NSLayoutAttributeLeft, NSLayoutAttributeBottom, NSLayoutAttributeRight
24 | */
25 | - (MASConstraint * (^)(MASEdgeInsets insets))insets;
26 |
27 | /**
28 | * Modifies the NSLayoutConstraint constant,
29 | * only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following
30 | * NSLayoutAttributeWidth, NSLayoutAttributeHeight
31 | */
32 | - (MASConstraint * (^)(CGSize offset))sizeOffset;
33 |
34 | /**
35 | * Modifies the NSLayoutConstraint constant,
36 | * only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following
37 | * NSLayoutAttributeCenterX, NSLayoutAttributeCenterY
38 | */
39 | - (MASConstraint * (^)(CGPoint offset))centerOffset;
40 |
41 | /**
42 | * Modifies the NSLayoutConstraint constant
43 | */
44 | - (MASConstraint * (^)(CGFloat offset))offset;
45 |
46 | /**
47 | * Modifies the NSLayoutConstraint constant based on a value type
48 | */
49 | - (MASConstraint * (^)(NSValue *value))valueOffset;
50 |
51 | /**
52 | * Sets the NSLayoutConstraint multiplier property
53 | */
54 | - (MASConstraint * (^)(CGFloat multiplier))multipliedBy;
55 |
56 | /**
57 | * Sets the NSLayoutConstraint multiplier to 1.0/dividedBy
58 | */
59 | - (MASConstraint * (^)(CGFloat divider))dividedBy;
60 |
61 | /**
62 | * Sets the NSLayoutConstraint priority to a float or MASLayoutPriority
63 | */
64 | - (MASConstraint * (^)(MASLayoutPriority priority))priority;
65 |
66 | /**
67 | * Sets the NSLayoutConstraint priority to MASLayoutPriorityLow
68 | */
69 | - (MASConstraint * (^)())priorityLow;
70 |
71 | /**
72 | * Sets the NSLayoutConstraint priority to MASLayoutPriorityMedium
73 | */
74 | - (MASConstraint * (^)())priorityMedium;
75 |
76 | /**
77 | * Sets the NSLayoutConstraint priority to MASLayoutPriorityHigh
78 | */
79 | - (MASConstraint * (^)())priorityHigh;
80 |
81 | /**
82 | * Sets the constraint relation to NSLayoutRelationEqual
83 | * returns a block which accepts one of the following:
84 | * MASViewAttribute, UIView, NSValue, NSArray
85 | * see readme for more details.
86 | */
87 | - (MASConstraint * (^)(id attr))equalTo;
88 |
89 | /**
90 | * Sets the constraint relation to NSLayoutRelationGreaterThanOrEqual
91 | * returns a block which accepts one of the following:
92 | * MASViewAttribute, UIView, NSValue, NSArray
93 | * see readme for more details.
94 | */
95 | - (MASConstraint * (^)(id attr))greaterThanOrEqualTo;
96 |
97 | /**
98 | * Sets the constraint relation to NSLayoutRelationLessThanOrEqual
99 | * returns a block which accepts one of the following:
100 | * MASViewAttribute, UIView, NSValue, NSArray
101 | * see readme for more details.
102 | */
103 | - (MASConstraint * (^)(id attr))lessThanOrEqualTo;
104 |
105 | /**
106 | * Optional semantic property which has no effect but improves the readability of constraint
107 | */
108 | - (MASConstraint *)with;
109 |
110 | /**
111 | * Optional semantic property which has no effect but improves the readability of constraint
112 | */
113 | - (MASConstraint *)and;
114 |
115 | /**
116 | * Creates a new MASCompositeConstraint with the called attribute and reciever
117 | */
118 | - (MASConstraint *)left;
119 | - (MASConstraint *)top;
120 | - (MASConstraint *)right;
121 | - (MASConstraint *)bottom;
122 | - (MASConstraint *)leading;
123 | - (MASConstraint *)trailing;
124 | - (MASConstraint *)width;
125 | - (MASConstraint *)height;
126 | - (MASConstraint *)centerX;
127 | - (MASConstraint *)centerY;
128 | - (MASConstraint *)baseline;
129 |
130 | #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
131 |
132 | - (MASConstraint *)firstBaseline;
133 | - (MASConstraint *)lastBaseline;
134 |
135 | #endif
136 |
137 | #if TARGET_OS_IPHONE || TARGET_OS_TV
138 |
139 | - (MASConstraint *)leftMargin;
140 | - (MASConstraint *)rightMargin;
141 | - (MASConstraint *)topMargin;
142 | - (MASConstraint *)bottomMargin;
143 | - (MASConstraint *)leadingMargin;
144 | - (MASConstraint *)trailingMargin;
145 | - (MASConstraint *)centerXWithinMargins;
146 | - (MASConstraint *)centerYWithinMargins;
147 |
148 | #endif
149 |
150 |
151 | /**
152 | * Sets the constraint debug name
153 | */
154 | - (MASConstraint * (^)(id key))key;
155 |
156 | // NSLayoutConstraint constant Setters
157 | // for use outside of mas_updateConstraints/mas_makeConstraints blocks
158 |
159 | /**
160 | * Modifies the NSLayoutConstraint constant,
161 | * only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following
162 | * NSLayoutAttributeTop, NSLayoutAttributeLeft, NSLayoutAttributeBottom, NSLayoutAttributeRight
163 | */
164 | - (void)setInsets:(MASEdgeInsets)insets;
165 |
166 | /**
167 | * Modifies the NSLayoutConstraint constant,
168 | * only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following
169 | * NSLayoutAttributeWidth, NSLayoutAttributeHeight
170 | */
171 | - (void)setSizeOffset:(CGSize)sizeOffset;
172 |
173 | /**
174 | * Modifies the NSLayoutConstraint constant,
175 | * only affects MASConstraints in which the first item's NSLayoutAttribute is one of the following
176 | * NSLayoutAttributeCenterX, NSLayoutAttributeCenterY
177 | */
178 | - (void)setCenterOffset:(CGPoint)centerOffset;
179 |
180 | /**
181 | * Modifies the NSLayoutConstraint constant
182 | */
183 | - (void)setOffset:(CGFloat)offset;
184 |
185 |
186 | // NSLayoutConstraint Installation support
187 |
188 | #if TARGET_OS_MAC && !(TARGET_OS_IPHONE || TARGET_OS_TV)
189 | /**
190 | * Whether or not to go through the animator proxy when modifying the constraint
191 | */
192 | @property (nonatomic, copy, readonly) MASConstraint *animator;
193 | #endif
194 |
195 | /**
196 | * Activates an NSLayoutConstraint if it's supported by an OS.
197 | * Invokes install otherwise.
198 | */
199 | - (void)activate;
200 |
201 | /**
202 | * Deactivates previously installed/activated NSLayoutConstraint.
203 | */
204 | - (void)deactivate;
205 |
206 | /**
207 | * Creates a NSLayoutConstraint and adds it to the appropriate view.
208 | */
209 | - (void)install;
210 |
211 | /**
212 | * Removes previously installed NSLayoutConstraint
213 | */
214 | - (void)uninstall;
215 |
216 | @end
217 |
218 |
219 | /**
220 | * Convenience auto-boxing macros for MASConstraint methods.
221 | *
222 | * Defining MAS_SHORTHAND_GLOBALS will turn on auto-boxing for default syntax.
223 | * A potential drawback of this is that the unprefixed macros will appear in global scope.
224 | */
225 | #define mas_equalTo(...) equalTo(MASBoxValue((__VA_ARGS__)))
226 | #define mas_greaterThanOrEqualTo(...) greaterThanOrEqualTo(MASBoxValue((__VA_ARGS__)))
227 | #define mas_lessThanOrEqualTo(...) lessThanOrEqualTo(MASBoxValue((__VA_ARGS__)))
228 |
229 | #define mas_offset(...) valueOffset(MASBoxValue((__VA_ARGS__)))
230 |
231 |
232 | #ifdef MAS_SHORTHAND_GLOBALS
233 |
234 | #define equalTo(...) mas_equalTo(__VA_ARGS__)
235 | #define greaterThanOrEqualTo(...) mas_greaterThanOrEqualTo(__VA_ARGS__)
236 | #define lessThanOrEqualTo(...) mas_lessThanOrEqualTo(__VA_ARGS__)
237 |
238 | #define offset(...) mas_offset(__VA_ARGS__)
239 |
240 | #endif
241 |
242 |
243 | @interface MASConstraint (AutoboxingSupport)
244 |
245 | /**
246 | * Aliases to corresponding relation methods (for shorthand macros)
247 | * Also needed to aid autocompletion
248 | */
249 | - (MASConstraint * (^)(id attr))mas_equalTo;
250 | - (MASConstraint * (^)(id attr))mas_greaterThanOrEqualTo;
251 | - (MASConstraint * (^)(id attr))mas_lessThanOrEqualTo;
252 |
253 | /**
254 | * A dummy method to aid autocompletion
255 | */
256 | - (MASConstraint * (^)(id offset))mas_offset;
257 |
258 | @end
259 |
--------------------------------------------------------------------------------
/Example/ViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.m
3 | // WCSTimeline
4 | //
5 | // Created by Aaron Wright on 3/15/17.
6 | // Copyright © 2017 Wrights Creative Services, L.L.C. All rights reserved.
7 | //
8 |
9 | #import "ViewController.h"
10 | #import "WCSTimelineCell.h"
11 |
12 | @interface ViewController ()
13 | @property (nonatomic, strong) UIRefreshControl * refreshControl;
14 | @property (nonatomic, weak) IBOutlet UITableView * tableView;
15 | @property (nonatomic, strong) NSMutableArray * timelineData;
16 | @end
17 |
18 | @implementation ViewController
19 |
20 | - (void)viewDidLoad {
21 | [super viewDidLoad];
22 | // Do any additional setup after loading the view, typically from a nib.
23 | }
24 |
25 | - (void)viewWillAppear:(BOOL)animated {
26 | [super viewWillAppear:animated];
27 | [self buildInterface];
28 | }
29 |
30 | - (void)didReceiveMemoryWarning {
31 | [super didReceiveMemoryWarning];
32 | // Dispose of any resources that can be recreated.
33 | }
34 |
35 | #pragma mark - Private Methods
36 |
37 | - (void)buildInterface
38 | {
39 | self.title = NSLocalizedString(@"WCSTimeline", nil);
40 | self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
41 |
42 | self.refreshControl = [[UIRefreshControl alloc] init];
43 | self.tableView.refreshControl = self.refreshControl;
44 | [self.refreshControl addTarget:self action:@selector(reloadTimeline) forControlEvents:UIControlEventValueChanged];
45 |
46 | [self reloadTimeline];
47 | }
48 |
49 | - (void)reloadTimeline
50 | {
51 | self.timelineData = nil;
52 | self.timelineData = [NSMutableArray new];
53 |
54 | for ( NSInteger i = 0; i < 10; i++ )
55 | {
56 | WCSTimelineModel * model = [WCSTimelineModel new];
57 | model.icon = [UIImage imageNamed:@"event"];
58 | model.time = [self randomDate];
59 | model.event = [NSString stringWithFormat:@"Event %li", (long)i];
60 | model.state = arc4random_uniform(3);
61 | model.content = [self randomString:i];
62 | [self.timelineData addObject:model];
63 | }
64 |
65 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
66 | [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"kLastRefresh"];
67 | self.refreshControl.attributedTitle = [self attributedRefreshTitle];
68 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
69 | [self.refreshControl endRefreshing];
70 | [self.tableView reloadData];
71 | });
72 | });
73 | }
74 |
75 | - (NSString*)randomString:(NSInteger)index {
76 | NSString * randomString = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry.";
77 | switch ( index ) {
78 | case 0: {
79 | break;
80 | }
81 | default:
82 | case 1: {
83 | randomString = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry.";
84 | break;
85 | }
86 | case 2: {
87 | randomString = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry.";
88 | break;
89 | }
90 | case 3: {
91 | randomString = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry.";
92 | break;
93 | }
94 | case 4: {
95 | randomString = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry.";
96 | break;
97 | }
98 | }
99 | return randomString;
100 | }
101 |
102 | #pragma mark - UITableView Delegates
103 |
104 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
105 | return self.timelineData.count;
106 | }
107 |
108 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
109 | WCSTimelineModel * model = self.timelineData[indexPath.row];
110 | return model.cellHeight;
111 | }
112 |
113 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
114 | {
115 | static NSString * identifier = @"WCSTimelineCell";
116 | WCSTimelineCell * timelineCell = timelineCell = [[WCSTimelineCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
117 | timelineCell.selectionStyle = UITableViewCellSelectionStyleNone;
118 | timelineCell.backgroundColor = ( indexPath.row % 2 == 0 ? [self hex:@"f2f1f1" alpha:1.f] : [self hex:@"ffffff" alpha:1.f] );
119 |
120 | WCSTimelineModel * model = self.timelineData[indexPath.row];
121 | if (indexPath.row == self.timelineData.count - 1 ) {
122 | model.isLast = true;
123 | }
124 | timelineCell.model = model;
125 |
126 | return timelineCell;
127 | }
128 |
129 | #pragma mark - Utilities
130 |
131 | - (NSDate*)randomDate
132 | {
133 | unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
134 | NSDate *now = [NSDate date];
135 | NSCalendar *gregorian = [NSCalendar currentCalendar];
136 | NSDateComponents *comps = [gregorian components:unitFlags fromDate:now];
137 | [comps setYear:[comps year] - 1];
138 |
139 | NSDate * startDate = [gregorian dateFromComponents:comps];
140 | NSDate * endDate = [NSDate date];
141 |
142 | NSTimeInterval timeBetweenDates = [endDate timeIntervalSinceDate:startDate];
143 | NSTimeInterval randomInterval = ((NSTimeInterval)arc4random() / ARC4RANDOM_MAX) * timeBetweenDates;
144 |
145 | return [startDate dateByAddingTimeInterval:randomInterval];
146 | }
147 |
148 | - (NSString*)friendlyDate
149 | {
150 | NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
151 | formatter.dateFormat = @"YYYY-MM-dd\'T\'HH:mm:ssZZZZZ";
152 | formatter.dateStyle = NSDateFormatterMediumStyle;
153 | formatter.timeStyle = NSDateFormatterMediumStyle;
154 |
155 | NSDate * date = [[NSUserDefaults standardUserDefaults] objectForKey:@"kLastRefresh"];
156 |
157 | return [formatter stringFromDate:date];
158 | }
159 |
160 | - (NSAttributedString*)attributedRefreshTitle
161 | {
162 | NSString * string1 = @"Last Updated:";
163 | NSString * string2 = [self friendlyDate];
164 |
165 | NSMutableAttributedString * attributedDetails =
166 | [[NSMutableAttributedString alloc]
167 | initWithString:[NSString stringWithFormat:@"%@ %@", string1, string2] attributes:nil];
168 |
169 | NSMutableAttributedString * attributed = [[NSMutableAttributedString alloc] initWithAttributedString:attributedDetails];
170 | [attributed addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:10.f] range:[attributed.string rangeOfString:string1]];
171 | [attributed addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:10.f] range:[attributed.string rangeOfString:string2]];
172 |
173 | return attributed;
174 | }
175 |
176 | - (UIColor*)hex:(NSString*)hex alpha:(float)alpha
177 | {
178 | NSString *cString = [[hex stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];
179 |
180 | if ([cString length] < 6) return [UIColor grayColor];
181 | if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2];
182 | if ([cString length] != 6) return [UIColor grayColor];
183 |
184 | NSRange range;
185 | range.location = 0;
186 | range.length = 2;
187 | NSString *rString = [cString substringWithRange:range];
188 | range.location = 2;
189 | NSString *gString = [cString substringWithRange:range];
190 | range.location = 4;
191 | NSString *bString = [cString substringWithRange:range];
192 |
193 | unsigned int r, g, b;
194 | [[NSScanner scannerWithString:rString] scanHexInt:&r];
195 | [[NSScanner scannerWithString:gString] scanHexInt:&g];
196 | [[NSScanner scannerWithString:bString] scanHexInt:&b];
197 |
198 | return [UIColor colorWithRed:((float) r / 255.0f) green:((float) g / 255.0f) blue:((float) b / 255.0f) alpha:alpha];
199 | }
200 |
201 | @end
202 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/MASConstraint.m:
--------------------------------------------------------------------------------
1 | //
2 | // MASConstraint.m
3 | // Masonry
4 | //
5 | // Created by Nick Tymchenko on 1/20/14.
6 | //
7 |
8 | #import "MASConstraint.h"
9 | #import "MASConstraint+Private.h"
10 |
11 | #define MASMethodNotImplemented() \
12 | @throw [NSException exceptionWithName:NSInternalInconsistencyException \
13 | reason:[NSString stringWithFormat:@"You must override %@ in a subclass.", NSStringFromSelector(_cmd)] \
14 | userInfo:nil]
15 |
16 | @implementation MASConstraint
17 |
18 | #pragma mark - Init
19 |
20 | - (id)init {
21 | NSAssert(![self isMemberOfClass:[MASConstraint class]], @"MASConstraint is an abstract class, you should not instantiate it directly.");
22 | return [super init];
23 | }
24 |
25 | #pragma mark - NSLayoutRelation proxies
26 |
27 | - (MASConstraint * (^)(id))equalTo {
28 | return ^id(id attribute) {
29 | return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
30 | };
31 | }
32 |
33 | - (MASConstraint * (^)(id))mas_equalTo {
34 | return ^id(id attribute) {
35 | return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
36 | };
37 | }
38 |
39 | - (MASConstraint * (^)(id))greaterThanOrEqualTo {
40 | return ^id(id attribute) {
41 | return self.equalToWithRelation(attribute, NSLayoutRelationGreaterThanOrEqual);
42 | };
43 | }
44 |
45 | - (MASConstraint * (^)(id))mas_greaterThanOrEqualTo {
46 | return ^id(id attribute) {
47 | return self.equalToWithRelation(attribute, NSLayoutRelationGreaterThanOrEqual);
48 | };
49 | }
50 |
51 | - (MASConstraint * (^)(id))lessThanOrEqualTo {
52 | return ^id(id attribute) {
53 | return self.equalToWithRelation(attribute, NSLayoutRelationLessThanOrEqual);
54 | };
55 | }
56 |
57 | - (MASConstraint * (^)(id))mas_lessThanOrEqualTo {
58 | return ^id(id attribute) {
59 | return self.equalToWithRelation(attribute, NSLayoutRelationLessThanOrEqual);
60 | };
61 | }
62 |
63 | #pragma mark - MASLayoutPriority proxies
64 |
65 | - (MASConstraint * (^)())priorityLow {
66 | return ^id{
67 | self.priority(MASLayoutPriorityDefaultLow);
68 | return self;
69 | };
70 | }
71 |
72 | - (MASConstraint * (^)())priorityMedium {
73 | return ^id{
74 | self.priority(MASLayoutPriorityDefaultMedium);
75 | return self;
76 | };
77 | }
78 |
79 | - (MASConstraint * (^)())priorityHigh {
80 | return ^id{
81 | self.priority(MASLayoutPriorityDefaultHigh);
82 | return self;
83 | };
84 | }
85 |
86 | #pragma mark - NSLayoutConstraint constant proxies
87 |
88 | - (MASConstraint * (^)(MASEdgeInsets))insets {
89 | return ^id(MASEdgeInsets insets){
90 | self.insets = insets;
91 | return self;
92 | };
93 | }
94 |
95 | - (MASConstraint * (^)(CGSize))sizeOffset {
96 | return ^id(CGSize offset) {
97 | self.sizeOffset = offset;
98 | return self;
99 | };
100 | }
101 |
102 | - (MASConstraint * (^)(CGPoint))centerOffset {
103 | return ^id(CGPoint offset) {
104 | self.centerOffset = offset;
105 | return self;
106 | };
107 | }
108 |
109 | - (MASConstraint * (^)(CGFloat))offset {
110 | return ^id(CGFloat offset){
111 | self.offset = offset;
112 | return self;
113 | };
114 | }
115 |
116 | - (MASConstraint * (^)(NSValue *value))valueOffset {
117 | return ^id(NSValue *offset) {
118 | NSAssert([offset isKindOfClass:NSValue.class], @"expected an NSValue offset, got: %@", offset);
119 | [self setLayoutConstantWithValue:offset];
120 | return self;
121 | };
122 | }
123 |
124 | - (MASConstraint * (^)(id offset))mas_offset {
125 | // Will never be called due to macro
126 | return nil;
127 | }
128 |
129 | #pragma mark - NSLayoutConstraint constant setter
130 |
131 | - (void)setLayoutConstantWithValue:(NSValue *)value {
132 | if ([value isKindOfClass:NSNumber.class]) {
133 | self.offset = [(NSNumber *)value doubleValue];
134 | } else if (strcmp(value.objCType, @encode(CGPoint)) == 0) {
135 | CGPoint point;
136 | [value getValue:&point];
137 | self.centerOffset = point;
138 | } else if (strcmp(value.objCType, @encode(CGSize)) == 0) {
139 | CGSize size;
140 | [value getValue:&size];
141 | self.sizeOffset = size;
142 | } else if (strcmp(value.objCType, @encode(MASEdgeInsets)) == 0) {
143 | MASEdgeInsets insets;
144 | [value getValue:&insets];
145 | self.insets = insets;
146 | } else {
147 | NSAssert(NO, @"attempting to set layout constant with unsupported value: %@", value);
148 | }
149 | }
150 |
151 | #pragma mark - Semantic properties
152 |
153 | - (MASConstraint *)with {
154 | return self;
155 | }
156 |
157 | - (MASConstraint *)and {
158 | return self;
159 | }
160 |
161 | #pragma mark - Chaining
162 |
163 | - (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute __unused)layoutAttribute {
164 | MASMethodNotImplemented();
165 | }
166 |
167 | - (MASConstraint *)left {
168 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeft];
169 | }
170 |
171 | - (MASConstraint *)top {
172 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTop];
173 | }
174 |
175 | - (MASConstraint *)right {
176 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeRight];
177 | }
178 |
179 | - (MASConstraint *)bottom {
180 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBottom];
181 | }
182 |
183 | - (MASConstraint *)leading {
184 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeading];
185 | }
186 |
187 | - (MASConstraint *)trailing {
188 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTrailing];
189 | }
190 |
191 | - (MASConstraint *)width {
192 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeWidth];
193 | }
194 |
195 | - (MASConstraint *)height {
196 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeHeight];
197 | }
198 |
199 | - (MASConstraint *)centerX {
200 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterX];
201 | }
202 |
203 | - (MASConstraint *)centerY {
204 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterY];
205 | }
206 |
207 | - (MASConstraint *)baseline {
208 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBaseline];
209 | }
210 |
211 | #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
212 |
213 | - (MASConstraint *)firstBaseline {
214 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeFirstBaseline];
215 | }
216 | - (MASConstraint *)lastBaseline {
217 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLastBaseline];
218 | }
219 |
220 | #endif
221 |
222 | #if TARGET_OS_IPHONE || TARGET_OS_TV
223 |
224 | - (MASConstraint *)leftMargin {
225 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeftMargin];
226 | }
227 |
228 | - (MASConstraint *)rightMargin {
229 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeRightMargin];
230 | }
231 |
232 | - (MASConstraint *)topMargin {
233 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTopMargin];
234 | }
235 |
236 | - (MASConstraint *)bottomMargin {
237 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBottomMargin];
238 | }
239 |
240 | - (MASConstraint *)leadingMargin {
241 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeadingMargin];
242 | }
243 |
244 | - (MASConstraint *)trailingMargin {
245 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTrailingMargin];
246 | }
247 |
248 | - (MASConstraint *)centerXWithinMargins {
249 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterXWithinMargins];
250 | }
251 |
252 | - (MASConstraint *)centerYWithinMargins {
253 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterYWithinMargins];
254 | }
255 |
256 | #endif
257 |
258 | #pragma mark - Abstract
259 |
260 | - (MASConstraint * (^)(CGFloat multiplier))multipliedBy { MASMethodNotImplemented(); }
261 |
262 | - (MASConstraint * (^)(CGFloat divider))dividedBy { MASMethodNotImplemented(); }
263 |
264 | - (MASConstraint * (^)(MASLayoutPriority priority))priority { MASMethodNotImplemented(); }
265 |
266 | - (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation { MASMethodNotImplemented(); }
267 |
268 | - (MASConstraint * (^)(id key))key { MASMethodNotImplemented(); }
269 |
270 | - (void)setInsets:(MASEdgeInsets __unused)insets { MASMethodNotImplemented(); }
271 |
272 | - (void)setSizeOffset:(CGSize __unused)sizeOffset { MASMethodNotImplemented(); }
273 |
274 | - (void)setCenterOffset:(CGPoint __unused)centerOffset { MASMethodNotImplemented(); }
275 |
276 | - (void)setOffset:(CGFloat __unused)offset { MASMethodNotImplemented(); }
277 |
278 | #if TARGET_OS_MAC && !(TARGET_OS_IPHONE || TARGET_OS_TV)
279 |
280 | - (MASConstraint *)animator { MASMethodNotImplemented(); }
281 |
282 | #endif
283 |
284 | - (void)activate { MASMethodNotImplemented(); }
285 |
286 | - (void)deactivate { MASMethodNotImplemented(); }
287 |
288 | - (void)install { MASMethodNotImplemented(); }
289 |
290 | - (void)uninstall { MASMethodNotImplemented(); }
291 |
292 | @end
293 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/NSDate+TimeAgo/NSDate+TimeAgo.m:
--------------------------------------------------------------------------------
1 | //
2 | // NSDate+NVTimeAgo.m
3 | // Adventures
4 | //
5 | // Created by Nikil Viswanathan on 4/18/13.
6 | // Copyright (c) 2013 Nikil Viswanathan. All rights reserved.
7 | //
8 |
9 | #import "NSDate+TimeAgo.h"
10 |
11 | @implementation NSDate (NVFacebookTimeAgo)
12 |
13 |
14 | #define SECOND 1
15 | #define MINUTE (SECOND * 60)
16 | #define HOUR (MINUTE * 60)
17 | #define DAY (HOUR * 24)
18 | #define WEEK (DAY * 7)
19 | #define MONTH (DAY * 31)
20 | #define YEAR (DAY * 365.24)
21 |
22 | /*
23 | Mysql Datetime Formatted As Time Ago
24 | Takes in a mysql datetime string and returns the Time Ago date format
25 | */
26 | + (NSString *)mysqlDatetimeFormattedAsTimeAgo:(NSString *)mysqlDatetime
27 | {
28 | //http://stackoverflow.com/questions/10026714/ios-converting-a-date-received-from-a-mysql-server-into-users-local-time
29 | //If this is not in UTC, we don't have any knowledge about
30 | //which tz it is. MUST BE IN UTC.
31 | NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
32 | [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
33 |
34 | NSDate *date = [formatter dateFromString:mysqlDatetime];
35 |
36 | return [date formattedAsTimeAgo];
37 |
38 | }
39 |
40 |
41 | /*
42 | Formatted As Time Ago
43 | Returns the date formatted as Time Ago (in the style of the mobile time ago date formatting for Facebook)
44 | */
45 | - (NSString *)formattedAsTimeAgo
46 | {
47 | //Now
48 | NSDate *now = [NSDate date];
49 | NSTimeInterval secondsSince = -(int)[self timeIntervalSinceDate:now];
50 |
51 | //Should never hit this but handle the future case
52 | if(secondsSince < 0)
53 | return @"In The Future";
54 |
55 |
56 | // < 1 minute = "Just now"
57 | if(secondsSince < MINUTE)
58 | return @"Just now";
59 |
60 |
61 | // < 1 hour = "x minutes ago"
62 | if(secondsSince < HOUR)
63 | return [self formatMinutesAgo:secondsSince];
64 |
65 |
66 | // Today = "x hours ago"
67 | if([self isSameDayAs:now])
68 | return [self formatAsToday:secondsSince];
69 |
70 |
71 | // Yesterday = "Yesterday at 1:28 PM"
72 | if([self isYesterday:now])
73 | return [self formatAsYesterday];
74 |
75 |
76 | // < Last 7 days = "Friday at 1:48 AM"
77 | if([self isLastWeek:secondsSince])
78 | return [self formatAsLastWeek];
79 |
80 |
81 | // < Last 30 days = "March 30 at 1:14 PM"
82 | if([self isLastMonth:secondsSince])
83 | return [self formatAsLastMonth];
84 |
85 | // < 1 year = "September 15"
86 | if([self isLastYear:secondsSince])
87 | return [self formatAsLastYear];
88 |
89 | // Anything else = "September 9, 2011"
90 | return [self formatAsOther];
91 |
92 | }
93 |
94 |
95 |
96 | /*
97 | ========================== Date Comparison Methods ==========================
98 | */
99 |
100 | /*
101 | Is Same Day As
102 | Checks to see if the dates are the same calendar day
103 | */
104 | - (BOOL)isSameDayAs:(NSDate *)comparisonDate
105 | {
106 | //Check by matching the date strings
107 | NSDateFormatter *dateComparisonFormatter = [[NSDateFormatter alloc] init];
108 | [dateComparisonFormatter setDateFormat:@"yyyy-MM-dd"];
109 |
110 | //Return true if they are the same
111 | return [[dateComparisonFormatter stringFromDate:self] isEqualToString:[dateComparisonFormatter stringFromDate:comparisonDate]];
112 | }
113 |
114 |
115 |
116 |
117 | /*
118 | If the current date is yesterday relative to now
119 | Pasing in now to be more accurate (time shift during execution) in the calculations
120 | */
121 | - (BOOL)isYesterday:(NSDate *)now
122 | {
123 | return [self isSameDayAs:[now dateBySubtractingDays:1]];
124 | }
125 |
126 |
127 | //From https://github.com/erica/NSDate-Extensions/blob/master/NSDate-Utilities.m
128 | - (NSDate *) dateBySubtractingDays: (NSInteger) numDays
129 | {
130 | NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + DAY * -numDays;
131 | NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
132 | return newDate;
133 | }
134 |
135 |
136 | /*
137 | Is Last Week
138 | We want to know if the current date object is the first occurance of
139 | that day of the week (ie like the first friday before today
140 | - where we would colloquially say "last Friday")
141 | ( within 6 of the last days)
142 |
143 | TODO: make this more precise (1 week ago, if it is 7 days ago check the exact date)
144 | */
145 | - (BOOL)isLastWeek:(NSTimeInterval)secondsSince
146 | {
147 | return secondsSince < WEEK;
148 | }
149 |
150 |
151 | /*
152 | Is Last Month
153 | Previous 31 days?
154 | TODO: Validate on fb
155 | TODO: Make last day precise
156 | */
157 | - (BOOL)isLastMonth:(NSTimeInterval)secondsSince
158 | {
159 | return secondsSince < MONTH;
160 | }
161 |
162 |
163 | /*
164 | Is Last Year
165 | TODO: Make last day precise
166 | */
167 |
168 | - (BOOL)isLastYear:(NSTimeInterval)secondsSince
169 | {
170 | return secondsSince < YEAR;
171 | }
172 |
173 | /*
174 | =============================================================================
175 | */
176 |
177 |
178 |
179 |
180 |
181 | /*
182 | ========================== Formatting Methods ==========================
183 | */
184 |
185 |
186 | // < 1 hour = "x minutes ago"
187 | - (NSString *)formatMinutesAgo:(NSTimeInterval)secondsSince
188 | {
189 | //Convert to minutes
190 | int minutesSince = (int)secondsSince / MINUTE;
191 |
192 | //Handle Plural
193 | if(minutesSince == 1)
194 | return @"1 minute ago";
195 | else
196 | return [NSString stringWithFormat:@"%d minutes ago", minutesSince];
197 | }
198 |
199 |
200 | // Today = "x hours ago"
201 | - (NSString *)formatAsToday:(NSTimeInterval)secondsSince
202 | {
203 | //Convert to hours
204 | int hoursSince = (int)secondsSince / HOUR;
205 |
206 | //Handle Plural
207 | if(hoursSince == 1)
208 | return @"1 hour ago";
209 | else
210 | return [NSString stringWithFormat:@"%d hours ago", hoursSince];
211 | }
212 |
213 |
214 | // Yesterday = "Yesterday at 1:28 PM"
215 | - (NSString *)formatAsYesterday
216 | {
217 | //Create date formatter
218 | NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
219 |
220 | //Format
221 | [dateFormatter setDateFormat:@"h:mm a"];
222 | return [NSString stringWithFormat:@"Yesterday at %@", [dateFormatter stringFromDate:self]];
223 | }
224 |
225 |
226 | // < Last 7 days = "Friday at 1:48 AM"
227 | - (NSString *)formatAsLastWeek
228 | {
229 | //Create date formatter
230 | NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
231 |
232 | //Format
233 | [dateFormatter setDateFormat:@"EEE 'at' h:mm a"];
234 | return [dateFormatter stringFromDate:self];
235 | }
236 |
237 |
238 | // < Last 30 days = "March 30 at 1:14 PM"
239 | - (NSString *)formatAsLastMonth
240 | {
241 | //Create date formatter
242 | NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
243 |
244 | //Format
245 | [dateFormatter setDateFormat:@"MMM d 'at' h:mm a"];
246 | return [dateFormatter stringFromDate:self];
247 | }
248 |
249 |
250 | // < 1 year = "September 15"
251 | - (NSString *)formatAsLastYear
252 | {
253 | //Create date formatter
254 | NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
255 |
256 | //Format
257 | [dateFormatter setDateFormat:@"MMM d"];
258 | return [dateFormatter stringFromDate:self];
259 | }
260 |
261 |
262 | // Anything else = "September 9, 2011"
263 | - (NSString *)formatAsOther
264 | {
265 | //Create date formatter
266 | NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
267 |
268 | //Format
269 | [dateFormatter setDateFormat:@"LLL d, yyyy"];
270 | return [dateFormatter stringFromDate:self];
271 | }
272 |
273 |
274 | /*
275 | =======================================================================
276 | */
277 |
278 |
279 |
280 |
281 |
282 | /*
283 | ========================== Test Method ==========================
284 | */
285 |
286 | /*
287 | Test the format
288 | TODO: Implement unit tests
289 | */
290 | + (void)runTests
291 | {
292 | NSLog(@"1 Second in the future: %@\n", [[NSDate dateWithTimeIntervalSinceNow:1] formattedAsTimeAgo]);
293 | NSLog(@"Now: %@\n", [[NSDate dateWithTimeIntervalSinceNow:0] formattedAsTimeAgo]);
294 | NSLog(@"1 Second: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-1] formattedAsTimeAgo]);
295 | NSLog(@"10 Seconds: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-10] formattedAsTimeAgo]);
296 | NSLog(@"1 Minute: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-60] formattedAsTimeAgo]);
297 | NSLog(@"2 Minutes: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-120] formattedAsTimeAgo]);
298 | NSLog(@"1 Hour: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-HOUR] formattedAsTimeAgo]);
299 | NSLog(@"2 Hours: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-2*HOUR] formattedAsTimeAgo]);
300 | NSLog(@"1 Day: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-1*DAY] formattedAsTimeAgo]);
301 | NSLog(@"1 Day + 3 seconds: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-1*DAY-3] formattedAsTimeAgo]);
302 | NSLog(@"2 Days: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-2*DAY] formattedAsTimeAgo]);
303 | NSLog(@"3 Days: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-3*DAY] formattedAsTimeAgo]);
304 | NSLog(@"5 Days: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-5*DAY] formattedAsTimeAgo]);
305 | NSLog(@"6 Days: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-6*DAY] formattedAsTimeAgo]);
306 | NSLog(@"7 Days - 1 second: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-7*DAY+1] formattedAsTimeAgo]);
307 | NSLog(@"10 Days: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-10*DAY] formattedAsTimeAgo]);
308 | NSLog(@"1 Month + 1 second: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-MONTH-1] formattedAsTimeAgo]);
309 | NSLog(@"1 Year - 1 second: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-YEAR+1] formattedAsTimeAgo]);
310 | NSLog(@"1 Year + 1 second: %@\n", [[NSDate dateWithTimeIntervalSinceNow:-YEAR+1] formattedAsTimeAgo]);
311 | }
312 | /*
313 | =======================================================================
314 | */
315 |
316 |
317 |
318 | @end
319 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/MASConstraintMaker.m:
--------------------------------------------------------------------------------
1 | //
2 | // MASConstraintBuilder.m
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 20/07/13.
6 | // Copyright (c) 2013 cloudling. All rights reserved.
7 | //
8 |
9 | #import "MASConstraintMaker.h"
10 | #import "MASViewConstraint.h"
11 | #import "MASCompositeConstraint.h"
12 | #import "MASConstraint+Private.h"
13 | #import "MASViewAttribute.h"
14 | #import "View+MASAdditions.h"
15 |
16 | @interface MASConstraintMaker ()
17 |
18 | @property (nonatomic, weak) MAS_VIEW *view;
19 | @property (nonatomic, strong) NSMutableArray *constraints;
20 |
21 | @end
22 |
23 | @implementation MASConstraintMaker
24 |
25 | - (id)initWithView:(MAS_VIEW *)view {
26 | self = [super init];
27 | if (!self) return nil;
28 |
29 | self.view = view;
30 | self.constraints = NSMutableArray.new;
31 |
32 | return self;
33 | }
34 |
35 | - (NSArray *)install {
36 | if (self.removeExisting) {
37 | NSArray *installedConstraints = [MASViewConstraint installedConstraintsForView:self.view];
38 | for (MASConstraint *constraint in installedConstraints) {
39 | [constraint uninstall];
40 | }
41 | }
42 | NSArray *constraints = self.constraints.copy;
43 | for (MASConstraint *constraint in constraints) {
44 | constraint.updateExisting = self.updateExisting;
45 | [constraint install];
46 | }
47 | [self.constraints removeAllObjects];
48 | return constraints;
49 | }
50 |
51 | #pragma mark - MASConstraintDelegate
52 |
53 | - (void)constraint:(MASConstraint *)constraint shouldBeReplacedWithConstraint:(MASConstraint *)replacementConstraint {
54 | NSUInteger index = [self.constraints indexOfObject:constraint];
55 | NSAssert(index != NSNotFound, @"Could not find constraint %@", constraint);
56 | [self.constraints replaceObjectAtIndex:index withObject:replacementConstraint];
57 | }
58 |
59 | - (MASConstraint *)constraint:(MASConstraint *)constraint addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
60 | MASViewAttribute *viewAttribute = [[MASViewAttribute alloc] initWithView:self.view layoutAttribute:layoutAttribute];
61 | MASViewConstraint *newConstraint = [[MASViewConstraint alloc] initWithFirstViewAttribute:viewAttribute];
62 | if ([constraint isKindOfClass:MASViewConstraint.class]) {
63 | //replace with composite constraint
64 | NSArray *children = @[constraint, newConstraint];
65 | MASCompositeConstraint *compositeConstraint = [[MASCompositeConstraint alloc] initWithChildren:children];
66 | compositeConstraint.delegate = self;
67 | [self constraint:constraint shouldBeReplacedWithConstraint:compositeConstraint];
68 | return compositeConstraint;
69 | }
70 | if (!constraint) {
71 | newConstraint.delegate = self;
72 | [self.constraints addObject:newConstraint];
73 | }
74 | return newConstraint;
75 | }
76 |
77 | - (MASConstraint *)addConstraintWithAttributes:(MASAttribute)attrs {
78 | __unused MASAttribute anyAttribute = (MASAttributeLeft | MASAttributeRight | MASAttributeTop | MASAttributeBottom | MASAttributeLeading
79 | | MASAttributeTrailing | MASAttributeWidth | MASAttributeHeight | MASAttributeCenterX
80 | | MASAttributeCenterY | MASAttributeBaseline
81 | #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
82 | | MASAttributeFirstBaseline | MASAttributeLastBaseline
83 | #endif
84 | #if TARGET_OS_IPHONE || TARGET_OS_TV
85 | | MASAttributeLeftMargin | MASAttributeRightMargin | MASAttributeTopMargin | MASAttributeBottomMargin
86 | | MASAttributeLeadingMargin | MASAttributeTrailingMargin | MASAttributeCenterXWithinMargins
87 | | MASAttributeCenterYWithinMargins
88 | #endif
89 | );
90 |
91 | NSAssert((attrs & anyAttribute) != 0, @"You didn't pass any attribute to make.attributes(...)");
92 |
93 | NSMutableArray *attributes = [NSMutableArray array];
94 |
95 | if (attrs & MASAttributeLeft) [attributes addObject:self.view.mas_left];
96 | if (attrs & MASAttributeRight) [attributes addObject:self.view.mas_right];
97 | if (attrs & MASAttributeTop) [attributes addObject:self.view.mas_top];
98 | if (attrs & MASAttributeBottom) [attributes addObject:self.view.mas_bottom];
99 | if (attrs & MASAttributeLeading) [attributes addObject:self.view.mas_leading];
100 | if (attrs & MASAttributeTrailing) [attributes addObject:self.view.mas_trailing];
101 | if (attrs & MASAttributeWidth) [attributes addObject:self.view.mas_width];
102 | if (attrs & MASAttributeHeight) [attributes addObject:self.view.mas_height];
103 | if (attrs & MASAttributeCenterX) [attributes addObject:self.view.mas_centerX];
104 | if (attrs & MASAttributeCenterY) [attributes addObject:self.view.mas_centerY];
105 | if (attrs & MASAttributeBaseline) [attributes addObject:self.view.mas_baseline];
106 |
107 | #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
108 |
109 | if (attrs & MASAttributeFirstBaseline) [attributes addObject:self.view.mas_firstBaseline];
110 | if (attrs & MASAttributeLastBaseline) [attributes addObject:self.view.mas_lastBaseline];
111 |
112 | #endif
113 |
114 | #if TARGET_OS_IPHONE || TARGET_OS_TV
115 |
116 | if (attrs & MASAttributeLeftMargin) [attributes addObject:self.view.mas_leftMargin];
117 | if (attrs & MASAttributeRightMargin) [attributes addObject:self.view.mas_rightMargin];
118 | if (attrs & MASAttributeTopMargin) [attributes addObject:self.view.mas_topMargin];
119 | if (attrs & MASAttributeBottomMargin) [attributes addObject:self.view.mas_bottomMargin];
120 | if (attrs & MASAttributeLeadingMargin) [attributes addObject:self.view.mas_leadingMargin];
121 | if (attrs & MASAttributeTrailingMargin) [attributes addObject:self.view.mas_trailingMargin];
122 | if (attrs & MASAttributeCenterXWithinMargins) [attributes addObject:self.view.mas_centerXWithinMargins];
123 | if (attrs & MASAttributeCenterYWithinMargins) [attributes addObject:self.view.mas_centerYWithinMargins];
124 |
125 | #endif
126 |
127 | NSMutableArray *children = [NSMutableArray arrayWithCapacity:attributes.count];
128 |
129 | for (MASViewAttribute *a in attributes) {
130 | [children addObject:[[MASViewConstraint alloc] initWithFirstViewAttribute:a]];
131 | }
132 |
133 | MASCompositeConstraint *constraint = [[MASCompositeConstraint alloc] initWithChildren:children];
134 | constraint.delegate = self;
135 | [self.constraints addObject:constraint];
136 | return constraint;
137 | }
138 |
139 | #pragma mark - standard Attributes
140 |
141 | - (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
142 | return [self constraint:nil addConstraintWithLayoutAttribute:layoutAttribute];
143 | }
144 |
145 | - (MASConstraint *)left {
146 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeft];
147 | }
148 |
149 | - (MASConstraint *)top {
150 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTop];
151 | }
152 |
153 | - (MASConstraint *)right {
154 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeRight];
155 | }
156 |
157 | - (MASConstraint *)bottom {
158 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBottom];
159 | }
160 |
161 | - (MASConstraint *)leading {
162 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeading];
163 | }
164 |
165 | - (MASConstraint *)trailing {
166 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTrailing];
167 | }
168 |
169 | - (MASConstraint *)width {
170 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeWidth];
171 | }
172 |
173 | - (MASConstraint *)height {
174 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeHeight];
175 | }
176 |
177 | - (MASConstraint *)centerX {
178 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterX];
179 | }
180 |
181 | - (MASConstraint *)centerY {
182 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterY];
183 | }
184 |
185 | - (MASConstraint *)baseline {
186 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBaseline];
187 | }
188 |
189 | - (MASConstraint *(^)(MASAttribute))attributes {
190 | return ^(MASAttribute attrs){
191 | return [self addConstraintWithAttributes:attrs];
192 | };
193 | }
194 |
195 | #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
196 |
197 | - (MASConstraint *)firstBaseline {
198 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeFirstBaseline];
199 | }
200 |
201 | - (MASConstraint *)lastBaseline {
202 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLastBaseline];
203 | }
204 |
205 | #endif
206 |
207 |
208 | #if TARGET_OS_IPHONE || TARGET_OS_TV
209 |
210 | - (MASConstraint *)leftMargin {
211 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeftMargin];
212 | }
213 |
214 | - (MASConstraint *)rightMargin {
215 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeRightMargin];
216 | }
217 |
218 | - (MASConstraint *)topMargin {
219 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTopMargin];
220 | }
221 |
222 | - (MASConstraint *)bottomMargin {
223 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBottomMargin];
224 | }
225 |
226 | - (MASConstraint *)leadingMargin {
227 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLeadingMargin];
228 | }
229 |
230 | - (MASConstraint *)trailingMargin {
231 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeTrailingMargin];
232 | }
233 |
234 | - (MASConstraint *)centerXWithinMargins {
235 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterXWithinMargins];
236 | }
237 |
238 | - (MASConstraint *)centerYWithinMargins {
239 | return [self addConstraintWithLayoutAttribute:NSLayoutAttributeCenterYWithinMargins];
240 | }
241 |
242 | #endif
243 |
244 |
245 | #pragma mark - composite Attributes
246 |
247 | - (MASConstraint *)edges {
248 | return [self addConstraintWithAttributes:MASAttributeTop | MASAttributeLeft | MASAttributeRight | MASAttributeBottom];
249 | }
250 |
251 | - (MASConstraint *)size {
252 | return [self addConstraintWithAttributes:MASAttributeWidth | MASAttributeHeight];
253 | }
254 |
255 | - (MASConstraint *)center {
256 | return [self addConstraintWithAttributes:MASAttributeCenterX | MASAttributeCenterY];
257 | }
258 |
259 | #pragma mark - grouping
260 |
261 | - (MASConstraint *(^)(dispatch_block_t group))group {
262 | return ^id(dispatch_block_t group) {
263 | NSInteger previousCount = self.constraints.count;
264 | group();
265 |
266 | NSArray *children = [self.constraints subarrayWithRange:NSMakeRange(previousCount, self.constraints.count - previousCount)];
267 | MASCompositeConstraint *constraint = [[MASCompositeConstraint alloc] initWithChildren:children];
268 | constraint.delegate = self;
269 | return constraint;
270 | };
271 | }
272 |
273 | @end
274 |
--------------------------------------------------------------------------------
/Libraries/WCSTimeLine/Dependencies/Masonry/MASViewConstraint.m:
--------------------------------------------------------------------------------
1 | //
2 | // MASConstraint.m
3 | // Masonry
4 | //
5 | // Created by Jonas Budelmann on 20/07/13.
6 | // Copyright (c) 2013 cloudling. All rights reserved.
7 | //
8 |
9 | #import "MASViewConstraint.h"
10 | #import "MASConstraint+Private.h"
11 | #import "MASCompositeConstraint.h"
12 | #import "MASLayoutConstraint.h"
13 | #import "View+MASAdditions.h"
14 | #import
15 |
16 | @interface MAS_VIEW (MASConstraints)
17 |
18 | @property (nonatomic, readonly) NSMutableSet *mas_installedConstraints;
19 |
20 | @end
21 |
22 | @implementation MAS_VIEW (MASConstraints)
23 |
24 | static char kInstalledConstraintsKey;
25 |
26 | - (NSMutableSet *)mas_installedConstraints {
27 | NSMutableSet *constraints = objc_getAssociatedObject(self, &kInstalledConstraintsKey);
28 | if (!constraints) {
29 | constraints = [NSMutableSet set];
30 | objc_setAssociatedObject(self, &kInstalledConstraintsKey, constraints, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
31 | }
32 | return constraints;
33 | }
34 |
35 | @end
36 |
37 |
38 | @interface MASViewConstraint ()
39 |
40 | @property (nonatomic, strong, readwrite) MASViewAttribute *secondViewAttribute;
41 | @property (nonatomic, weak) MAS_VIEW *installedView;
42 | @property (nonatomic, weak) MASLayoutConstraint *layoutConstraint;
43 | @property (nonatomic, assign) NSLayoutRelation layoutRelation;
44 | @property (nonatomic, assign) MASLayoutPriority layoutPriority;
45 | @property (nonatomic, assign) CGFloat layoutMultiplier;
46 | @property (nonatomic, assign) CGFloat layoutConstant;
47 | @property (nonatomic, assign) BOOL hasLayoutRelation;
48 | @property (nonatomic, strong) id mas_key;
49 | @property (nonatomic, assign) BOOL useAnimator;
50 |
51 | @end
52 |
53 | @implementation MASViewConstraint
54 |
55 | - (id)initWithFirstViewAttribute:(MASViewAttribute *)firstViewAttribute {
56 | self = [super init];
57 | if (!self) return nil;
58 |
59 | _firstViewAttribute = firstViewAttribute;
60 | self.layoutPriority = MASLayoutPriorityRequired;
61 | self.layoutMultiplier = 1;
62 |
63 | return self;
64 | }
65 |
66 | #pragma mark - NSCoping
67 |
68 | - (id)copyWithZone:(NSZone __unused *)zone {
69 | MASViewConstraint *constraint = [[MASViewConstraint alloc] initWithFirstViewAttribute:self.firstViewAttribute];
70 | constraint.layoutConstant = self.layoutConstant;
71 | constraint.layoutRelation = self.layoutRelation;
72 | constraint.layoutPriority = self.layoutPriority;
73 | constraint.layoutMultiplier = self.layoutMultiplier;
74 | constraint.delegate = self.delegate;
75 | return constraint;
76 | }
77 |
78 | #pragma mark - Public
79 |
80 | + (NSArray *)installedConstraintsForView:(MAS_VIEW *)view {
81 | return [view.mas_installedConstraints allObjects];
82 | }
83 |
84 | #pragma mark - Private
85 |
86 | - (void)setLayoutConstant:(CGFloat)layoutConstant {
87 | _layoutConstant = layoutConstant;
88 |
89 | #if TARGET_OS_MAC && !(TARGET_OS_IPHONE || TARGET_OS_TV)
90 | if (self.useAnimator) {
91 | [self.layoutConstraint.animator setConstant:layoutConstant];
92 | } else {
93 | self.layoutConstraint.constant = layoutConstant;
94 | }
95 | #else
96 | self.layoutConstraint.constant = layoutConstant;
97 | #endif
98 | }
99 |
100 | - (void)setLayoutRelation:(NSLayoutRelation)layoutRelation {
101 | _layoutRelation = layoutRelation;
102 | self.hasLayoutRelation = YES;
103 | }
104 |
105 | - (BOOL)supportsActiveProperty {
106 | return [self.layoutConstraint respondsToSelector:@selector(isActive)];
107 | }
108 |
109 | - (BOOL)isActive {
110 | BOOL active = YES;
111 | if ([self supportsActiveProperty]) {
112 | active = [self.layoutConstraint isActive];
113 | }
114 |
115 | return active;
116 | }
117 |
118 | - (BOOL)hasBeenInstalled {
119 | return (self.layoutConstraint != nil) && [self isActive];
120 | }
121 |
122 | - (void)setSecondViewAttribute:(id)secondViewAttribute {
123 | if ([secondViewAttribute isKindOfClass:NSValue.class]) {
124 | [self setLayoutConstantWithValue:secondViewAttribute];
125 | } else if ([secondViewAttribute isKindOfClass:MAS_VIEW.class]) {
126 | _secondViewAttribute = [[MASViewAttribute alloc] initWithView:secondViewAttribute layoutAttribute:self.firstViewAttribute.layoutAttribute];
127 | } else if ([secondViewAttribute isKindOfClass:MASViewAttribute.class]) {
128 | _secondViewAttribute = secondViewAttribute;
129 | } else {
130 | NSAssert(NO, @"attempting to add unsupported attribute: %@", secondViewAttribute);
131 | }
132 | }
133 |
134 | #pragma mark - NSLayoutConstraint multiplier proxies
135 |
136 | - (MASConstraint * (^)(CGFloat))multipliedBy {
137 | return ^id(CGFloat multiplier) {
138 | NSAssert(!self.hasBeenInstalled,
139 | @"Cannot modify constraint multiplier after it has been installed");
140 |
141 | self.layoutMultiplier = multiplier;
142 | return self;
143 | };
144 | }
145 |
146 |
147 | - (MASConstraint * (^)(CGFloat))dividedBy {
148 | return ^id(CGFloat divider) {
149 | NSAssert(!self.hasBeenInstalled,
150 | @"Cannot modify constraint multiplier after it has been installed");
151 |
152 | self.layoutMultiplier = 1.0/divider;
153 | return self;
154 | };
155 | }
156 |
157 | #pragma mark - MASLayoutPriority proxy
158 |
159 | - (MASConstraint * (^)(MASLayoutPriority))priority {
160 | return ^id(MASLayoutPriority priority) {
161 | NSAssert(!self.hasBeenInstalled,
162 | @"Cannot modify constraint priority after it has been installed");
163 |
164 | self.layoutPriority = priority;
165 | return self;
166 | };
167 | }
168 |
169 | #pragma mark - NSLayoutRelation proxy
170 |
171 | - (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation {
172 | return ^id(id attribute, NSLayoutRelation relation) {
173 | if ([attribute isKindOfClass:NSArray.class]) {
174 | NSAssert(!self.hasLayoutRelation, @"Redefinition of constraint relation");
175 | NSMutableArray *children = NSMutableArray.new;
176 | for (id attr in attribute) {
177 | MASViewConstraint *viewConstraint = [self copy];
178 | viewConstraint.layoutRelation = relation;
179 | viewConstraint.secondViewAttribute = attr;
180 | [children addObject:viewConstraint];
181 | }
182 | MASCompositeConstraint *compositeConstraint = [[MASCompositeConstraint alloc] initWithChildren:children];
183 | compositeConstraint.delegate = self.delegate;
184 | [self.delegate constraint:self shouldBeReplacedWithConstraint:compositeConstraint];
185 | return compositeConstraint;
186 | } else {
187 | NSAssert(!self.hasLayoutRelation || self.layoutRelation == relation && [attribute isKindOfClass:NSValue.class], @"Redefinition of constraint relation");
188 | self.layoutRelation = relation;
189 | self.secondViewAttribute = attribute;
190 | return self;
191 | }
192 | };
193 | }
194 |
195 | #pragma mark - Semantic properties
196 |
197 | - (MASConstraint *)with {
198 | return self;
199 | }
200 |
201 | - (MASConstraint *)and {
202 | return self;
203 | }
204 |
205 | #pragma mark - attribute chaining
206 |
207 | - (MASConstraint *)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute {
208 | NSAssert(!self.hasLayoutRelation, @"Attributes should be chained before defining the constraint relation");
209 |
210 | return [self.delegate constraint:self addConstraintWithLayoutAttribute:layoutAttribute];
211 | }
212 |
213 | #pragma mark - Animator proxy
214 |
215 | #if TARGET_OS_MAC && !(TARGET_OS_IPHONE || TARGET_OS_TV)
216 |
217 | - (MASConstraint *)animator {
218 | self.useAnimator = YES;
219 | return self;
220 | }
221 |
222 | #endif
223 |
224 | #pragma mark - debug helpers
225 |
226 | - (MASConstraint * (^)(id))key {
227 | return ^id(id key) {
228 | self.mas_key = key;
229 | return self;
230 | };
231 | }
232 |
233 | #pragma mark - NSLayoutConstraint constant setters
234 |
235 | - (void)setInsets:(MASEdgeInsets)insets {
236 | NSLayoutAttribute layoutAttribute = self.firstViewAttribute.layoutAttribute;
237 | switch (layoutAttribute) {
238 | case NSLayoutAttributeLeft:
239 | case NSLayoutAttributeLeading:
240 | self.layoutConstant = insets.left;
241 | break;
242 | case NSLayoutAttributeTop:
243 | self.layoutConstant = insets.top;
244 | break;
245 | case NSLayoutAttributeBottom:
246 | self.layoutConstant = -insets.bottom;
247 | break;
248 | case NSLayoutAttributeRight:
249 | case NSLayoutAttributeTrailing:
250 | self.layoutConstant = -insets.right;
251 | break;
252 | default:
253 | break;
254 | }
255 | }
256 |
257 | - (void)setOffset:(CGFloat)offset {
258 | self.layoutConstant = offset;
259 | }
260 |
261 | - (void)setSizeOffset:(CGSize)sizeOffset {
262 | NSLayoutAttribute layoutAttribute = self.firstViewAttribute.layoutAttribute;
263 | switch (layoutAttribute) {
264 | case NSLayoutAttributeWidth:
265 | self.layoutConstant = sizeOffset.width;
266 | break;
267 | case NSLayoutAttributeHeight:
268 | self.layoutConstant = sizeOffset.height;
269 | break;
270 | default:
271 | break;
272 | }
273 | }
274 |
275 | - (void)setCenterOffset:(CGPoint)centerOffset {
276 | NSLayoutAttribute layoutAttribute = self.firstViewAttribute.layoutAttribute;
277 | switch (layoutAttribute) {
278 | case NSLayoutAttributeCenterX:
279 | self.layoutConstant = centerOffset.x;
280 | break;
281 | case NSLayoutAttributeCenterY:
282 | self.layoutConstant = centerOffset.y;
283 | break;
284 | default:
285 | break;
286 | }
287 | }
288 |
289 | #pragma mark - MASConstraint
290 |
291 | - (void)activate {
292 | [self install];
293 | }
294 |
295 | - (void)deactivate {
296 | [self uninstall];
297 | }
298 |
299 | - (void)install {
300 | if (self.hasBeenInstalled) {
301 | return;
302 | }
303 |
304 | if ([self supportsActiveProperty] && self.layoutConstraint) {
305 | self.layoutConstraint.active = YES;
306 | [self.firstViewAttribute.view.mas_installedConstraints addObject:self];
307 | return;
308 | }
309 |
310 | MAS_VIEW *firstLayoutItem = self.firstViewAttribute.item;
311 | NSLayoutAttribute firstLayoutAttribute = self.firstViewAttribute.layoutAttribute;
312 | MAS_VIEW *secondLayoutItem = self.secondViewAttribute.item;
313 | NSLayoutAttribute secondLayoutAttribute = self.secondViewAttribute.layoutAttribute;
314 |
315 | // alignment attributes must have a secondViewAttribute
316 | // therefore we assume that is refering to superview
317 | // eg make.left.equalTo(@10)
318 | if (!self.firstViewAttribute.isSizeAttribute && !self.secondViewAttribute) {
319 | secondLayoutItem = self.firstViewAttribute.view.superview;
320 | secondLayoutAttribute = firstLayoutAttribute;
321 | }
322 |
323 | MASLayoutConstraint *layoutConstraint
324 | = [MASLayoutConstraint constraintWithItem:firstLayoutItem
325 | attribute:firstLayoutAttribute
326 | relatedBy:self.layoutRelation
327 | toItem:secondLayoutItem
328 | attribute:secondLayoutAttribute
329 | multiplier:self.layoutMultiplier
330 | constant:self.layoutConstant];
331 |
332 | layoutConstraint.priority = self.layoutPriority;
333 | layoutConstraint.mas_key = self.mas_key;
334 |
335 | if (self.secondViewAttribute.view) {
336 | MAS_VIEW *closestCommonSuperview = [self.firstViewAttribute.view mas_closestCommonSuperview:self.secondViewAttribute.view];
337 | NSAssert(closestCommonSuperview,
338 | @"couldn't find a common superview for %@ and %@",
339 | self.firstViewAttribute.view, self.secondViewAttribute.view);
340 | self.installedView = closestCommonSuperview;
341 | } else if (self.firstViewAttribute.isSizeAttribute) {
342 | self.installedView = self.firstViewAttribute.view;
343 | } else {
344 | self.installedView = self.firstViewAttribute.view.superview;
345 | }
346 |
347 |
348 | MASLayoutConstraint *existingConstraint = nil;
349 | if (self.updateExisting) {
350 | existingConstraint = [self layoutConstraintSimilarTo:layoutConstraint];
351 | }
352 | if (existingConstraint) {
353 | // just update the constant
354 | existingConstraint.constant = layoutConstraint.constant;
355 | self.layoutConstraint = existingConstraint;
356 | } else {
357 | [self.installedView addConstraint:layoutConstraint];
358 | self.layoutConstraint = layoutConstraint;
359 | [firstLayoutItem.mas_installedConstraints addObject:self];
360 | }
361 | }
362 |
363 | - (MASLayoutConstraint *)layoutConstraintSimilarTo:(MASLayoutConstraint *)layoutConstraint {
364 | // check if any constraints are the same apart from the only mutable property constant
365 |
366 | // go through constraints in reverse as we do not want to match auto-resizing or interface builder constraints
367 | // and they are likely to be added first.
368 | for (NSLayoutConstraint *existingConstraint in self.installedView.constraints.reverseObjectEnumerator) {
369 | if (![existingConstraint isKindOfClass:MASLayoutConstraint.class]) continue;
370 | if (existingConstraint.firstItem != layoutConstraint.firstItem) continue;
371 | if (existingConstraint.secondItem != layoutConstraint.secondItem) continue;
372 | if (existingConstraint.firstAttribute != layoutConstraint.firstAttribute) continue;
373 | if (existingConstraint.secondAttribute != layoutConstraint.secondAttribute) continue;
374 | if (existingConstraint.relation != layoutConstraint.relation) continue;
375 | if (existingConstraint.multiplier != layoutConstraint.multiplier) continue;
376 | if (existingConstraint.priority != layoutConstraint.priority) continue;
377 |
378 | return (id)existingConstraint;
379 | }
380 | return nil;
381 | }
382 |
383 | - (void)uninstall {
384 | if ([self supportsActiveProperty]) {
385 | self.layoutConstraint.active = NO;
386 | [self.firstViewAttribute.view.mas_installedConstraints removeObject:self];
387 | return;
388 | }
389 |
390 | [self.installedView removeConstraint:self.layoutConstraint];
391 | self.layoutConstraint = nil;
392 | self.installedView = nil;
393 |
394 | [self.firstViewAttribute.view.mas_installedConstraints removeObject:self];
395 | }
396 |
397 | @end
398 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 2, June 1991
3 |
4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6 | Everyone is permitted to copy and distribute verbatim copies
7 | of this license document, but changing it is not allowed.
8 |
9 | Preamble
10 |
11 | The licenses for most software are designed to take away your
12 | freedom to share and change it. By contrast, the GNU General Public
13 | License is intended to guarantee your freedom to share and change free
14 | software--to make sure the software is free for all its users. This
15 | General Public License applies to most of the Free Software
16 | Foundation's software and to any other program whose authors commit to
17 | using it. (Some other Free Software Foundation software is covered by
18 | the GNU Lesser General Public License instead.) You can apply it to
19 | your programs, too.
20 |
21 | When we speak of free software, we are referring to freedom, not
22 | price. Our General Public Licenses are designed to make sure that you
23 | have the freedom to distribute copies of free software (and charge for
24 | this service if you wish), that you receive source code or can get it
25 | if you want it, that you can change the software or use pieces of it
26 | in new free programs; and that you know you can do these things.
27 |
28 | To protect your rights, we need to make restrictions that forbid
29 | anyone to deny you these rights or to ask you to surrender the rights.
30 | These restrictions translate to certain responsibilities for you if you
31 | distribute copies of the software, or if you modify it.
32 |
33 | For example, if you distribute copies of such a program, whether
34 | gratis or for a fee, you must give the recipients all the rights that
35 | you have. You must make sure that they, too, receive or can get the
36 | source code. And you must show them these terms so they know their
37 | rights.
38 |
39 | We protect your rights with two steps: (1) copyright the software, and
40 | (2) offer you this license which gives you legal permission to copy,
41 | distribute and/or modify the software.
42 |
43 | Also, for each author's protection and ours, we want to make certain
44 | that everyone understands that there is no warranty for this free
45 | software. If the software is modified by someone else and passed on, we
46 | want its recipients to know that what they have is not the original, so
47 | that any problems introduced by others will not reflect on the original
48 | authors' reputations.
49 |
50 | Finally, any free program is threatened constantly by software
51 | patents. We wish to avoid the danger that redistributors of a free
52 | program will individually obtain patent licenses, in effect making the
53 | program proprietary. To prevent this, we have made it clear that any
54 | patent must be licensed for everyone's free use or not licensed at all.
55 |
56 | The precise terms and conditions for copying, distribution and
57 | modification follow.
58 |
59 | GNU GENERAL PUBLIC LICENSE
60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61 |
62 | 0. This License applies to any program or other work which contains
63 | a notice placed by the copyright holder saying it may be distributed
64 | under the terms of this General Public License. The "Program", below,
65 | refers to any such program or work, and a "work based on the Program"
66 | means either the Program or any derivative work under copyright law:
67 | that is to say, a work containing the Program or a portion of it,
68 | either verbatim or with modifications and/or translated into another
69 | language. (Hereinafter, translation is included without limitation in
70 | the term "modification".) Each licensee is addressed as "you".
71 |
72 | Activities other than copying, distribution and modification are not
73 | covered by this License; they are outside its scope. The act of
74 | running the Program is not restricted, and the output from the Program
75 | is covered only if its contents constitute a work based on the
76 | Program (independent of having been made by running the Program).
77 | Whether that is true depends on what the Program does.
78 |
79 | 1. You may copy and distribute verbatim copies of the Program's
80 | source code as you receive it, in any medium, provided that you
81 | conspicuously and appropriately publish on each copy an appropriate
82 | copyright notice and disclaimer of warranty; keep intact all the
83 | notices that refer to this License and to the absence of any warranty;
84 | and give any other recipients of the Program a copy of this License
85 | along with the Program.
86 |
87 | You may charge a fee for the physical act of transferring a copy, and
88 | you may at your option offer warranty protection in exchange for a fee.
89 |
90 | 2. You may modify your copy or copies of the Program or any portion
91 | of it, thus forming a work based on the Program, and copy and
92 | distribute such modifications or work under the terms of Section 1
93 | above, provided that you also meet all of these conditions:
94 |
95 | a) You must cause the modified files to carry prominent notices
96 | stating that you changed the files and the date of any change.
97 |
98 | b) You must cause any work that you distribute or publish, that in
99 | whole or in part contains or is derived from the Program or any
100 | part thereof, to be licensed as a whole at no charge to all third
101 | parties under the terms of this License.
102 |
103 | c) If the modified program normally reads commands interactively
104 | when run, you must cause it, when started running for such
105 | interactive use in the most ordinary way, to print or display an
106 | announcement including an appropriate copyright notice and a
107 | notice that there is no warranty (or else, saying that you provide
108 | a warranty) and that users may redistribute the program under
109 | these conditions, and telling the user how to view a copy of this
110 | License. (Exception: if the Program itself is interactive but
111 | does not normally print such an announcement, your work based on
112 | the Program is not required to print an announcement.)
113 |
114 | These requirements apply to the modified work as a whole. If
115 | identifiable sections of that work are not derived from the Program,
116 | and can be reasonably considered independent and separate works in
117 | themselves, then this License, and its terms, do not apply to those
118 | sections when you distribute them as separate works. But when you
119 | distribute the same sections as part of a whole which is a work based
120 | on the Program, the distribution of the whole must be on the terms of
121 | this License, whose permissions for other licensees extend to the
122 | entire whole, and thus to each and every part regardless of who wrote it.
123 |
124 | Thus, it is not the intent of this section to claim rights or contest
125 | your rights to work written entirely by you; rather, the intent is to
126 | exercise the right to control the distribution of derivative or
127 | collective works based on the Program.
128 |
129 | In addition, mere aggregation of another work not based on the Program
130 | with the Program (or with a work based on the Program) on a volume of
131 | a storage or distribution medium does not bring the other work under
132 | the scope of this License.
133 |
134 | 3. You may copy and distribute the Program (or a work based on it,
135 | under Section 2) in object code or executable form under the terms of
136 | Sections 1 and 2 above provided that you also do one of the following:
137 |
138 | a) Accompany it with the complete corresponding machine-readable
139 | source code, which must be distributed under the terms of Sections
140 | 1 and 2 above on a medium customarily used for software interchange; or,
141 |
142 | b) Accompany it with a written offer, valid for at least three
143 | years, to give any third party, for a charge no more than your
144 | cost of physically performing source distribution, a complete
145 | machine-readable copy of the corresponding source code, to be
146 | distributed under the terms of Sections 1 and 2 above on a medium
147 | customarily used for software interchange; or,
148 |
149 | c) Accompany it with the information you received as to the offer
150 | to distribute corresponding source code. (This alternative is
151 | allowed only for noncommercial distribution and only if you
152 | received the program in object code or executable form with such
153 | an offer, in accord with Subsection b above.)
154 |
155 | The source code for a work means the preferred form of the work for
156 | making modifications to it. For an executable work, complete source
157 | code means all the source code for all modules it contains, plus any
158 | associated interface definition files, plus the scripts used to
159 | control compilation and installation of the executable. However, as a
160 | special exception, the source code distributed need not include
161 | anything that is normally distributed (in either source or binary
162 | form) with the major components (compiler, kernel, and so on) of the
163 | operating system on which the executable runs, unless that component
164 | itself accompanies the executable.
165 |
166 | If distribution of executable or object code is made by offering
167 | access to copy from a designated place, then offering equivalent
168 | access to copy the source code from the same place counts as
169 | distribution of the source code, even though third parties are not
170 | compelled to copy the source along with the object code.
171 |
172 | 4. You may not copy, modify, sublicense, or distribute the Program
173 | except as expressly provided under this License. Any attempt
174 | otherwise to copy, modify, sublicense or distribute the Program is
175 | void, and will automatically terminate your rights under this License.
176 | However, parties who have received copies, or rights, from you under
177 | this License will not have their licenses terminated so long as such
178 | parties remain in full compliance.
179 |
180 | 5. You are not required to accept this License, since you have not
181 | signed it. However, nothing else grants you permission to modify or
182 | distribute the Program or its derivative works. These actions are
183 | prohibited by law if you do not accept this License. Therefore, by
184 | modifying or distributing the Program (or any work based on the
185 | Program), you indicate your acceptance of this License to do so, and
186 | all its terms and conditions for copying, distributing or modifying
187 | the Program or works based on it.
188 |
189 | 6. Each time you redistribute the Program (or any work based on the
190 | Program), the recipient automatically receives a license from the
191 | original licensor to copy, distribute or modify the Program subject to
192 | these terms and conditions. You may not impose any further
193 | restrictions on the recipients' exercise of the rights granted herein.
194 | You are not responsible for enforcing compliance by third parties to
195 | this License.
196 |
197 | 7. If, as a consequence of a court judgment or allegation of patent
198 | infringement or for any other reason (not limited to patent issues),
199 | conditions are imposed on you (whether by court order, agreement or
200 | otherwise) that contradict the conditions of this License, they do not
201 | excuse you from the conditions of this License. If you cannot
202 | distribute so as to satisfy simultaneously your obligations under this
203 | License and any other pertinent obligations, then as a consequence you
204 | may not distribute the Program at all. For example, if a patent
205 | license would not permit royalty-free redistribution of the Program by
206 | all those who receive copies directly or indirectly through you, then
207 | the only way you could satisfy both it and this License would be to
208 | refrain entirely from distribution of the Program.
209 |
210 | If any portion of this section is held invalid or unenforceable under
211 | any particular circumstance, the balance of the section is intended to
212 | apply and the section as a whole is intended to apply in other
213 | circumstances.
214 |
215 | It is not the purpose of this section to induce you to infringe any
216 | patents or other property right claims or to contest validity of any
217 | such claims; this section has the sole purpose of protecting the
218 | integrity of the free software distribution system, which is
219 | implemented by public license practices. Many people have made
220 | generous contributions to the wide range of software distributed
221 | through that system in reliance on consistent application of that
222 | system; it is up to the author/donor to decide if he or she is willing
223 | to distribute software through any other system and a licensee cannot
224 | impose that choice.
225 |
226 | This section is intended to make thoroughly clear what is believed to
227 | be a consequence of the rest of this License.
228 |
229 | 8. If the distribution and/or use of the Program is restricted in
230 | certain countries either by patents or by copyrighted interfaces, the
231 | original copyright holder who places the Program under this License
232 | may add an explicit geographical distribution limitation excluding
233 | those countries, so that distribution is permitted only in or among
234 | countries not thus excluded. In such case, this License incorporates
235 | the limitation as if written in the body of this License.
236 |
237 | 9. The Free Software Foundation may publish revised and/or new versions
238 | of the General Public License from time to time. Such new versions will
239 | be similar in spirit to the present version, but may differ in detail to
240 | address new problems or concerns.
241 |
242 | Each version is given a distinguishing version number. If the Program
243 | specifies a version number of this License which applies to it and "any
244 | later version", you have the option of following the terms and conditions
245 | either of that version or of any later version published by the Free
246 | Software Foundation. If the Program does not specify a version number of
247 | this License, you may choose any version ever published by the Free Software
248 | Foundation.
249 |
250 | 10. If you wish to incorporate parts of the Program into other free
251 | programs whose distribution conditions are different, write to the author
252 | to ask for permission. For software which is copyrighted by the Free
253 | Software Foundation, write to the Free Software Foundation; we sometimes
254 | make exceptions for this. Our decision will be guided by the two goals
255 | of preserving the free status of all derivatives of our free software and
256 | of promoting the sharing and reuse of software generally.
257 |
258 | NO WARRANTY
259 |
260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268 | REPAIR OR CORRECTION.
269 |
270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278 | POSSIBILITY OF SUCH DAMAGES.
279 |
280 | END OF TERMS AND CONDITIONS
281 |
282 | How to Apply These Terms to Your New Programs
283 |
284 | If you develop a new program, and you want it to be of the greatest
285 | possible use to the public, the best way to achieve this is to make it
286 | free software which everyone can redistribute and change under these terms.
287 |
288 | To do so, attach the following notices to the program. It is safest
289 | to attach them to the start of each source file to most effectively
290 | convey the exclusion of warranty; and each file should have at least
291 | the "copyright" line and a pointer to where the full notice is found.
292 |
293 | {description}
294 | Copyright (C) {year} {fullname}
295 |
296 | This program is free software; you can redistribute it and/or modify
297 | it under the terms of the GNU General Public License as published by
298 | the Free Software Foundation; either version 2 of the License, or
299 | (at your option) any later version.
300 |
301 | This program is distributed in the hope that it will be useful,
302 | but WITHOUT ANY WARRANTY; without even the implied warranty of
303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304 | GNU General Public License for more details.
305 |
306 | You should have received a copy of the GNU General Public License along
307 | with this program; if not, write to the Free Software Foundation, Inc.,
308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309 |
310 | Also add information on how to contact you by electronic and paper mail.
311 |
312 | If the program is interactive, make it output a short notice like this
313 | when it starts in an interactive mode:
314 |
315 | Gnomovision version 69, Copyright (C) year name of author
316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317 | This is free software, and you are welcome to redistribute it
318 | under certain conditions; type `show c' for details.
319 |
320 | The hypothetical commands `show w' and `show c' should show the appropriate
321 | parts of the General Public License. Of course, the commands you use may
322 | be called something other than `show w' and `show c'; they could even be
323 | mouse-clicks or menu items--whatever suits your program.
324 |
325 | You should also get your employer (if you work as a programmer) or your
326 | school, if any, to sign a "copyright disclaimer" for the program, if
327 | necessary. Here is a sample; alter the names:
328 |
329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330 | `Gnomovision' (which makes passes at compilers) written by James Hacker.
331 |
332 | {signature of Ty Coon}, 1 April 1989
333 | Ty Coon, President of Vice
334 |
335 | This General Public License does not permit incorporating your program into
336 | proprietary programs. If your program is a subroutine library, you may
337 | consider it more useful to permit linking proprietary applications with the
338 | library. If this is what you want to do, use the GNU Lesser General
339 | Public License instead of this License.
340 |
--------------------------------------------------------------------------------
/WCSTimeline.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | C75652951E7AEDB9005F8C21 /* MASCompositeConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = C75652771E7AEDB9005F8C21 /* MASCompositeConstraint.m */; };
11 | C75652961E7AEDB9005F8C21 /* MASConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = C756527A1E7AEDB9005F8C21 /* MASConstraint.m */; };
12 | C75652971E7AEDB9005F8C21 /* MASConstraintMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = C756527C1E7AEDB9005F8C21 /* MASConstraintMaker.m */; };
13 | C75652981E7AEDB9005F8C21 /* MASLayoutConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = C756527E1E7AEDB9005F8C21 /* MASLayoutConstraint.m */; };
14 | C75652991E7AEDB9005F8C21 /* MASViewAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = C75652821E7AEDB9005F8C21 /* MASViewAttribute.m */; };
15 | C756529A1E7AEDB9005F8C21 /* MASViewConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = C75652841E7AEDB9005F8C21 /* MASViewConstraint.m */; };
16 | C756529B1E7AEDB9005F8C21 /* NSArray+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = C75652861E7AEDB9005F8C21 /* NSArray+MASAdditions.m */; };
17 | C756529C1E7AEDB9005F8C21 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = C75652891E7AEDB9005F8C21 /* NSLayoutConstraint+MASDebugAdditions.m */; };
18 | C756529D1E7AEDB9005F8C21 /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = C756528B1E7AEDB9005F8C21 /* View+MASAdditions.m */; };
19 | C756529E1E7AEDB9005F8C21 /* ViewController+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = C756528E1E7AEDB9005F8C21 /* ViewController+MASAdditions.m */; };
20 | C75652A01E7AEDB9005F8C21 /* WCSLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = C75652941E7AEDB9005F8C21 /* WCSLabel.m */; };
21 | C76245DD1E7A466600114716 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C76245D31E7A466600114716 /* AppDelegate.m */; };
22 | C76245DE1E7A466600114716 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C76245D41E7A466600114716 /* Assets.xcassets */; };
23 | C76245DF1E7A466600114716 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C76245D51E7A466600114716 /* LaunchScreen.storyboard */; };
24 | C76245E01E7A466600114716 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C76245D71E7A466600114716 /* Main.storyboard */; };
25 | C76245E21E7A466600114716 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C76245DA1E7A466600114716 /* main.m */; };
26 | C76245E31E7A466600114716 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C76245DC1E7A466600114716 /* ViewController.m */; };
27 | C76245E71E7A46D000114716 /* WCSTimelineCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C76245E61E7A46D000114716 /* WCSTimelineCell.m */; };
28 | C762460E1E7A499400114716 /* WCSTimelineModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C762460D1E7A499400114716 /* WCSTimelineModel.m */; };
29 | C7C6748E1E7B65BB000ED7F1 /* NSDate+TimeAgo.m in Sources */ = {isa = PBXBuildFile; fileRef = C7C6748D1E7B65BB000ED7F1 /* NSDate+TimeAgo.m */; };
30 | /* End PBXBuildFile section */
31 |
32 | /* Begin PBXFileReference section */
33 | C75652761E7AEDB9005F8C21 /* MASCompositeConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASCompositeConstraint.h; sourceTree = ""; };
34 | C75652771E7AEDB9005F8C21 /* MASCompositeConstraint.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASCompositeConstraint.m; sourceTree = ""; };
35 | C75652781E7AEDB9005F8C21 /* MASConstraint+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MASConstraint+Private.h"; sourceTree = ""; };
36 | C75652791E7AEDB9005F8C21 /* MASConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASConstraint.h; sourceTree = ""; };
37 | C756527A1E7AEDB9005F8C21 /* MASConstraint.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASConstraint.m; sourceTree = ""; };
38 | C756527B1E7AEDB9005F8C21 /* MASConstraintMaker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASConstraintMaker.h; sourceTree = ""; };
39 | C756527C1E7AEDB9005F8C21 /* MASConstraintMaker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASConstraintMaker.m; sourceTree = ""; };
40 | C756527D1E7AEDB9005F8C21 /* MASLayoutConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASLayoutConstraint.h; sourceTree = ""; };
41 | C756527E1E7AEDB9005F8C21 /* MASLayoutConstraint.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASLayoutConstraint.m; sourceTree = ""; };
42 | C756527F1E7AEDB9005F8C21 /* Masonry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Masonry.h; sourceTree = ""; };
43 | C75652801E7AEDB9005F8C21 /* MASUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASUtilities.h; sourceTree = ""; };
44 | C75652811E7AEDB9005F8C21 /* MASViewAttribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASViewAttribute.h; sourceTree = ""; };
45 | C75652821E7AEDB9005F8C21 /* MASViewAttribute.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASViewAttribute.m; sourceTree = ""; };
46 | C75652831E7AEDB9005F8C21 /* MASViewConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MASViewConstraint.h; sourceTree = ""; };
47 | C75652841E7AEDB9005F8C21 /* MASViewConstraint.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MASViewConstraint.m; sourceTree = ""; };
48 | C75652851E7AEDB9005F8C21 /* NSArray+MASAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+MASAdditions.h"; sourceTree = ""; };
49 | C75652861E7AEDB9005F8C21 /* NSArray+MASAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+MASAdditions.m"; sourceTree = ""; };
50 | C75652871E7AEDB9005F8C21 /* NSArray+MASShorthandAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+MASShorthandAdditions.h"; sourceTree = ""; };
51 | C75652881E7AEDB9005F8C21 /* NSLayoutConstraint+MASDebugAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSLayoutConstraint+MASDebugAdditions.h"; sourceTree = ""; };
52 | C75652891E7AEDB9005F8C21 /* NSLayoutConstraint+MASDebugAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSLayoutConstraint+MASDebugAdditions.m"; sourceTree = ""; };
53 | C756528A1E7AEDB9005F8C21 /* View+MASAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "View+MASAdditions.h"; sourceTree = ""; };
54 | C756528B1E7AEDB9005F8C21 /* View+MASAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "View+MASAdditions.m"; sourceTree = ""; };
55 | C756528C1E7AEDB9005F8C21 /* View+MASShorthandAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "View+MASShorthandAdditions.h"; sourceTree = ""; };
56 | C756528D1E7AEDB9005F8C21 /* ViewController+MASAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ViewController+MASAdditions.h"; sourceTree = ""; };
57 | C756528E1E7AEDB9005F8C21 /* ViewController+MASAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ViewController+MASAdditions.m"; sourceTree = ""; };
58 | C75652931E7AEDB9005F8C21 /* WCSLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WCSLabel.h; sourceTree = ""; };
59 | C75652941E7AEDB9005F8C21 /* WCSLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WCSLabel.m; sourceTree = ""; };
60 | C76245901E7A415800114716 /* WCSTimeline.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WCSTimeline.app; sourceTree = BUILT_PRODUCTS_DIR; };
61 | C76245D21E7A466600114716 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Example/AppDelegate.h; sourceTree = ""; };
62 | C76245D31E7A466600114716 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Example/AppDelegate.m; sourceTree = ""; };
63 | C76245D41E7A466600114716 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
64 | C76245D61E7A466600114716 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
65 | C76245D81E7A466600114716 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
66 | C76245D91E7A466600114716 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Example/Info.plist; sourceTree = ""; };
67 | C76245DA1E7A466600114716 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
68 | C76245DB1E7A466600114716 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; };
69 | C76245DC1E7A466600114716 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; };
70 | C76245E51E7A46D000114716 /* WCSTimelineCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WCSTimelineCell.h; path = Libraries/WCSTimeLine/WCSTimelineCell.h; sourceTree = SOURCE_ROOT; };
71 | C76245E61E7A46D000114716 /* WCSTimelineCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WCSTimelineCell.m; path = Libraries/WCSTimeLine/WCSTimelineCell.m; sourceTree = SOURCE_ROOT; };
72 | C762460C1E7A499400114716 /* WCSTimelineModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WCSTimelineModel.h; path = Libraries/WCSTimeLine/WCSTimelineModel.h; sourceTree = SOURCE_ROOT; };
73 | C762460D1E7A499400114716 /* WCSTimelineModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WCSTimelineModel.m; path = Libraries/WCSTimeLine/WCSTimelineModel.m; sourceTree = SOURCE_ROOT; };
74 | C7C6748C1E7B65BB000ED7F1 /* NSDate+TimeAgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+TimeAgo.h"; sourceTree = ""; };
75 | C7C6748D1E7B65BB000ED7F1 /* NSDate+TimeAgo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+TimeAgo.m"; sourceTree = ""; };
76 | /* End PBXFileReference section */
77 |
78 | /* Begin PBXFrameworksBuildPhase section */
79 | C762458D1E7A415800114716 /* Frameworks */ = {
80 | isa = PBXFrameworksBuildPhase;
81 | buildActionMask = 2147483647;
82 | files = (
83 | );
84 | runOnlyForDeploymentPostprocessing = 0;
85 | };
86 | /* End PBXFrameworksBuildPhase section */
87 |
88 | /* Begin PBXGroup section */
89 | C75652741E7AEDB9005F8C21 /* Dependencies */ = {
90 | isa = PBXGroup;
91 | children = (
92 | C75652751E7AEDB9005F8C21 /* Masonry */,
93 | C756528F1E7AEDB9005F8C21 /* NSDate+TimeAgo */,
94 | C75652921E7AEDB9005F8C21 /* WCSLabel */,
95 | );
96 | name = Dependencies;
97 | path = Libraries/WCSTimeLine/Dependencies;
98 | sourceTree = SOURCE_ROOT;
99 | };
100 | C75652751E7AEDB9005F8C21 /* Masonry */ = {
101 | isa = PBXGroup;
102 | children = (
103 | C75652761E7AEDB9005F8C21 /* MASCompositeConstraint.h */,
104 | C75652771E7AEDB9005F8C21 /* MASCompositeConstraint.m */,
105 | C75652781E7AEDB9005F8C21 /* MASConstraint+Private.h */,
106 | C75652791E7AEDB9005F8C21 /* MASConstraint.h */,
107 | C756527A1E7AEDB9005F8C21 /* MASConstraint.m */,
108 | C756527B1E7AEDB9005F8C21 /* MASConstraintMaker.h */,
109 | C756527C1E7AEDB9005F8C21 /* MASConstraintMaker.m */,
110 | C756527D1E7AEDB9005F8C21 /* MASLayoutConstraint.h */,
111 | C756527E1E7AEDB9005F8C21 /* MASLayoutConstraint.m */,
112 | C756527F1E7AEDB9005F8C21 /* Masonry.h */,
113 | C75652801E7AEDB9005F8C21 /* MASUtilities.h */,
114 | C75652811E7AEDB9005F8C21 /* MASViewAttribute.h */,
115 | C75652821E7AEDB9005F8C21 /* MASViewAttribute.m */,
116 | C75652831E7AEDB9005F8C21 /* MASViewConstraint.h */,
117 | C75652841E7AEDB9005F8C21 /* MASViewConstraint.m */,
118 | C75652851E7AEDB9005F8C21 /* NSArray+MASAdditions.h */,
119 | C75652861E7AEDB9005F8C21 /* NSArray+MASAdditions.m */,
120 | C75652871E7AEDB9005F8C21 /* NSArray+MASShorthandAdditions.h */,
121 | C75652881E7AEDB9005F8C21 /* NSLayoutConstraint+MASDebugAdditions.h */,
122 | C75652891E7AEDB9005F8C21 /* NSLayoutConstraint+MASDebugAdditions.m */,
123 | C756528A1E7AEDB9005F8C21 /* View+MASAdditions.h */,
124 | C756528B1E7AEDB9005F8C21 /* View+MASAdditions.m */,
125 | C756528C1E7AEDB9005F8C21 /* View+MASShorthandAdditions.h */,
126 | C756528D1E7AEDB9005F8C21 /* ViewController+MASAdditions.h */,
127 | C756528E1E7AEDB9005F8C21 /* ViewController+MASAdditions.m */,
128 | );
129 | path = Masonry;
130 | sourceTree = "";
131 | };
132 | C756528F1E7AEDB9005F8C21 /* NSDate+TimeAgo */ = {
133 | isa = PBXGroup;
134 | children = (
135 | C7C6748C1E7B65BB000ED7F1 /* NSDate+TimeAgo.h */,
136 | C7C6748D1E7B65BB000ED7F1 /* NSDate+TimeAgo.m */,
137 | );
138 | path = "NSDate+TimeAgo";
139 | sourceTree = "";
140 | };
141 | C75652921E7AEDB9005F8C21 /* WCSLabel */ = {
142 | isa = PBXGroup;
143 | children = (
144 | C75652931E7AEDB9005F8C21 /* WCSLabel.h */,
145 | C75652941E7AEDB9005F8C21 /* WCSLabel.m */,
146 | );
147 | path = WCSLabel;
148 | sourceTree = "";
149 | };
150 | C76245871E7A415800114716 = {
151 | isa = PBXGroup;
152 | children = (
153 | C76245D91E7A466600114716 /* Info.plist */,
154 | C76245D21E7A466600114716 /* AppDelegate.h */,
155 | C76245D31E7A466600114716 /* AppDelegate.m */,
156 | C76245D71E7A466600114716 /* Main.storyboard */,
157 | C76245D51E7A466600114716 /* LaunchScreen.storyboard */,
158 | C76245921E7A415800114716 /* WCSTimeline */,
159 | C76245D11E7A466600114716 /* Example */,
160 | C76245911E7A415800114716 /* Products */,
161 | );
162 | sourceTree = "";
163 | };
164 | C76245911E7A415800114716 /* Products */ = {
165 | isa = PBXGroup;
166 | children = (
167 | C76245901E7A415800114716 /* WCSTimeline.app */,
168 | );
169 | name = Products;
170 | sourceTree = "";
171 | };
172 | C76245921E7A415800114716 /* WCSTimeline */ = {
173 | isa = PBXGroup;
174 | children = (
175 | C75652741E7AEDB9005F8C21 /* Dependencies */,
176 | C76245E51E7A46D000114716 /* WCSTimelineCell.h */,
177 | C76245E61E7A46D000114716 /* WCSTimelineCell.m */,
178 | C762460C1E7A499400114716 /* WCSTimelineModel.h */,
179 | C762460D1E7A499400114716 /* WCSTimelineModel.m */,
180 | );
181 | path = WCSTimeline;
182 | sourceTree = "";
183 | };
184 | C76245D11E7A466600114716 /* Example */ = {
185 | isa = PBXGroup;
186 | children = (
187 | C76245DB1E7A466600114716 /* ViewController.h */,
188 | C76245DC1E7A466600114716 /* ViewController.m */,
189 | C76245D41E7A466600114716 /* Assets.xcassets */,
190 | C76245E41E7A467800114716 /* Support Files */,
191 | );
192 | path = Example;
193 | sourceTree = "";
194 | };
195 | C76245E41E7A467800114716 /* Support Files */ = {
196 | isa = PBXGroup;
197 | children = (
198 | C76245DA1E7A466600114716 /* main.m */,
199 | );
200 | name = "Support Files";
201 | sourceTree = "";
202 | };
203 | /* End PBXGroup section */
204 |
205 | /* Begin PBXNativeTarget section */
206 | C762458F1E7A415800114716 /* WCSTimeline */ = {
207 | isa = PBXNativeTarget;
208 | buildConfigurationList = C76245A71E7A415800114716 /* Build configuration list for PBXNativeTarget "WCSTimeline" */;
209 | buildPhases = (
210 | C762458C1E7A415800114716 /* Sources */,
211 | C762458D1E7A415800114716 /* Frameworks */,
212 | C762458E1E7A415800114716 /* Resources */,
213 | );
214 | buildRules = (
215 | );
216 | dependencies = (
217 | );
218 | name = WCSTimeline;
219 | productName = WCSTimeline;
220 | productReference = C76245901E7A415800114716 /* WCSTimeline.app */;
221 | productType = "com.apple.product-type.application";
222 | };
223 | /* End PBXNativeTarget section */
224 |
225 | /* Begin PBXProject section */
226 | C76245881E7A415800114716 /* Project object */ = {
227 | isa = PBXProject;
228 | attributes = {
229 | LastUpgradeCheck = 0820;
230 | ORGANIZATIONNAME = "Wrights Creative Services, L.L.C.";
231 | TargetAttributes = {
232 | C762458F1E7A415800114716 = {
233 | CreatedOnToolsVersion = 8.2.1;
234 | DevelopmentTeam = 474YUX6494;
235 | ProvisioningStyle = Automatic;
236 | };
237 | };
238 | };
239 | buildConfigurationList = C762458B1E7A415800114716 /* Build configuration list for PBXProject "WCSTimeline" */;
240 | compatibilityVersion = "Xcode 3.2";
241 | developmentRegion = English;
242 | hasScannedForEncodings = 0;
243 | knownRegions = (
244 | en,
245 | Base,
246 | );
247 | mainGroup = C76245871E7A415800114716;
248 | productRefGroup = C76245911E7A415800114716 /* Products */;
249 | projectDirPath = "";
250 | projectRoot = "";
251 | targets = (
252 | C762458F1E7A415800114716 /* WCSTimeline */,
253 | );
254 | };
255 | /* End PBXProject section */
256 |
257 | /* Begin PBXResourcesBuildPhase section */
258 | C762458E1E7A415800114716 /* Resources */ = {
259 | isa = PBXResourcesBuildPhase;
260 | buildActionMask = 2147483647;
261 | files = (
262 | C76245E01E7A466600114716 /* Main.storyboard in Resources */,
263 | C76245DE1E7A466600114716 /* Assets.xcassets in Resources */,
264 | C76245DF1E7A466600114716 /* LaunchScreen.storyboard in Resources */,
265 | );
266 | runOnlyForDeploymentPostprocessing = 0;
267 | };
268 | /* End PBXResourcesBuildPhase section */
269 |
270 | /* Begin PBXSourcesBuildPhase section */
271 | C762458C1E7A415800114716 /* Sources */ = {
272 | isa = PBXSourcesBuildPhase;
273 | buildActionMask = 2147483647;
274 | files = (
275 | C756529C1E7AEDB9005F8C21 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */,
276 | C76245E71E7A46D000114716 /* WCSTimelineCell.m in Sources */,
277 | C756529A1E7AEDB9005F8C21 /* MASViewConstraint.m in Sources */,
278 | C76245E31E7A466600114716 /* ViewController.m in Sources */,
279 | C762460E1E7A499400114716 /* WCSTimelineModel.m in Sources */,
280 | C76245E21E7A466600114716 /* main.m in Sources */,
281 | C75652A01E7AEDB9005F8C21 /* WCSLabel.m in Sources */,
282 | C756529D1E7AEDB9005F8C21 /* View+MASAdditions.m in Sources */,
283 | C7C6748E1E7B65BB000ED7F1 /* NSDate+TimeAgo.m in Sources */,
284 | C75652951E7AEDB9005F8C21 /* MASCompositeConstraint.m in Sources */,
285 | C75652991E7AEDB9005F8C21 /* MASViewAttribute.m in Sources */,
286 | C75652971E7AEDB9005F8C21 /* MASConstraintMaker.m in Sources */,
287 | C756529B1E7AEDB9005F8C21 /* NSArray+MASAdditions.m in Sources */,
288 | C756529E1E7AEDB9005F8C21 /* ViewController+MASAdditions.m in Sources */,
289 | C75652961E7AEDB9005F8C21 /* MASConstraint.m in Sources */,
290 | C75652981E7AEDB9005F8C21 /* MASLayoutConstraint.m in Sources */,
291 | C76245DD1E7A466600114716 /* AppDelegate.m in Sources */,
292 | );
293 | runOnlyForDeploymentPostprocessing = 0;
294 | };
295 | /* End PBXSourcesBuildPhase section */
296 |
297 | /* Begin PBXVariantGroup section */
298 | C76245D51E7A466600114716 /* LaunchScreen.storyboard */ = {
299 | isa = PBXVariantGroup;
300 | children = (
301 | C76245D61E7A466600114716 /* Base */,
302 | );
303 | name = LaunchScreen.storyboard;
304 | path = Example;
305 | sourceTree = "";
306 | };
307 | C76245D71E7A466600114716 /* Main.storyboard */ = {
308 | isa = PBXVariantGroup;
309 | children = (
310 | C76245D81E7A466600114716 /* Base */,
311 | );
312 | name = Main.storyboard;
313 | path = Example;
314 | sourceTree = "";
315 | };
316 | /* End PBXVariantGroup section */
317 |
318 | /* Begin XCBuildConfiguration section */
319 | C76245A51E7A415800114716 /* Debug */ = {
320 | isa = XCBuildConfiguration;
321 | buildSettings = {
322 | ALWAYS_SEARCH_USER_PATHS = NO;
323 | CLANG_ANALYZER_NONNULL = YES;
324 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
325 | CLANG_CXX_LIBRARY = "libc++";
326 | CLANG_ENABLE_MODULES = YES;
327 | CLANG_ENABLE_OBJC_ARC = YES;
328 | CLANG_WARN_BOOL_CONVERSION = YES;
329 | CLANG_WARN_CONSTANT_CONVERSION = YES;
330 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
331 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
332 | CLANG_WARN_EMPTY_BODY = YES;
333 | CLANG_WARN_ENUM_CONVERSION = YES;
334 | CLANG_WARN_INFINITE_RECURSION = YES;
335 | CLANG_WARN_INT_CONVERSION = YES;
336 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
337 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
338 | CLANG_WARN_UNREACHABLE_CODE = YES;
339 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
340 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
341 | COPY_PHASE_STRIP = NO;
342 | DEBUG_INFORMATION_FORMAT = dwarf;
343 | ENABLE_STRICT_OBJC_MSGSEND = YES;
344 | ENABLE_TESTABILITY = YES;
345 | GCC_C_LANGUAGE_STANDARD = gnu99;
346 | GCC_DYNAMIC_NO_PIC = NO;
347 | GCC_NO_COMMON_BLOCKS = YES;
348 | GCC_OPTIMIZATION_LEVEL = 0;
349 | GCC_PREPROCESSOR_DEFINITIONS = (
350 | "DEBUG=1",
351 | "$(inherited)",
352 | );
353 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
354 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
355 | GCC_WARN_UNDECLARED_SELECTOR = YES;
356 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
357 | GCC_WARN_UNUSED_FUNCTION = YES;
358 | GCC_WARN_UNUSED_VARIABLE = YES;
359 | IPHONEOS_DEPLOYMENT_TARGET = 10.2;
360 | MTL_ENABLE_DEBUG_INFO = YES;
361 | ONLY_ACTIVE_ARCH = YES;
362 | SDKROOT = iphoneos;
363 | TARGETED_DEVICE_FAMILY = "1,2";
364 | };
365 | name = Debug;
366 | };
367 | C76245A61E7A415800114716 /* Release */ = {
368 | isa = XCBuildConfiguration;
369 | buildSettings = {
370 | ALWAYS_SEARCH_USER_PATHS = NO;
371 | CLANG_ANALYZER_NONNULL = YES;
372 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
373 | CLANG_CXX_LIBRARY = "libc++";
374 | CLANG_ENABLE_MODULES = YES;
375 | CLANG_ENABLE_OBJC_ARC = YES;
376 | CLANG_WARN_BOOL_CONVERSION = YES;
377 | CLANG_WARN_CONSTANT_CONVERSION = YES;
378 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
379 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
380 | CLANG_WARN_EMPTY_BODY = YES;
381 | CLANG_WARN_ENUM_CONVERSION = YES;
382 | CLANG_WARN_INFINITE_RECURSION = YES;
383 | CLANG_WARN_INT_CONVERSION = YES;
384 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
385 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
386 | CLANG_WARN_UNREACHABLE_CODE = YES;
387 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
388 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
389 | COPY_PHASE_STRIP = NO;
390 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
391 | ENABLE_NS_ASSERTIONS = NO;
392 | ENABLE_STRICT_OBJC_MSGSEND = YES;
393 | GCC_C_LANGUAGE_STANDARD = gnu99;
394 | GCC_NO_COMMON_BLOCKS = YES;
395 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
396 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
397 | GCC_WARN_UNDECLARED_SELECTOR = YES;
398 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
399 | GCC_WARN_UNUSED_FUNCTION = YES;
400 | GCC_WARN_UNUSED_VARIABLE = YES;
401 | IPHONEOS_DEPLOYMENT_TARGET = 10.2;
402 | MTL_ENABLE_DEBUG_INFO = NO;
403 | SDKROOT = iphoneos;
404 | TARGETED_DEVICE_FAMILY = "1,2";
405 | VALIDATE_PRODUCT = YES;
406 | };
407 | name = Release;
408 | };
409 | C76245A81E7A415800114716 /* Debug */ = {
410 | isa = XCBuildConfiguration;
411 | buildSettings = {
412 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
413 | DEVELOPMENT_TEAM = 474YUX6494;
414 | INFOPLIST_FILE = "$(SRCROOT)/Example/Info.plist";
415 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
416 | PRODUCT_BUNDLE_IDENTIFIER = com.wrightscs.WCSTimeline;
417 | PRODUCT_NAME = "$(TARGET_NAME)";
418 | };
419 | name = Debug;
420 | };
421 | C76245A91E7A415800114716 /* Release */ = {
422 | isa = XCBuildConfiguration;
423 | buildSettings = {
424 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
425 | DEVELOPMENT_TEAM = 474YUX6494;
426 | INFOPLIST_FILE = "$(SRCROOT)/Example/Info.plist";
427 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
428 | PRODUCT_BUNDLE_IDENTIFIER = com.wrightscs.WCSTimeline;
429 | PRODUCT_NAME = "$(TARGET_NAME)";
430 | };
431 | name = Release;
432 | };
433 | /* End XCBuildConfiguration section */
434 |
435 | /* Begin XCConfigurationList section */
436 | C762458B1E7A415800114716 /* Build configuration list for PBXProject "WCSTimeline" */ = {
437 | isa = XCConfigurationList;
438 | buildConfigurations = (
439 | C76245A51E7A415800114716 /* Debug */,
440 | C76245A61E7A415800114716 /* Release */,
441 | );
442 | defaultConfigurationIsVisible = 0;
443 | defaultConfigurationName = Release;
444 | };
445 | C76245A71E7A415800114716 /* Build configuration list for PBXNativeTarget "WCSTimeline" */ = {
446 | isa = XCConfigurationList;
447 | buildConfigurations = (
448 | C76245A81E7A415800114716 /* Debug */,
449 | C76245A91E7A415800114716 /* Release */,
450 | );
451 | defaultConfigurationIsVisible = 0;
452 | defaultConfigurationName = Release;
453 | };
454 | /* End XCConfigurationList section */
455 | };
456 | rootObject = C76245881E7A415800114716 /* Project object */;
457 | }
458 |
--------------------------------------------------------------------------------