Skip to content

Commit

Permalink
Merge pull request #1367 from lyzhan7/lyzhan-shadow-rct-custom-view-p…
Browse files Browse the repository at this point in the history
…roperty

Fix for shadow opacity getting set to 1 when appearance changes
  • Loading branch information
lyzhan7 committed Aug 22, 2022
2 parents 0ef7992 + 27293e8 commit a598ee4
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 11 deletions.
6 changes: 6 additions & 0 deletions React/Views/RCTView.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,12 @@ extern const UIAccessibilityTraits SwitchAccessibilityTrait;
@property (nonatomic, copy) RCTDirectEventBlock onKeyUp;
@property (nonatomic, copy) NSArray<NSString*> *validKeysDown;
@property (nonatomic, copy) NSArray<NSString*> *validKeysUp;

// Shadow Properties
@property (nonatomic, strong) NSColor *shadowColor;
@property (nonatomic, assign) CGFloat shadowOpacity;
@property (nonatomic, assign) CGFloat shadowRadius;
@property (nonatomic, assign) CGSize shadowOffset;
#endif // ]TODO(macOS GH#774)

/**
Expand Down
52 changes: 41 additions & 11 deletions React/Views/RCTView.m
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ - (instancetype)initWithFrame:(CGRect)frame
_hitTestEdgeInsets = UIEdgeInsetsZero;
#if TARGET_OS_OSX // TODO(macOS GH#774)
_transform3D = CATransform3DIdentity;
_shadowColor = nil;
#endif // TODO(macOS GH#774)

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

#if TARGET_OS_OSX // [TODO(macOS GH#774)
// Workaround AppKit issue with directly manipulating the view layer's shadow.
- (NSShadow*)shadow
- (void)setShadowColor:(NSColor *)shadowColor
{
CALayer *layer = self.layer;
NSShadow *shadow = nil;
if (_shadowColor != shadowColor)
{
_shadowColor = shadowColor;
[self didUpdateShadow];
}
}

if (layer.shadowColor != nil && layer.shadowOpacity > 0) {
shadow = [NSShadow new];
- (void)setShadowOffset:(CGSize)shadowOffset
{
if (!CGSizeEqualToSize(_shadowOffset, shadowOffset))
{
_shadowOffset = shadowOffset;
[self didUpdateShadow];
}
}

shadow.shadowColor = [[NSColor colorWithCGColor:layer.shadowColor] colorWithAlphaComponent:layer.shadowOpacity];
shadow.shadowOffset = layer.shadowOffset;
shadow.shadowBlurRadius = layer.shadowRadius;
}
return shadow;
- (void)setShadowOpacity:(CGFloat)shadowOpacity
{
if (_shadowOpacity != shadowOpacity)
{
_shadowOpacity = shadowOpacity;
[self didUpdateShadow];
}
}

- (void)setShadowRadius:(CGFloat)shadowRadius
{
if (_shadowRadius != shadowRadius)
{
_shadowRadius = shadowRadius;
[self didUpdateShadow];
}
}

-(void)didUpdateShadow
{
NSShadow *shadow = [NSShadow new];
shadow.shadowColor = [[self shadowColor] colorWithAlphaComponent:[self shadowOpacity]];
shadow.shadowOffset = [self shadowOffset];
shadow.shadowBlurRadius = [self shadowRadius];
[self setShadow:shadow];
}

- (void)viewDidMoveToWindow
Expand Down
9 changes: 9 additions & 0 deletions React/Views/RCTViewManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -196,10 +196,19 @@ - (RCTShadowView *)shadowView
#else // [TODO(macOS GH#774)
RCT_REMAP_VIEW_PROPERTY(opacity, alphaValue, CGFloat)
#endif // ]TODO(macOS GH#774)

#if TARGET_OS_OSX // TODO(macOS GH#774)
RCT_REMAP_VIEW_PROPERTY(shadowColor, layer.shadowColor, CGColor)
RCT_REMAP_VIEW_PROPERTY(shadowOffset, layer.shadowOffset, CGSize)
RCT_REMAP_VIEW_PROPERTY(shadowOpacity, layer.shadowOpacity, float)
RCT_REMAP_VIEW_PROPERTY(shadowRadius, layer.shadowRadius, CGFloat)
#else // [TODO(macOS GH#774)
RCT_EXPORT_VIEW_PROPERTY(shadowColor, NSColor)
RCT_EXPORT_VIEW_PROPERTY(shadowOffset, CGSize)
RCT_EXPORT_VIEW_PROPERTY(shadowOpacity, CGFloat)
RCT_EXPORT_VIEW_PROPERTY(shadowRadius, CGFloat)
#endif // ]TODO(macOS GH#774)

RCT_REMAP_VIEW_PROPERTY(needsOffscreenAlphaCompositing, layer.allowsGroupOpacity, BOOL)
RCT_CUSTOM_VIEW_PROPERTY(overflow, YGOverflow, RCTView)
{
Expand Down

0 comments on commit a598ee4

Please sign in to comment.