|
11 | 11 | #import "ASDimension.h" |
12 | 12 | #import "ASDisplayNode+FrameworkPrivate.h" |
13 | 13 | #import "ASDisplayNode+Beta.h" |
| 14 | +#import "ASEnvironmentInternal.h" |
14 | 15 | #import "ASRangeControllerUpdateRangeProtocol+Beta.h" |
15 | 16 |
|
16 | 17 | @implementation ASViewController |
@@ -42,10 +43,18 @@ - (instancetype)initWithNode:(ASDisplayNode *)node |
42 | 43 | _node = node; |
43 | 44 |
|
44 | 45 | _automaticallyAdjustRangeModeBasedOnViewEvents = NO; |
45 | | - |
| 46 | + |
46 | 47 | return self; |
47 | 48 | } |
48 | 49 |
|
| 50 | +- (void)dealloc |
| 51 | +{ |
| 52 | + if (_displayTraitsContext != nil) { |
| 53 | + ASDisplayTraitsClearDisplayContext(self.node); |
| 54 | + _displayTraitsContext = nil; |
| 55 | + } |
| 56 | +} |
| 57 | + |
49 | 58 | - (void)loadView |
50 | 59 | { |
51 | 60 | ASDisplayNodeAssertTrue(!_node.layerBacked); |
@@ -132,4 +141,66 @@ - (ASInterfaceState)interfaceState |
132 | 141 | return _node.interfaceState; |
133 | 142 | } |
134 | 143 |
|
| 144 | +#pragma mark - ASDisplayTraits |
| 145 | + |
| 146 | +- (ASDisplayTraits)displayTraitsForTraitCollection:(UITraitCollection *)traitCollection |
| 147 | +{ |
| 148 | + if (self.overrideDisplayTraitsWithTraitCollection) { |
| 149 | + return self.overrideDisplayTraitsWithTraitCollection(traitCollection); |
| 150 | + } |
| 151 | + |
| 152 | + ASDisplayTraits displayTraits = ASDisplayTraitsFromUITraitCollection(traitCollection); |
| 153 | + displayTraits.displayContext = _displayTraitsContext; |
| 154 | + return displayTraits; |
| 155 | +} |
| 156 | + |
| 157 | +- (ASDisplayTraits)displayTraitsForWindowSize:(CGSize)windowSize |
| 158 | +{ |
| 159 | + if (self.overrideDisplayTraitsWithWindowSize) { |
| 160 | + return self.overrideDisplayTraitsWithWindowSize(windowSize); |
| 161 | + } |
| 162 | + return self.node.environmentState.displayTraits; |
| 163 | +} |
| 164 | + |
| 165 | +- (void)progagateNewDisplayTraits:(ASDisplayTraits)displayTraits |
| 166 | +{ |
| 167 | + ASEnvironmentState environmentState = self.node.environmentState; |
| 168 | + ASDisplayTraits oldDisplayTraits = environmentState.displayTraits; |
| 169 | + |
| 170 | + if (ASDisplayTraitsIsEqualToASDisplayTraits(displayTraits, oldDisplayTraits) == NO) { |
| 171 | + environmentState.displayTraits = displayTraits; |
| 172 | + [self.node setEnvironmentState:environmentState]; |
| 173 | + [self.node setNeedsLayout]; |
| 174 | + |
| 175 | + NSArray<id<ASEnvironment>> *children = [self.node children]; |
| 176 | + for (id<ASEnvironment> child in children) { |
| 177 | + ASEnvironmentStatePropagateDown(child, environmentState.displayTraits); |
| 178 | + } |
| 179 | + } |
| 180 | +} |
| 181 | + |
| 182 | +- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection |
| 183 | +{ |
| 184 | + [super traitCollectionDidChange:previousTraitCollection]; |
| 185 | + |
| 186 | + ASDisplayTraits displayTraits = [self displayTraitsForTraitCollection:self.traitCollection]; |
| 187 | + [self progagateNewDisplayTraits:displayTraits]; |
| 188 | +} |
| 189 | + |
| 190 | +- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator |
| 191 | +{ |
| 192 | + [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator]; |
| 193 | + |
| 194 | + ASDisplayTraits displayTraits = [self displayTraitsForTraitCollection:self.traitCollection]; |
| 195 | + [self progagateNewDisplayTraits:displayTraits]; |
| 196 | +} |
| 197 | + |
| 198 | +- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator |
| 199 | +{ |
| 200 | + [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; |
| 201 | + |
| 202 | + ASDisplayTraits displayTraits = [self displayTraitsForWindowSize:size]; |
| 203 | + [self progagateNewDisplayTraits:displayTraits]; |
| 204 | +} |
| 205 | + |
135 | 206 | @end |
0 commit comments