2011-01-04 13 views
1

folgende WWDC2010 Sitzung 104 Ich habe gerade eine CATiledLayer innerhalb einer UIScrollView für ein 10000 x 8078 px Bild erstellt.CATiledLayer bekommt einen falschen Rahmen & KontextCTM.a Wert (ZoomScale)

Ich bin beunruhigt mit dem Rahmen & zoomScale, wenn die Ansicht zeigt zunächst an seiner oberen Ebene ist

  1. wie in der Sitzung 104 I definiert levelsOfDetail als 4
  2. in meinem drawRect nenne ich CGFloat lScale = CGContextGetCTM(lContext).a;

Merkwürdig zur Laufzeit lScale ist 0,124907158, nicht 0,125 wie erwartet zugeordnet.

Neben der rect zu drawRect passiert hat floatpoint Werte wie

  • rect.origin.x = 4099,04443
  • rect.origin.y = 6144
  • rect.size.width = 2049,52222
  • rect.size.height = 2048

für mich die meisten irritierend ist, dass der Rahmen des 012.393.zeigt einen Ursprung 0 x 26.93, obwohl ich das tiledImageView mit initWithFrame unter Verwendung eines 0x0-Ursprungs erstellte.

Irgendwelche Ideen, wo ich die Berechnung finden kann, die dafür verantwortlich ist?


EDIT: I die Quelle für die wierd Rahmenposition gefunden wird, die die Scroll Grenzen falsch bei 450 Pixel eingestellt wird, ist. das sollte 420 px sein. Die Routine layoutSubview in UIScrollView verfügt über eine Routine für die zentrale Ansicht, die versehentlich die y-Koordinate angepasst hat.

Antwort

1

Ich fand ein Heilmittel dafür.

Die WWDC 2010 Sitzung 104 Beispiel verfügt über zwei UIScrollView Methoden, die das Ansichtsverhalten steuern.

Die erste ist configureForImageSize, dass ich in meiner zuvor geposteten Antwort erwähnt, wo die Zoomskalen gesetzt sind.

Aufgrund der beschriebenen Float-Point-Differenz werden die imageView-Grenzen mit den zuvor markierten Dezimalstellen generiert (siehe wx/hx oder wy/hy).

Um dies zu erhalten aufzuräumen ich die Überschreibung von layoutSubviews verwendet, in denen ich die Ansicht Rahmen berechnen:

- (void) layoutSubviews { 
    [super layoutSubviews]; 

    CGSize lBoundsSize = self.bounds.size; 
    CGRect lFrameToCenter = imageView.frame; 

    // cure to the decimals problem 
    lFrameToCenter.size.width = roundf(lFrameToCenter.size.width); 
    lFrameToCenter.size.height = roundf(lFrameToCenter.size.height); 

    if (lFrameToCenter.size.width < lBoundsSize.width) 
     lFrameToCenter.origin.x = (lBoundsSize.width - lFrameToCenter.size.width)/2; 
    else 
     lFrameToCenter.origin.x = 0; 

    if (lFrameToCenter.size.height < lBoundsSize.height) 
     lFrameToCenter.origin.y = (lBoundsSize.height - lFrameToCenter.size.height)/2; 
    else 
     lFrameToCenter.origin.y = 0; 

    imageView.frame = lFrameToCenter; 

    if ([imageView isKindOfClass:[tileView class]]) { 
     imageView.contentScaleFactor = 1.0; 
    } 
} 

Bitte beachte, dass ich die Rahmengröße abzurunden, bevor irgendetwas anderes damit zu tun!

+0

Sie haben gerade das Problem behoben, mit dem ich seit Stunden zu kämpfen habe. :-) Ich hatte einen CATiledLayer, der perfekt funktionierte, aber als ich versuchte, seine Position (Frame) zu ändern, änderten sich die Skalenwerte plötzlich von zB. 0,5 bis 0,49756. Ich habe deine Lösung ausprobiert und die Breite und Höhe des CATiledLayers abgerundet und jetzt funktioniert es! Danke, dass du die Lösung, die du gefunden hast, geteilt hast. :-) –

+0

Okay gut, es hat das Problem behoben, aber es hat ein anderes eingeführt. Wenn Sie gut in UIScrollView zoomen, sehen Sie, dass die Größe der CATiledLayer in Relation zur UIScrollView falsch ist. Sie können es sehen, weil die rechte und untere Kante schwarz wird, da die CATiledLayer die UIScrollView nicht vollständig ausfüllt und Sie dann die Hintergrundfarbe von UIScrollView sehen können. Das könnte in einigen Fällen in Ordnung sein, aber leider nicht in meinem. Ich muss etwas anderes versuchen, vielleicht die Skala selbst runden. –

0

Ich habe ein wenig weiter in meiner Bug-Analyse.

eine mImageSize von 10000x8078 und 320x450 Bounds im UIScrollView verwendet ich die configureForImageSize Berechnungen aus der Sitzung 104 Beispiel wie folgt:

- (void) configureForImageSize:(CGSize)mImageSize { 
    CGSize lBoundsSize = [self bounds].size; 

    // set up our content size and min/max zoomscale 
    CGFloat lXScale = lBoundsSize.width/mImageSize.width; // the scale needed to perfectly fit the image width-wise 
    CGFloat lYScale = lBoundsSize.height/mImageSize.height; // the scale needed to perfectly fit the image height-wise 

    // debug values 
    float wx = mImageSize.width * lXScale; 
    float wy = mImageSize.width * lYScale; 
    float hx = mImageSize.height * lXScale; 
    float hy = mImageSize.height * lYScale; 

    ... 
} 

Der Debugger folgende Werte zeigt:

* mImageSize = width 10000 height 8078 
* bounds size: width 320 height 450 
* lXScale = 0.0396137647 
* lYScale = 0.0450000018 
* wx = 320 
* wy = 363.51001 
* hx = 396.137634 
* hy = 450.000031 

so Ich nehme an, dass die Bildgröße in Bezug auf die Grenzen zu einer Floatpoint-Berechnungsdifferenz führt. Wenn die CATiledLayer generiert wird, sind die Grenzen immer Floatpoint-Werte.

Wenn das die Ursache ist, wie kann ich einen mathematischen Ausweg daraus bekommen, ohne das Bild neu skalieren zu müssen (hässlicher Gedanke) ???

+0

Auch nach dem Runden der Breite und Höhe zu runden Zahlen, bekomme ich immer noch eine seltsame Skala von etwa 0,249991, was dazu führt, dass die App die passenden Kacheln nicht findet. Wie behebe ich das? – Matthew