Skip to content

Commit a598ee4

Browse files
authored
Merge pull request microsoft#1367 from lyzhan7/lyzhan-shadow-rct-custom-view-property
Fix for shadow opacity getting set to 1 when appearance changes
2 parents 0ef7992 + 27293e8 commit a598ee4

File tree

3 files changed

+56
-11
lines changed

3 files changed

+56
-11
lines changed

React/Views/RCTView.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,12 @@ extern const UIAccessibilityTraits SwitchAccessibilityTrait;
144144
@property (nonatomic, copy) RCTDirectEventBlock onKeyUp;
145145
@property (nonatomic, copy) NSArray<NSString*> *validKeysDown;
146146
@property (nonatomic, copy) NSArray<NSString*> *validKeysUp;
147+
148+
// Shadow Properties
149+
@property (nonatomic, strong) NSColor *shadowColor;
150+
@property (nonatomic, assign) CGFloat shadowOpacity;
151+
@property (nonatomic, assign) CGFloat shadowRadius;
152+
@property (nonatomic, assign) CGSize shadowOffset;
147153
#endif // ]TODO(macOS GH#774)
148154

149155
/**

React/Views/RCTView.m

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ - (instancetype)initWithFrame:(CGRect)frame
165165
_hitTestEdgeInsets = UIEdgeInsetsZero;
166166
#if TARGET_OS_OSX // TODO(macOS GH#774)
167167
_transform3D = CATransform3DIdentity;
168+
_shadowColor = nil;
168169
#endif // TODO(macOS GH#774)
169170

170171
_backgroundColor = super.backgroundColor;
@@ -716,20 +717,49 @@ - (NSString *)description
716717
#endif // TODO(macOS GH#774)
717718

718719
#if TARGET_OS_OSX // [TODO(macOS GH#774)
719-
// Workaround AppKit issue with directly manipulating the view layer's shadow.
720-
- (NSShadow*)shadow
720+
- (void)setShadowColor:(NSColor *)shadowColor
721721
{
722-
CALayer *layer = self.layer;
723-
NSShadow *shadow = nil;
722+
if (_shadowColor != shadowColor)
723+
{
724+
_shadowColor = shadowColor;
725+
[self didUpdateShadow];
726+
}
727+
}
724728

725-
if (layer.shadowColor != nil && layer.shadowOpacity > 0) {
726-
shadow = [NSShadow new];
729+
- (void)setShadowOffset:(CGSize)shadowOffset
730+
{
731+
if (!CGSizeEqualToSize(_shadowOffset, shadowOffset))
732+
{
733+
_shadowOffset = shadowOffset;
734+
[self didUpdateShadow];
735+
}
736+
}
727737

728-
shadow.shadowColor = [[NSColor colorWithCGColor:layer.shadowColor] colorWithAlphaComponent:layer.shadowOpacity];
729-
shadow.shadowOffset = layer.shadowOffset;
730-
shadow.shadowBlurRadius = layer.shadowRadius;
731-
}
732-
return shadow;
738+
- (void)setShadowOpacity:(CGFloat)shadowOpacity
739+
{
740+
if (_shadowOpacity != shadowOpacity)
741+
{
742+
_shadowOpacity = shadowOpacity;
743+
[self didUpdateShadow];
744+
}
745+
}
746+
747+
- (void)setShadowRadius:(CGFloat)shadowRadius
748+
{
749+
if (_shadowRadius != shadowRadius)
750+
{
751+
_shadowRadius = shadowRadius;
752+
[self didUpdateShadow];
753+
}
754+
}
755+
756+
-(void)didUpdateShadow
757+
{
758+
NSShadow *shadow = [NSShadow new];
759+
shadow.shadowColor = [[self shadowColor] colorWithAlphaComponent:[self shadowOpacity]];
760+
shadow.shadowOffset = [self shadowOffset];
761+
shadow.shadowBlurRadius = [self shadowRadius];
762+
[self setShadow:shadow];
733763
}
734764

735765
- (void)viewDidMoveToWindow

React/Views/RCTViewManager.m

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,19 @@ - (RCTShadowView *)shadowView
196196
#else // [TODO(macOS GH#774)
197197
RCT_REMAP_VIEW_PROPERTY(opacity, alphaValue, CGFloat)
198198
#endif // ]TODO(macOS GH#774)
199+
200+
#if TARGET_OS_OSX // TODO(macOS GH#774)
199201
RCT_REMAP_VIEW_PROPERTY(shadowColor, layer.shadowColor, CGColor)
200202
RCT_REMAP_VIEW_PROPERTY(shadowOffset, layer.shadowOffset, CGSize)
201203
RCT_REMAP_VIEW_PROPERTY(shadowOpacity, layer.shadowOpacity, float)
202204
RCT_REMAP_VIEW_PROPERTY(shadowRadius, layer.shadowRadius, CGFloat)
205+
#else // [TODO(macOS GH#774)
206+
RCT_EXPORT_VIEW_PROPERTY(shadowColor, NSColor)
207+
RCT_EXPORT_VIEW_PROPERTY(shadowOffset, CGSize)
208+
RCT_EXPORT_VIEW_PROPERTY(shadowOpacity, CGFloat)
209+
RCT_EXPORT_VIEW_PROPERTY(shadowRadius, CGFloat)
210+
#endif // ]TODO(macOS GH#774)
211+
203212
RCT_REMAP_VIEW_PROPERTY(needsOffscreenAlphaCompositing, layer.allowsGroupOpacity, BOOL)
204213
RCT_CUSTOM_VIEW_PROPERTY(overflow, YGOverflow, RCTView)
205214
{

0 commit comments

Comments
 (0)