mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-24 07:05:35 +00:00
[ASDisplayNode] Placeholders should always be recreated if returning to past nodes.
If previously-displayed contents is gone (e.g. clearContents), and is not finished displaying by the time the node is onscreen, recreate the placeholder immediately.
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
|
||||
@interface _ASImageNodeDrawParameters : NSObject
|
||||
|
||||
@property (nonatomic, retain) UIImage *image;
|
||||
@property (nonatomic, assign) BOOL opaque;
|
||||
@property (nonatomic, assign) CGRect bounds;
|
||||
@property (nonatomic, assign) CGFloat contentsScale;
|
||||
@@ -36,11 +37,17 @@
|
||||
// TODO: eliminate explicit parameters with a set of keys copied from the node
|
||||
@implementation _ASImageNodeDrawParameters
|
||||
|
||||
- (id)initWithBounds:(CGRect)bounds opaque:(BOOL)opaque contentsScale:(CGFloat)contentsScale backgroundColor:(UIColor *)backgroundColor contentMode:(UIViewContentMode)contentMode
|
||||
- (id)initWithImage:(UIImage *)image
|
||||
bounds:(CGRect)bounds
|
||||
opaque:(BOOL)opaque
|
||||
contentsScale:(CGFloat)contentsScale
|
||||
backgroundColor:(UIColor *)backgroundColor
|
||||
contentMode:(UIViewContentMode)contentMode
|
||||
{
|
||||
self = [self init];
|
||||
if (!self) return nil;
|
||||
if (!(self = [self init]))
|
||||
return nil;
|
||||
|
||||
_image = image;
|
||||
_opaque = opaque;
|
||||
_bounds = bounds;
|
||||
_contentsScale = contentsScale;
|
||||
@@ -133,8 +140,13 @@
|
||||
_image = image;
|
||||
|
||||
_imageLock.unlock();
|
||||
|
||||
[self invalidateCalculatedLayout];
|
||||
[self setNeedsDisplay];
|
||||
if (image) {
|
||||
[self setNeedsDisplay];
|
||||
} else {
|
||||
self.contents = nil;
|
||||
}
|
||||
} else {
|
||||
_imageLock.unlock(); // We avoid using MutexUnlocker as it needlessly re-locks at the end of the scope.
|
||||
}
|
||||
@@ -156,11 +168,12 @@
|
||||
|
||||
- (NSObject *)drawParametersForAsyncLayer:(_ASDisplayLayer *)layer
|
||||
{
|
||||
return [[_ASImageNodeDrawParameters alloc] initWithBounds:self.bounds
|
||||
opaque:self.opaque
|
||||
contentsScale:self.contentsScaleForDisplay
|
||||
backgroundColor:self.backgroundColor
|
||||
contentMode:self.contentMode];
|
||||
return [[_ASImageNodeDrawParameters alloc] initWithImage:self.image
|
||||
bounds:self.bounds
|
||||
opaque:self.opaque
|
||||
contentsScale:self.contentsScaleForDisplay
|
||||
backgroundColor:self.backgroundColor
|
||||
contentMode:self.contentMode];
|
||||
}
|
||||
|
||||
- (NSDictionary *)debugLabelAttributes
|
||||
@@ -171,21 +184,26 @@
|
||||
|
||||
- (UIImage *)displayWithParameters:(_ASImageNodeDrawParameters *)parameters isCancelled:(asdisplaynode_iscancelled_block_t)isCancelled
|
||||
{
|
||||
UIImage *image;
|
||||
BOOL cropEnabled;
|
||||
BOOL forceUpscaling;
|
||||
CGFloat contentsScale;
|
||||
CGRect cropDisplayBounds;
|
||||
CGRect cropRect;
|
||||
UIImage *image = parameters.image;
|
||||
if (!image) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
BOOL forceUpscaling = NO;
|
||||
BOOL cropEnabled = NO;
|
||||
BOOL isOpaque = parameters.opaque;
|
||||
UIColor *backgroundColor = parameters.backgroundColor;
|
||||
UIViewContentMode contentMode = parameters.contentMode;
|
||||
CGFloat contentsScale = 0.0;
|
||||
CGRect cropDisplayBounds = CGRectZero;
|
||||
CGRect cropRect = CGRectZero;
|
||||
asimagenode_modification_block_t imageModificationBlock;
|
||||
|
||||
{
|
||||
ASDN::MutexLocker l(_imageLock);
|
||||
image = _image;
|
||||
if (!image) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
// FIXME: There is a small risk of these values changing between the main thread creation of drawParameters, and the execution of this method.
|
||||
// We should package these up into the draw parameters object. Might be easiest to create a struct for the non-objects and make it one property.
|
||||
cropEnabled = _cropEnabled;
|
||||
forceUpscaling = _forceUpscaling;
|
||||
contentsScale = _contentsScaleForDisplay;
|
||||
@@ -194,16 +212,12 @@
|
||||
imageModificationBlock = _imageModificationBlock;
|
||||
}
|
||||
|
||||
BOOL hasValidCropBounds = cropEnabled && !CGRectIsNull(cropDisplayBounds) && !CGRectIsEmpty(cropDisplayBounds);
|
||||
CGRect bounds = (hasValidCropBounds ? cropDisplayBounds : parameters.bounds);
|
||||
|
||||
ASDisplayNodeContextModifier preContextBlock = self.willDisplayNodeContentWithRenderingContext;
|
||||
ASDisplayNodeContextModifier postContextBlock = self.didDisplayNodeContentWithRenderingContext;
|
||||
|
||||
BOOL hasValidCropBounds = cropEnabled && !CGRectIsNull(cropDisplayBounds) && !CGRectIsEmpty(cropDisplayBounds);
|
||||
|
||||
CGRect bounds = (hasValidCropBounds ? cropDisplayBounds : parameters.bounds);
|
||||
BOOL isOpaque = parameters.opaque;
|
||||
UIColor *backgroundColor = parameters.backgroundColor;
|
||||
UIViewContentMode contentMode = parameters.contentMode;
|
||||
|
||||
ASDisplayNodeAssert(contentsScale > 0, @"invalid contentsScale at display time");
|
||||
|
||||
// if the image is resizable, bail early since the image has likely already been configured
|
||||
@@ -232,17 +246,15 @@
|
||||
}
|
||||
}
|
||||
|
||||
BOOL contentModeSupported = contentMode == UIViewContentModeScaleAspectFill
|
||||
|| contentMode == UIViewContentModeScaleAspectFit
|
||||
|| contentMode == UIViewContentModeCenter;
|
||||
BOOL contentModeSupported = contentMode == UIViewContentModeScaleAspectFill ||
|
||||
contentMode == UIViewContentModeScaleAspectFit ||
|
||||
contentMode == UIViewContentModeCenter;
|
||||
|
||||
CGSize backingSize;
|
||||
CGRect imageDrawRect;
|
||||
CGSize backingSize = CGSizeZero;
|
||||
CGRect imageDrawRect = CGRectZero;
|
||||
|
||||
if (boundsSizeInPixels.width * contentsScale < 1.0f ||
|
||||
boundsSizeInPixels.height * contentsScale < 1.0f ||
|
||||
imageSizeInPixels.width < 1.0f ||
|
||||
imageSizeInPixels.height < 1.0f) {
|
||||
if (boundsSizeInPixels.width * contentsScale < 1.0f || boundsSizeInPixels.height * contentsScale < 1.0f ||
|
||||
imageSizeInPixels.width < 1.0f || imageSizeInPixels.height < 1.0f) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
@@ -260,10 +272,8 @@
|
||||
&imageDrawRect);
|
||||
}
|
||||
|
||||
if (backingSize.width <= 0.0f ||
|
||||
backingSize.height <= 0.0f ||
|
||||
imageDrawRect.size.width <= 0.0f ||
|
||||
imageDrawRect.size.height <= 0.0f) {
|
||||
if (backingSize.width <= 0.0f || backingSize.height <= 0.0f ||
|
||||
imageDrawRect.size.width <= 0.0f || imageDrawRect.size.height <= 0.0f) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user