Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modernize BVLinearGradientLayer to use UIGraphicsImageRenderer if on supported OS versions #626

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
31 changes: 24 additions & 7 deletions ios/BVLinearGradientLayer.m
Expand Up @@ -60,15 +60,32 @@ - (void)display {
hasAlpha = hasAlpha || CGColorGetAlpha(self.colors[i].CGColor) < 1.0;
}

UIGraphicsBeginImageContextWithOptions(self.bounds.size, !hasAlpha, 0.0);
CGContextRef ref = UIGraphicsGetCurrentContext();
[self drawInContext:ref];
if (@available(iOS 10.0, *)) {
UIGraphicsImageRendererFormat *format;
if (@available(iOS 11.0, *)) {
format = [UIGraphicsImageRendererFormat preferredFormat];
} else {
format = [UIGraphicsImageRendererFormat defaultFormat];
}
format.opaque = !hasAlpha;
Copy link
Contributor Author

@Caiopia Caiopia Aug 9, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Previously the opaque field wasn't being set for the iOS 10+ flow. I think by default, the format is defaultFormat if no format passed in, which has a default opaque value of false.

Looking at the docs, defaultFormat seems like a decent option, but it points to preferredFormat for immediate rendering so I think that one should be the main choice. Though it's only available in iOS 11+ so that available check needs to be done again 😅.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good, thanks for the explanation!

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we publish a new version prior to 3.0.0 with this change ? .. iOS17 is around the corner

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@iit2008047 - Sure thing! It looks like the patch applies cleanly to the 2.8 branch. I'll cherry-pick it shortly and release the next 2.8 patch version (it will be 2.8.3).

UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:self.bounds.size format:format];
UIImage *image = [renderer imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull ref) {
[self drawInContext:ref.CGContext];
}];

self.contents = (__bridge id _Nullable)(image.CGImage);
self.contentsScale = image.scale;
} else {
UIGraphicsBeginImageContextWithOptions(self.bounds.size, !hasAlpha, 0.0);
CGContextRef ref = UIGraphicsGetCurrentContext();
[self drawInContext:ref];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
self.contents = (__bridge id _Nullable)(image.CGImage);
self.contentsScale = image.scale;
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
self.contents = (__bridge id _Nullable)(image.CGImage);
self.contentsScale = image.scale;

UIGraphicsEndImageContext();
UIGraphicsEndImageContext();
}
}

- (void)setUseAngle:(BOOL)useAngle
Expand Down