Archive for Apr. 2010

new stretchableImage

In einem aktuellen Projekt benötige ich Buttons bzw. ImageView’s mit Grafiken, welche sowohl abgerundete Ecken als auch einen Verlauf haben.
Ein komplett skalierter Verlauf hat den Nachteil, dass die abgerundeten Ecken auch verzogen sind — ein stretchableImage bringt dann zwar gute Ecken, allerdings nicht mehr den Verlauf.

Mein Ansatz ist der, dass ich das Bild zerschneide, den oberen und unteren Rand horizontal stretche, und den inneren Teil skaliere.


/**
* creates an UIImage with a similar behavior like stretchableImage, but it stretches also the
* whole content area, which is suitable for all kinds of vertical gradients
*/

- (UIImage *)imageNamed:(NSString *)name WithLeftCapWidth:(CGFloat)leftCapWidth topCapHeight:(CGFloat)topCapHeight frameRect:(CGRect) aframe{
UIImage *basicImg = [UIImage imageNamed:name];
CGRect topRect = CGRectMake(0.0, 0.0, basicImg.size.width, topCapHeight);
CGRect cropRect = CGRectMake(0.0, topCapHeight, basicImg.size.width, basicImg.size.height - (topCapHeight * 2));
CGRect bottomRect = CGRectMake(0.0,basicImg.size.height - topCapHeight, basicImg.size.width, topCapHeight);

// main area
CGImageRef imageRef = CGImageCreateWithImageInRect([basicImg CGImage], cropRect);
UIImage *cropImage = [[UIImage imageWithCGImage:imageRef] stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:0];
CGImageRelease(imageRef);

// top area
CGImageRef imageRef2 = CGImageCreateWithImageInRect([basicImg CGImage], topRect);
UIImage *topImage = [[UIImage imageWithCGImage:imageRef2] stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:0];
CGImageRelease(imageRef2);

// bottom area
CGImageRef imageRef3 = CGImageCreateWithImageInRect([basicImg CGImage], bottomRect);
UIImage *bottomImage = [[UIImage imageWithCGImage:imageRef3] stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:0];
CGImageRelease(imageRef3);

UIGraphicsBeginImageContext(aframe.size);
[topImage drawInRect:CGRectMake(0.0, 0.0, aframe.size.width, topCapHeight)];
[cropImage drawInRect:CGRectMake(0.0, topCapHeight, aframe.size.width, aframe.size.height - (topCapHeight*2))];
[bottomImage drawInRect:CGRectMake(0.0, aframe.size.height - topCapHeight, aframe.size.width, topCapHeight)];

basicImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return basicImg;
}

In meinem Beispiel sieht das dann so aus:
Ursprungsgrafik:

Screenshot mit Skalierung:

HTML 5

Wenn ich mir ein paar Beispiele anschaue, was mit HTML 5 und JS alles möglich ist, ist es mehr als verständlich, dass Steve Jobs resp. Apple sich von Flash distanziert.

http://www.craftymind.com/2010/04/20/blowing-up-html5-video-and-mapping-it-into-3d-space/
http://code.google.com/p/quake2-gwt-port/

Allerdings hat der berechtigte Hype um HTML5 auch Nachteile – wenn 80% aller Multimedialen Webinhalte mit Flash umgesetzt wurden, dann wird es noch einige Zeit dauern, bis Flash ganz von der Bildfläche verschwindet — und es wird demnach eben auch noch einige Zeit dauern, bis man z.B. das iPad vollumfänglich im Web nutzen kann.

Andererseits würde Flash auf dem iPhone/iPad dafür sorgen, dass die “HTML5-Revolution” dann doch genauso schleicht wie IPv6..

dismissModalViewController

Bei einem aktuellen Projekt, baue ich einen Stack an ModalViewControllern auf möchte auf den vor-vorrigen ‘zurückspringen’. Nur, um mal meine kleinen Erfahrungen hier wiederzugeben:

Für die Kontrolle des Modalen Views ist das parent zuständig. Ein dissmissModalViewController innerhalb des gerade präsentierten modalen VC wird also nur an das parent weitergeleitet.

Ein [self dissmissModalViewControllerAnimated:YES] wird deswegen im parent ausgeführt – weswegen ein [[self parentViewController] dissmissModalViewControllerAnimated:YES] das gleiche ist.

Erst ein [[[self parentViewController] parentViewController] dismissModalViewControllerAnimated:YES]; bewirkt demnach den gewünschten Effekt.