Trying to debug a problem on a C# application, I stumbled upond this problem which is the cause of the app malfunctioning.
Basically I have this code:
double scale = 1;
double startScale = 1;
...
scale = (e.Scale - 1) * startScale;
if(scale <= 1)
scale = 1;
...
What happens is that even if scale
is greater than 1 the excecution enters inside the if the scale
ends up being Always 1.
This happens only in release build.
Does anyone have an idea of what's going on?
EDIT
This is the, almost (missing only the ctor which does nothing, of a custom control for Xamarin Forms, taken from their example to implement a pinch gesture (here).
public class PinchView : ContentView
{
private double StartScale = 1;
private double CurrentScale = 1;
private double XOffset = 0;
private double YOffset = 0;
...
private void PinchGesture_PinchUpdated(object sender, PinchGestureUpdatedEventArgs e)
{
if (e.Status == GestureStatus.Started)
{
// Store the current scale factor applied to the wrapped user interface element,
// and zero the components for the center point of the translate transform.
StartScale = Content.Scale;
Content.AnchorX = 0;
Content.AnchorY = 0;
}
if (e.Status == GestureStatus.Running)
{
// Calculate the scale factor to be applied.
CurrentScale += (e.Scale - 1) * StartScale;
if(CurrentScale <= 1)
{
CurrentScale = 1;
}
// The ScaleOrigin is in relative coordinates to the wrapped user interface element,
// so get the X pixel coordinate.
double renderedX = Content.X + XOffset;
double deltaX = renderedX / Width;
double deltaWidth = Width / (Content.Width * StartScale);
double originX = (e.ScaleOrigin.X - deltaX) * deltaWidth;
// The ScaleOrigin is in relative coordinates to the wrapped user interface element,
// so get the Y pixel coordinate.
double renderedY = Content.Y + YOffset;
double deltaY = renderedY / Height;
double deltaHeight = Height / (Content.Height * StartScale);
double originY = (e.ScaleOrigin.Y - deltaY) * deltaHeight;
// Calculate the transformed element pixel coordinates.
double targetX = XOffset - (originX * Content.Width) * (CurrentScale - StartScale);
double targetY = YOffset - (originY * Content.Height) * (CurrentScale - StartScale);
// Apply translation based on the change in origin.
Content.TranslationX = targetX.Clamp(-Content.Width * (CurrentScale - 1), 0);
Content.TranslationY = targetY.Clamp(-Content.Height * (CurrentScale - 1), 0);
// Apply scale factor.
Content.Scale = CurrentScale;
}
if (e.Status == GestureStatus.Completed)
{
// Store the translation delta's of the wrapped user interface element.
XOffset = Content.TranslationX;
YOffset = Content.TranslationY;
}
}
}
These are steps of my debug session (e.Scale
has been optimized and isn't visible, but you can see the value of CurrentScale
changing):
scale
is greater than one? Where doese.Scale
come from? – Petigny<=
in the condition to<
. No point of assigning 1 to a variable that's already equal to 1. – Sophiif (scale <= 1.00001)
- but whether this is the right thing to do really depends on context. – Joshif (CurrentScale<=1.0)
for example? – PetignyCurrentScale
andCurrentScale < 1
to check for sure what is going on there... – Microclineasync
and I noticed that it started working. Then I removed the calls to the log method I made because I thought that maybe something wasnit getting optimized, but it turned out that only by making the callback anasync
method the problem is solved. Don't know why... – Agogue