| 

.NET C# Java Javascript Exception

4
Servus beisammen.

Folgendes Problem:
Ich möchte eine Methode schreiben, mit der ich einen UIView in der Mitte zusammenfalten kann.
Dabei soll eine Seite fix bleiben und die andere Seite auf ihn draufklappen.
Welche Seite wohin klappt wird als Parameter übergeben. Genauso wie der View der gefaltet werden soll.

Die einzelnen Schritte sind mir an sich klar.

  • Ich mach nen Screenshot von dem View
  • teile den in 2 Teile
  • packe das als Contents in 2 CALayer mit entsprechend halber Größe vom View
  • Packe die 2 Layer auf nen Hintergrundlayer, der eigentlich nur weißen Hintergrund liefern soll und das eigentliche Bild im View überdecken soll.
  • Packe den Hintergrundlayer auf den View.
  • Lege die Transformation fest
  • Starte die Animation.

Theoretisch sollte das dann funktionieren.
Tut es aber leider nicht.

Hier der Sourcecode zu der Methode.

-(void)foldView:(UIView *) view withDuration: (NSTimeInterval) duration toSide: (NSString*) side withReverse: (bool) reverse andRepeatCount:(float) repeatCount
{
//create Screenshot from view to fold
UIGraphicsBeginImageContext(view.bounds.size);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *img_view = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

//Bildausschnitte festlegen
CGRect rect_closingImageHalf = view.bounds;
CGRect rect_fixedImageHalf = view.bounds;

CGPoint pt_anchorOpeningImageHalf;
CGPoint pt_anchorFixedImageHalf;

CATransform3D transform;

CALayer *lay_closingImageHalf;
CALayer *lay_fixedImageHalf;
lay_fixedImageHalf.masksToBounds = YES;
lay_closingImageHalf.masksToBounds = YES;
//get white backside of layer which folds
lay_closingImageHalf.doubleSided = NO;


//white backgroundlayer to hide the layer of the image
CALayer *backgroundAnimationLayer = [CALayer layer];
backgroundAnimationLayer.frame = view.frame;
backgroundAnimationLayer.backgroundColor = [[UIColor whiteColor] CGColor];

//determine direction in which to fold
if ([side isEqualToString:k_side_vonLinks])
{
rect_closingImageHalf = CGRectMake(0, 0, img_view.size.width / 2, img_view.size.height);
rect_fixedImageHalf = CGRectMake(img_view.size.width / 2, 0, img_view.size.width / 2, img_view.size.height);

pt_anchorOpeningImageHalf = CGPointMake(1.0, 0.5);
pt_anchorFixedImageHalf = CGPointMake(0.5, 0.5);

transform = CATransform3DMakeRotation(M_PI, 0, 1.0, 0);
}
else if([side isEqualToString:k_side_vonRechts])
{
rect_closingImageHalf = CGRectMake(img_view.size.width / 2, 0, img_view.size.width / 2, img_view.size.height);
rect_fixedImageHalf = CGRectMake(0, 0, img_view.size.width / 2, img_view.size.height);

pt_anchorOpeningImageHalf = CGPointMake(0.0, 0.5);
pt_anchorFixedImageHalf = CGPointMake(0.5, 0.5);

transform = CATransform3DMakeRotation(M_PI, 0, 1.0, 0);
}
else if([side isEqualToString:k_side_vonOben])
{
rect_closingImageHalf = CGRectMake(0, 0, img_view.size.width, img_view.size.height / 2);
rect_fixedImageHalf = CGRectMake(0, img_view.size.height / 2, img_view.size.width, img_view.size.height / 2);

pt_anchorOpeningImageHalf = CGPointMake(0.5, 1.0);
pt_anchorFixedImageHalf = CGPointMake(0.5, 0.5);

transform = CATransform3DMakeRotation(M_PI, 1.0, 0, 0);
}
else if([side isEqualToString:k_side_vonUnten])
{
rect_closingImageHalf = CGRectMake(0, img_view.size.height / 2, img_view.size.width, img_view.size.height / 2);
rect_fixedImageHalf = CGRectMake(0, 0, img_view.size.width, img_view.size.height / 2);

pt_anchorOpeningImageHalf = CGPointMake(0.5, 0.0);
pt_anchorFixedImageHalf = CGPointMake(0.5, 0.5);

transform = CATransform3DMakeRotation(M_PI, 1.0, 0, 0);
}

CGImageRef img_closingHalf = CGImageCreateWithImageInRect( [img_view CGImage], rect_closingImageHalf);
CGImageRef img_fixedHalf = CGImageCreateWithImageInRect( [img_view CGImage], rect_fixedImageHalf);

lay_closingImageHalf.anchorPoint = pt_anchorOpeningImageHalf;
lay_fixedImageHalf.anchorPoint = pt_anchorFixedImageHalf;


//add the rendered image of the view to the backgroundLayer
[backgroundAnimationLayer addSublayer:lay_fixedImageHalf];
[backgroundAnimationLayer addSublayer:lay_closingImageHalf];
lay_closingImageHalf.contents = (__bridge id)img_closingHalf;
lay_fixedImageHalf.contents = (__bridge id)img_fixedHalf;


[view.layer addSublayer:backgroundAnimationLayer];

//add perspective
transform.m34 = 1.0f / 2500.0f;

//animate the folding of the layer
CABasicAnimation *flipAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
flipAnimation.toValue = [NSValue valueWithCATransform3D:transform];
flipAnimation.duration = duration;
flipAnimation.autoreverses = reverse;
flipAnimation.repeatCount = repeatCount;
flipAnimation.delegate = self;
flipAnimation.removedOnCompletion = NO;
flipAnimation.fillMode = kCAFillModeForwards;

[backgroundAnimationLayer addAnimation:flipAnimation forKey:@"fold"];
}



Wenn einer von euch ne Idee hat, wieso das nicht funktioniert wär ich echt dankbar.
Hab mir auch schon diverse Beispiele im netz angeschaut, aber hab nix gefunden, was mir bei meiner Problemlösung geholfen hätte. Auch der Sourcecode vom AFKPageFlipper hat mir nicht weitergeholfen. :(

Würde mich echt freuen, wenn mir da einer aus der Patsche helfen könnte.

Vielen Dank im Vorraus.

Mav
15.12.2011
Maverick1st 332 1 7
Hat denn keiner ne Idee worans liegen könnte? Ich lass euch jetzt mal noch nen Tag Zeit, dann gibts ein Kopfgeld. Vielleicht wirds dann ja was. ;)
Maverick1st 19.12.2011
1
Hihi, ich wette, jetzt kannst definitiv bis morgen warten ;-)
Eiger 19.12.2011
Was genau tut denn nicht..
puls200 19.12.2011
Aus irgendeinem Grund animierts nix. Eigentlich müsste alles da sein. Ich hab den Layer. Der ist an einer im Bildschirm sichtbaren Stelle und ich wende die Animation auf den Layer an. Ich seh aber nix.
Wenn ich jedoch die Animation zu view.layer adde dann seh ich was, aber natürlich nicht das gewünschte, weil der Layer vom view ja noch nicht zweigeteilt ist und somit nicht entsprechend animiert werden kann.
Hoffe das hilft euch ein wenig weiter.
Maverick1st 20.12.2011
Auf die Beantwortung dieser Frage war ein Kopfgeld in Höhe von 50 Reputationspunkten ausgesetzt. Das Kopfgeld wurde bereits vergeben.
2 Antworten
1
Hallo Mav,
ich habe das ausprobiert, in dem Code scheint nicht nur ein Fehler zu stecken. Leider fehlt mir jetzt die Zeit das weiter zu debuggen, aber hier mal ein paar Dinge die ich geändert habe.. jetzt sieht man wenigstens schonmal was:

CALayer *lay_closingImageHalf = [CALayer layer]; // hier Absturz durch fehlende Initialisierung
CALayer *lay_fixedImageHalf = [CALayer layer];
lay_fixedImageHalf.masksToBounds = YES;
lay_closingImageHalf.masksToBounds = YES;


weiter unten hinzugefügt:
lay_closingImageHalf.position = rect_closingImageHalf.origin;
lay_closingImageHalf.bounds = rect_closingImageHalf;

und nochmal für die fixe Hälfte. Die bridge annotation (__bridge id) habe ich entfernt und nur auf (id) gecastet.
Jetzt stimmt noch irgendetwas mit dem Drehpunkt und der Animation nicht, da beide Hälften animiert werden, aber vielleicht kommst du jetzt auf des Rätsels Lösung.
Schöne Weihnachten
:-)
23.12.2011
puls200 3,8k 7
Danke für die Antwort. Die Bridge is wegen ARC drin. Sonst meckert mir mein Compiler. Ich werd mir das ganze nochmal anschauen. Fürs erste hab ich mal ein anderes framework genommen, das in etwa das macht, was ich will. Noch nicht ganz das gelbe vom ei, aber immerhin etwas
Maverick1st 25.12.2011
0
So, momentan hab ich das framework hier Lösung für mein Problem benützt. Ist noch nicht ganz optimal, macht aber schon eher das was ich brauche.

https://github.com/blommegard/SBTickerView


Für später hätt ich natürlich trotzdem gerne noch meine eigenen Klassen mit denen ich in alle 4 Richtungen Falten kann, aber fürs erste langt mir das. :)
25.12.2011
Maverick1st 332 1 7

Stelle deine Ios-Frage jetzt!