UIScrollView wie im AppStore

  • UIScrollView wie im AppStore

    Hallo Forum,

    ich bin auf der suche nach einem Beispiel für einen ScrollView welcher sich wie der Screenshotviewer im Appstore App verhält.
    Einen normalen ScrollView mit View`s mit der Breite 320px funktioniert ohne Probleme.
    Nur Ändere ich jetzt die breite der Views auf 260px und aktiviere paging bekomme ich den aktiven View nicht in die mitte.

    Kann mir hier jemand weiterhelfen oder einen Sample Code zur Verfügung stellen? Ich bin fast am verzweifeln.

    Beste Grüße und frohe Weihnachten,
    Jannik
  • Ok, Sorry da habe ich mich falsch ausgedrückt.

    Was ich eigentlich sagen wollte: ;)
    Mein UIScrollView hat die breite von 320px.
    Und meine Seiten (die einzelnen UIView`s) sind mit einer breite von 260px in meinem ScrollView.
    Diese Views mit 260px sollen zentriert in meinem ScrollView sein. Die weiteren UIViews mit 260px sollen mit einem padding von 10px neben meinen anderen Views sein.
    Als beispiel wollte ich den Screenshot Viewer aus dem AppStore App als Fingerübung nachbauen.

    Ich Ihr wisst was ich mein...
  • Naja nicht ganz. Da mein ScrollView die 320px beibehalten soll werden auch mehrere UiViews mit 260px dargestellt. Bzw der aktive View ist Zentriert und von den Views links und rechts sieht man jeweils nur den Rand.
    Meine Schwierigkeit ist jetzt die, den aktiven View zu Zentrieren und den rand der Inaktiven dar zu stellen.

    Mir Ist aufgefallen das es diese Funktion auch im Safari gibt.
    Im Anhang sind 2 Bilder welche mein Ziel darstellen.
    Ich hoffe das stellt mein Problem besser dar.

    Ich hasse es mich nicht richtig ausdrücken zu können...

    Beste Grüße
  • Mir ist leider nur o.a. Lösung bekannt. Wenn Du mehr als die 270 Pixel des ScrollViews darstellen möchtest, dann musst Du bei dem ScrollView einfach das Clipping deaktivieren, also clipsToBounds auf NO stellen. Der ContentView ragt dann rechts und ggf. links aus dem ScrollView heraus.

    Allerdings regiert der ScrollView dann auch nur auf einer Breite von 270 Pixeln auf Touch-Events. Wenn Du die Touch-Events auf der vollen Breite verarbeiten möchtest, dann musst Du die Touch-Events über die bekannten Methoden im ViewController selbst implementieren.

    Wie gesagt, damit lässt sich das Aussehen und Handling zu den o.a. Bildern erreichen und eine andere Lösung ist mir nicht bekannt.
  • Ok, danke dir für deine Antwort. Meinen View habe ich jetzt angepasst bekommen also auf die breit von 260px. Alles sieht jetzt so aus wie ich mir das gewünscht hatt. Wie du aber schon richtig erwähnt hast ist jetzt die Aufnahme der Touchevents auch auf diese Breite des ScrollViews beschränkt (wie sollte es auch anders sein :( ).

    "Du die Touch-Events über die bekannten Methoden im ViewController selbst implementieren."
    Welche bekannten Methoden sind denn das? Kennst du eine gute Lektüre in welche ich mich diesbezüglich einlesen kann?
  • Nachdem ich auch in einem meiner Bücher (iPhone SDK von O`REILY) in das Thema UITouch & UIEvents eingelesen und verstanden habe gibt es jetzt einen weiteren Stein auf meinem Weg.

    Ich habe mein ScrollView wie MCDan beschrieben angepasst (siehe Anhang).
    Anschließend wollte ich mein neu gewonnenes Wissen anwenden und nur einen Tab-Counter für meine Views erstellen.
    In dem Grünen View funktioniert mein Tab-Counter. Jedoch in meinem Roten bzw. Lilalen View nicht.
    Jeder dieser Views wird über eine Klasse erstellt. Und in dieser Klasse habe ich auch die Funktion "touchesBegan" eingebaut.

    Da ich die Views Rot & Lila nicht freigegeben habe sollten diese ja noch auf diese Funktion "höhren".

    Gibt es für Views welche nicht komplett gezeichnet werden besonderheiten welche ich nicht kenne?

    Beste Grüße
  • Regelst Du das Scrolling jetzt durch eine eigene Touch Implementierung im ViewController?

    Wenn Du das Scrolling über den ScrollView verwendest, dann erhalten die sichtbaren, aber aus dem ScrollView herausragenden Views keine Touch Events, da diese auf die Ausmaße des ScrollViews eingeschränkt werden. D.h. die Views werden zwar dargestellt, lassen sich jedoch nicht "berühren".

    Wenn Du Scrolling über eine eigene Touch Implementierung im ViewController regelst, dann solltest Du dort auch den Tap-Counter für die einzelnen Views implementieren. Allerdings hilft Dir das Property view im UITouch Objekt nicht weiter, da sowohl bei dem View als auch bei allen Superviews userInteractionEnabled = YES gesetzt sein muss. Dies führt bei Deiner App jedoch dazu, dass der ScrollView wieder selber die Touch Events verarbeitet und daher die Touch Methoden im ViewController nicht mehr aufgerufen werden, wenn diese im Bereich des ScrollView liegen. Bei Deiner App sollte es jedoch kein Problem sein, den passenden View zu einem Tap zu ermitteln.

    Ich hoffe, die Erklärungen waren hilfreich und tragen nicht zur weiteren Verwirrung bei.