Skip to content

Commit a3136b0

Browse files
ypogribnyinguyenhuy
authored andcommitted
[ASTraitCollection] Add missing properties to ASTraitCollection (TextureGroup#625)
* [ASTraitCollection] Add missing properties to ASTraitCollection * ASTraitCollection now completely reflects UITraitCollection * Add ASContentSizeCategory enum that corresponds to UIContentSizeCategory and can be used inside a struct. * * Remove enum ASContentSizeCategory. * Use __unsafe_unretained UIContentSizeCategory instead of the enum. * Added ASPrimitiveTraitCollection lifetime test * Changes requested at code review: * Restore one of the ASTraitCollection constructors with a deprecation notice. * Clean up API by the separation of tvOS-specific interfaces. * Use [NSString -isEqualToString:] for ASPrimitiveContentSizeCategory equality tests for better readability. * Encapsulate fallback logic for UIContentSizeCategoryUnspecified. * Fix failing test
1 parent 193be32 commit a3136b0

File tree

6 files changed

+477
-65
lines changed

6 files changed

+477
-65
lines changed

AsyncDisplayKit.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
3917EBD41E9C2FC400D04A01 /* _ASCollectionReusableView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3917EBD21E9C2FC400D04A01 /* _ASCollectionReusableView.h */; settings = {ATTRIBUTES = (Private, ); }; };
100100
3917EBD51E9C2FC400D04A01 /* _ASCollectionReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3917EBD31E9C2FC400D04A01 /* _ASCollectionReusableView.m */; };
101101
3C9C128519E616EF00E942A0 /* ASTableViewTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3C9C128419E616EF00E942A0 /* ASTableViewTests.mm */; };
102+
4496D0731FA9EA6B001CC8D5 /* ASTraitCollectionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4496D0721FA9EA6B001CC8D5 /* ASTraitCollectionTests.m */; };
102103
4E9127691F64157600499623 /* ASRunLoopQueueTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E9127681F64157600499623 /* ASRunLoopQueueTests.m */; };
103104
509E68601B3AED8E009B9150 /* ASScrollDirection.m in Sources */ = {isa = PBXBuildFile; fileRef = 205F0E111B371BD7007741D0 /* ASScrollDirection.m */; };
104105
509E68611B3AEDA0009B9150 /* ASAbstractLayoutController.h in Headers */ = {isa = PBXBuildFile; fileRef = 205F0E171B37339C007741D0 /* ASAbstractLayoutController.h */; };
@@ -634,6 +635,7 @@
634635
3917EBD21E9C2FC400D04A01 /* _ASCollectionReusableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _ASCollectionReusableView.h; sourceTree = "<group>"; };
635636
3917EBD31E9C2FC400D04A01 /* _ASCollectionReusableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _ASCollectionReusableView.m; sourceTree = "<group>"; };
636637
3C9C128419E616EF00E942A0 /* ASTableViewTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = ASTableViewTests.mm; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
638+
4496D0721FA9EA6B001CC8D5 /* ASTraitCollectionTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASTraitCollectionTests.m; sourceTree = "<group>"; };
637639
464052191A3F83C40061C0BA /* ASDataController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = ASDataController.h; sourceTree = "<group>"; };
638640
4640521A1A3F83C40061C0BA /* ASDataController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = ASDataController.mm; sourceTree = "<group>"; };
639641
4640521B1A3F83C40061C0BA /* ASTableLayoutController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASTableLayoutController.h; sourceTree = "<group>"; };
@@ -1256,6 +1258,7 @@
12561258
695BE2541DC1245C008E6EA5 /* ASWrapperSpecSnapshotTests.mm */,
12571259
699B83501E3C1BA500433FA4 /* ASLayoutSpecTests.m */,
12581260
4E9127681F64157600499623 /* ASRunLoopQueueTests.m */,
1261+
4496D0721FA9EA6B001CC8D5 /* ASTraitCollectionTests.m */,
12591262
);
12601263
path = Tests;
12611264
sourceTree = "<group>";
@@ -2163,6 +2166,7 @@
21632166
buildActionMask = 2147483647;
21642167
files = (
21652168
E51B78BF1F028ABF00E32604 /* ASLayoutFlatteningTests.m in Sources */,
2169+
4496D0731FA9EA6B001CC8D5 /* ASTraitCollectionTests.m in Sources */,
21662170
29CDC2E21AAE70D000833CA4 /* ASBasicImageDownloaderContextTests.m in Sources */,
21672171
CC583AD71EF9BDC100134156 /* NSInvocation+ASTestHelpers.m in Sources */,
21682172
CC051F1F1D7A286A006434CB /* ASCALayerTests.m in Sources */,

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
## master
22
* Add your own contributions to the next release on the line below this with your name.
3+
- [ASTraitCollection] Add new properties of UITraitCollection to ASTraitCollection. [Yevgen Pogribnyi](https://github.com/ypogribnyi)
34
- [ASRectMap] Replace implementation of ASRectTable with a simpler one based on unordered_map.[Scott Goodson](https://github.com/appleguy) [#719](https://github.com/TextureGroup/Texture/pull/719)
45
- [ASCollectionView] Add missing flags for ASCollectionDelegate [Ilya Zheleznikov](https://github.com/ilyailya) [#718](https://github.com/TextureGroup/Texture/pull/718)
56
- [ASNetworkImageNode] Deprecates .URLs in favor of .URL [Garrett Moon](https://github.com/garrettmoon) [#699](https://github.com/TextureGroup/Texture/pull/699)

Source/Details/ASTraitCollection.h

Lines changed: 87 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818

1919
#import <UIKit/UIKit.h>
20+
2021
#import <AsyncDisplayKit/ASBaseDefines.h>
2122

2223
@class ASTraitCollection;
@@ -27,14 +28,51 @@ NS_ASSUME_NONNULL_BEGIN
2728

2829
ASDISPLAYNODE_EXTERN_C_BEGIN
2930

31+
#pragma mark - ASPrimitiveContentSizeCategory
32+
33+
/**
34+
* ASPrimitiveContentSizeCategory is a UIContentSizeCategory that can be used inside a struct.
35+
*
36+
* We need an unretained pointer because ARC can't manage struct memory.
37+
*
38+
* WARNING: DO NOT cast UIContentSizeCategory values to ASPrimitiveContentSizeCategory directly.
39+
* Use ASPrimitiveContentSizeCategoryMake(UIContentSizeCategory) instead.
40+
* This is because we make some assumptions about the lifetime of the object it points to.
41+
* Also note that cast from ASPrimitiveContentSizeCategory to UIContentSizeCategory is always safe.
42+
*/
43+
typedef __unsafe_unretained UIContentSizeCategory ASPrimitiveContentSizeCategory;
44+
45+
/**
46+
* Safely casts from UIContentSizeCategory to ASPrimitiveContentSizeCategory.
47+
*
48+
* The UIKit documentation doesn't specify if we can receive a copy of the UIContentSizeCategory constant. While getting
49+
* copies is fine with ARC, usage of unretained pointers requires us to ensure the lifetime of the object it points to.
50+
* Manual retain&release of the UIContentSizeCategory object is not an option because it would require us to do that
51+
* everywhere ASPrimitiveTraitCollection is used. This is error-prone and can lead to crashes and memory leaks. So, we
52+
* explicitly limit possible values of ASPrimitiveContentSizeCategory to the predetermined set of global constants with
53+
* known lifetime.
54+
*
55+
* @return a pointer to one of the UIContentSizeCategory constants.
56+
*/
57+
extern ASPrimitiveContentSizeCategory ASPrimitiveContentSizeCategoryMake(UIContentSizeCategory sizeCategory);
58+
3059
#pragma mark - ASPrimitiveTraitCollection
3160

3261
typedef struct ASPrimitiveTraitCollection {
33-
CGFloat displayScale;
3462
UIUserInterfaceSizeClass horizontalSizeClass;
35-
UIUserInterfaceIdiom userInterfaceIdiom;
3663
UIUserInterfaceSizeClass verticalSizeClass;
64+
65+
CGFloat displayScale;
66+
UIDisplayGamut displayGamut;
67+
68+
UIUserInterfaceIdiom userInterfaceIdiom;
3769
UIForceTouchCapability forceTouchCapability;
70+
UITraitEnvironmentLayoutDirection layoutDirection;
71+
#if TARGET_OS_TV
72+
UIUserInterfaceStyle userInterfaceStyle;
73+
#endif
74+
75+
ASPrimitiveContentSizeCategory preferredContentSizeCategory;
3876

3977
CGSize containerSize;
4078
} ASPrimitiveTraitCollection;
@@ -124,29 +162,69 @@ ASDISPLAYNODE_EXTERN_C_END
124162
AS_SUBCLASSING_RESTRICTED
125163
@interface ASTraitCollection : NSObject
126164

127-
@property (nonatomic, assign, readonly) CGFloat displayScale;
128165
@property (nonatomic, assign, readonly) UIUserInterfaceSizeClass horizontalSizeClass;
129-
@property (nonatomic, assign, readonly) UIUserInterfaceIdiom userInterfaceIdiom;
130166
@property (nonatomic, assign, readonly) UIUserInterfaceSizeClass verticalSizeClass;
167+
168+
@property (nonatomic, assign, readonly) CGFloat displayScale;
169+
@property (nonatomic, assign, readonly) UIDisplayGamut displayGamut;
170+
171+
@property (nonatomic, assign, readonly) UIUserInterfaceIdiom userInterfaceIdiom;
131172
@property (nonatomic, assign, readonly) UIForceTouchCapability forceTouchCapability;
173+
@property (nonatomic, assign, readonly) UITraitEnvironmentLayoutDirection layoutDirection;
174+
#if TARGET_OS_TV
175+
@property (nonatomic, assign, readonly) UIUserInterfaceStyle userInterfaceStyle;
176+
#endif
177+
178+
@property (nonatomic, assign, readonly) UIContentSizeCategory preferredContentSizeCategory;
179+
132180
@property (nonatomic, assign, readonly) CGSize containerSize;
133181

134182
+ (ASTraitCollection *)traitCollectionWithASPrimitiveTraitCollection:(ASPrimitiveTraitCollection)traits;
135183

136184
+ (ASTraitCollection *)traitCollectionWithUITraitCollection:(UITraitCollection *)traitCollection
137185
containerSize:(CGSize)windowSize;
138186

187+
+ (ASTraitCollection *)traitCollectionWithUITraitCollection:(UITraitCollection *)traitCollection
188+
containerSize:(CGSize)windowSize
189+
fallbackContentSizeCategory:(UIContentSizeCategory)fallbackContentSizeCategory;
190+
191+
#if TARGET_OS_TV
192+
+ (ASTraitCollection *)traitCollectionWithHorizontalSizeClass:(UIUserInterfaceSizeClass)horizontalSizeClass
193+
verticalSizeClass:(UIUserInterfaceSizeClass)verticalSizeClass
194+
displayScale:(CGFloat)displayScale
195+
displayGamut:(UIDisplayGamut)displayGamut
196+
userInterfaceIdiom:(UIUserInterfaceIdiom)userInterfaceIdiom
197+
forceTouchCapability:(UIForceTouchCapability)forceTouchCapability
198+
layoutDirection:(UITraitEnvironmentLayoutDirection)layoutDirection
199+
userInterfaceStyle:(UIUserInterfaceStyle)userInterfaceStyle
200+
preferredContentSizeCategory:(UIContentSizeCategory)preferredContentSizeCategory
201+
containerSize:(CGSize)windowSize;
202+
#else
203+
+ (ASTraitCollection *)traitCollectionWithHorizontalSizeClass:(UIUserInterfaceSizeClass)horizontalSizeClass
204+
verticalSizeClass:(UIUserInterfaceSizeClass)verticalSizeClass
205+
displayScale:(CGFloat)displayScale
206+
displayGamut:(UIDisplayGamut)displayGamut
207+
userInterfaceIdiom:(UIUserInterfaceIdiom)userInterfaceIdiom
208+
forceTouchCapability:(UIForceTouchCapability)forceTouchCapability
209+
layoutDirection:(UITraitEnvironmentLayoutDirection)layoutDirection
210+
preferredContentSizeCategory:(UIContentSizeCategory)preferredContentSizeCategory
211+
containerSize:(CGSize)windowSize;
212+
#endif
213+
214+
- (ASPrimitiveTraitCollection)primitiveTraitCollection;
215+
- (BOOL)isEqualToTraitCollection:(ASTraitCollection *)traitCollection;
216+
217+
@end
218+
219+
@interface ASTraitCollection (Deprecated)
139220

140221
+ (ASTraitCollection *)traitCollectionWithDisplayScale:(CGFloat)displayScale
141222
userInterfaceIdiom:(UIUserInterfaceIdiom)userInterfaceIdiom
142223
horizontalSizeClass:(UIUserInterfaceSizeClass)horizontalSizeClass
143224
verticalSizeClass:(UIUserInterfaceSizeClass)verticalSizeClass
144225
forceTouchCapability:(UIForceTouchCapability)forceTouchCapability
145-
containerSize:(CGSize)windowSize;
146-
147-
148-
- (ASPrimitiveTraitCollection)primitiveTraitCollection;
149-
- (BOOL)isEqualToTraitCollection:(ASTraitCollection *)traitCollection;
226+
containerSize:(CGSize)windowSize
227+
ASDISPLAYNODE_DEPRECATED_MSG("Use full version of this method instead.");
150228

151229
@end
152230

0 commit comments

Comments
 (0)