2010-12-20 13 views
13

Ich möchte wissen, ob es einen Weg gibt, wie ich meine Ansicht so verändern kann, dass sie wie iPhone-Ordner aussieht. Mit anderen Worten, ich möchte, dass sich meine Ansicht irgendwo in der Mitte aufteilt und eine Ansicht darunter freilegt. Ist das möglich?Wie macht man so etwas wie iPhone Ordner?

alt text

EDIT: Per Vorschlag unten, ich könnte einen Screenshot meiner Anwendung, indem Sie diese:

UIGraphicsBeginImageContext(self.view.bounds.size); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

nicht sicher, was damit zu tun, aber.

EDIT: 2 Ich habe herausgefunden, wie einige Schatten meiner Ansicht hinzuzufügen, und hier ist, was ich erreicht (geerntete relevanten Teil zu zeigen):

alt text

EDIT : 3

http://github.com/jwilling/JWFolders

+0

ahhh gut, ich fand dich auf kacaconactrols.com mein guter Freund ^^. Open Source FTW! =) –

+0

In der Tat hast du. Danke, dass du mir geholfen hast, damit anzufangen. ;) –

+0

Sie können sich 'OGActionChooser' anschauen;) aber es scheint, sie haben Serverprobleme zur Zeit :( –

Antwort

6

der Grundgedanke wird ein Bild von Ihrem Köter nehmen Miete Staat und teile es irgendwo. Dann animiere beide Teile, indem du einen neuen Frame anlegst. Ich weiß nicht, wie man einen Screenshot machen programmatisch so kann ich nicht Beispielcode zur Verfügung stellen ...

EDIT: hey hey, es ist nicht gut aussehen, aber es funktioniert ^^

// wouldn't be sharp on retina displays, instead use "withOptions" and set scale to 0.0 
// UIGraphicsBeginImageContext(self.view.bounds.size); 
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0.0); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *f = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

CGRect fstRect = CGRectMake(0, 0, 320, 200); 
CGRect sndRect = CGRectMake(0, 200, 320, 260); // was 0,200,320,280 


CGImageRef fImageRef = CGImageCreateWithImageInRect([f CGImage], fstRect); 
UIImage *fCroppedImage = [UIImage imageWithCGImage:fImageRef]; 
CGImageRelease(fImageRef); 

CGImageRef sImageRef = CGImageCreateWithImageInRect([f CGImage], sndRect); 
UIImage *sCroppedImage = [UIImage imageWithCGImage:sImageRef]; 
CGImageRelease(sImageRef); 


UIImageView *first = [[UIImageView alloc]initWithFrame:fstRect]; 
first.image = fCroppedImage; 
//first.contentMode = UIViewContentModeTop; 
UIImageView *second = [[UIImageView alloc]initWithFrame:sndRect]; 
second.image = sCroppedImage; 
//second.contentMode = UIViewContentModeBottom; 

UIView *blank = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)]; 
blank.backgroundColor = [UIColor darkGrayColor]; 

[self.view addSubview:blank]; 
[self.view addSubview:first]; 
[self.view addSubview:second]; 

[UIView animateWithDuration:2.0 animations:^{ 
    second.center = CGPointMake(second.center.x, second.center.y+75); 
}]; 

Sie können Kommentar- der zwei .contentMode Linien und die Qualität wird verbessert, aber in meinem Fall hat die Unteransicht einen Versatz von 10px oder so (Sie können es sehen, indem Sie eine Hintergrundfarbe auf beide Unteransichten setzen)

// EDIT 2: ok gefunden, dass Fehler. Hatte den gesamten 320x480 Bildschirm benutzt, musste aber die Statusleiste abschneiden, so sollte es 320x460 sein und alles funktioniert super;)

+0

Das könnte funktionieren ... Ich weiß einfach nicht wie ich es teilen soll. –

+0

Ich denke CoreGraphics oder Cocos2d sollte funktionieren aber vielleicht ist es einfacher, Screenshots zu machen, wenn Sie eine Region festlegen können/oder wenn Sie eine UIImageView verwenden, können Sie die automatische Größenanpassung einstellen, um immer in der oberen/unteren Ecke zu bleiben und dann den Rahmen ein wenig zu schneiden –

+0

Danke Für Ihre harte Arbeit sieht es gut aus.Wie würde ich nach diesem Vorgang zur Hauptansicht zurückkehren? –

2

Anstatt einen Schnappschuss der Ansicht zu machen, könnte man für jede Zeile eine eigene Ansicht verwenden Symbole. Sie müssen etwas mehr Arbeit mit der Neupositionierung von Daten erledigen, aber die Zeilen sind nicht statisch, wenn der Ordner geöffnet ist (mit anderen Worten, sie werden bei Bedarf neu gezeichnet).

+0

Dave, danke für Ihren Kommentar! Ich wollte eigentlich nicht die Icons (sollte in meiner Antwort geklärt haben), aber ich wollte nur die Hälfte der Ansicht teilen. –

1

Ich nahm relikd's Code als Basis und machte es ein bisschen dynamischer.

Sie können Split-Position und Richtung angeben, wenn Sie die Funktion aufrufen, und ich habe den Split-Bildern einen Boarder hinzugefügt.

#define splitAnimationTime 0.5 
- (void)split:(SplitDirection)splitDirection 
atYPostition:(int)splitYPosition 
withRevealedViewHeight:(int)revealedViewHeight{ 

    // wouldn't be sharp on retina displays, instead use "withOptions" and set scale to 0.0 
    // UIGraphicsBeginImageContext(self.view.bounds.size); 
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0.0); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *f = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    CGRect fullScreenRect = [self getScreenFrameForCurrentOrientation]; 

    CGRect upperSplitRect = CGRectMake(0, 0,fullScreenRect.size.width, splitYPosition); 
    CGRect lowerSplitRect = CGRectMake(0, splitYPosition, fullScreenRect.size.width, fullScreenRect.size.height-splitYPosition); 


    CGImageRef upperImageRef = CGImageCreateWithImageInRect([f CGImage], upperSplitRect); 
    UIImage *upperCroppedImage = [UIImage imageWithCGImage:upperImageRef]; 
    CGImageRelease(upperImageRef); 

    CGImageRef lowerImageRef = CGImageCreateWithImageInRect([f CGImage], lowerSplitRect); 
    UIImage *lowerCroppedImage = [UIImage imageWithCGImage:lowerImageRef]; 
    CGImageRelease(lowerImageRef); 


    UIImageView *upperImage = [[UIImageView alloc]initWithFrame:upperSplitRect]; 
    upperImage.image = upperCroppedImage; 
    //first.contentMode = UIViewContentModeTop; 

    UIView *upperBoarder = [[UIView alloc]initWithFrame:CGRectMake(0, splitYPosition, fullScreenRect.size.width, 1)]; 
    upperBoarder.backgroundColor = [UIColor whiteColor]; 
    [upperImage addSubview:upperBoarder]; 


    UIImageView *lowerImage = [[UIImageView alloc]initWithFrame:lowerSplitRect]; 
    lowerImage.image = lowerCroppedImage; 
    //second.contentMode = UIViewContentModeBottom; 

    UIView *lowerBoarder = [[UIView alloc]initWithFrame:CGRectMake(0, 0, fullScreenRect.size.width, 1)]; 
    lowerBoarder.backgroundColor = [UIColor whiteColor]; 
    [lowerImage addSubview:lowerBoarder]; 

    int reveledViewYPosition = splitYPosition; 

    if(splitDirection==SplitDirectionUp){ 
     reveledViewYPosition = splitYPosition - revealedViewHeight; 
    } 


    UIView *revealedView = [[UIView alloc]initWithFrame:CGRectMake(0, reveledViewYPosition, fullScreenRect.size.width, revealedViewHeight)]; 
    revealedView.backgroundColor = [UIColor scrollViewTexturedBackgroundColor]; 


    [self.view addSubview:revealedView]; 
    [self.view addSubview:upperImage]; 
    [self.view addSubview:lowerImage]; 

    [UIView animateWithDuration:splitAnimationTime animations:^{ 
     if(splitDirection==SplitDirectionUp){ 
      upperImage.center = CGPointMake(upperImage.center.x, upperImage.center.y-revealedViewHeight); 
     } else { //assume down 
      lowerImage.center = CGPointMake(lowerImage.center.x, lowerImage.center.y+revealedViewHeight); 
     } 
    }]; 
} 

Dies bedeutet, dass ich es so nennen kann:

[self split:SplitDirectionUp atYPostition:500 withRevealedViewHeight:200]; 

ich diese conveniance Funktionen in der aktualisierten Split-Funktion verwendet:

- (CGRect)getScreenFrameForCurrentOrientation { 
    return [self getScreenFrameForOrientation:[UIApplication sharedApplication].statusBarOrientation]; 
} 

- (CGRect)getScreenFrameForOrientation:(UIInterfaceOrientation)orientation { 

    UIScreen *screen = [UIScreen mainScreen]; 
    CGRect fullScreenRect = screen.bounds; 
    BOOL statusBarHidden = [UIApplication sharedApplication].statusBarHidden; 

    //implicitly in Portrait orientation. 
    if(orientation == UIInterfaceOrientationLandscapeRight || orientation == UIInterfaceOrientationLandscapeLeft){ 
     CGRect temp = CGRectZero; 
     temp.size.width = fullScreenRect.size.height; 
     temp.size.height = fullScreenRect.size.width; 
     fullScreenRect = temp; 
    } 

    if(!statusBarHidden){ 
     CGFloat statusBarHeight = 20; 
     fullScreenRect.size.height -= statusBarHeight; 
    } 

    return fullScreenRect; 
} 

und dieser Enum:

typedef enum SplitDirection 
{ 
    SplitDirectionDown, 
    SplitDirectionUp 
}SplitDirection; 

Hinzufügen einer Rückkehr zu Normaal f Salbe und Hinzufügen des Pfeils wäre eine großartige Ergänzung.

+1

Vielleicht interessiert es dich, eine Bibliothek zu sehen, die ich vor einiger Zeit geschrieben habe und die alles zusammenfasst. https://github.com/jwilling/JWFolders –

+0

hah, danke. Ich wünschte, das wäre hier, bevor ich damit angefangen habe! –

+0

Heh yeah, tut mir leid, ich hätte es schreiben sollen. Hier haben Sie eine Erwiderung als Trost. :) –