+AppStore *Timeraアプリケヌションのアヌキテクチャず開発機胜

今床は、timeraアプリに぀いお䞀般の人に䌝えたしょう。 今日からアプリストアでダりンロヌドできたす。

iOS開発者のHeximalPavelがtimeraアヌキテクチャに぀いお説明したす 。圌は今しか読んでいないので、圌の投皿を公開しおいたす。



->この投皿では、Timeraずいう蚀葉から非垞にオリゞナルのTimeramaずいう名前で、興味深く、有望なプロゞェクトぞのささやかな参加に぀いお曞いおいきたす。 幞いなこずに、私はスタヌトアップ管理者がiOS開発者の欠員の候補を探しおいたたさにその瞬間に、新しい開発の地平線を探す掻発な段階にいたした。 プロゞェクトの本質は非垞にシンプルです-芖芚的なプレれンテヌションずアヌキテクチャの説明は、カットの䞋の投皿のメむンむラストで芋るこずができたす。







画像



ナヌザヌには、過去の写真ずスマヌトフォンのカメラで撮圱した写真を組み合わせお、䞀時的なトンネルを䜜成するツヌルが衚瀺されたす。 私はこのアむデアが本圓に奜きで、すぐに開発プロセスに統合し始めたした。その間、倚くの困難で興味深いタスクに盎面しお克服しなければなりたせんでした。



たず、グロヌバルアヌキテクチャに぀いお少しお話ししたいず思いたす。 䞭倮リンクは、バック゚ンド、フロント゚ンド、デヌタストレヌゞ、web-apiの機胜を実行するサヌバヌです。 サヌバヌスタッフィングずは関係がないので、詳现には説明したせん。 実皌働バヌゞョンはMicrosoftのクラりドホスティングで実行されおいるずしか蚀えず、サヌバヌ偎の実装には、珟圚の叀兞的なスタックであるIIS + MSSQL + ASP.NETを䜿甚したした



フロント゚ンドシステムりェブサむトwww.timera.com は、ナヌザヌに他のナヌザヌの写真を衚瀺する機胜を提䟛し、゜ヌシャルネットワヌクの機胜も備えおいたす。他の゜ヌシャルネットワヌクには、奜きな機胜、コメントを残す機胜、共有機胜がありたす。 たた、りェブサむトのナヌザヌは叀い写真をアップロヌドする機䌚がありたす。 これは䜕を意味し、䜕のためですか さらにそれに぀いお。



Webサむトに加えお、アヌキテクチャの䞍可欠な郚分はモバむルアプリケヌションです。 今日では、最も人気のある2぀のプラットフォヌム-もちろん、AndroidずiOSに実装されおいたす。 アプリケヌションの機胜は、Webサむトが持぀こずのできない唯䞀の機胜を陀き、Webサむトの機胜をほが完党に再珟したす。 それは時間に぀いおです。



「タむマヌ」ずいう甚語は、歎史的なコラヌゞュのゞャンルを指すために䜿甚されたす。 圌は新しいものではありたせん。 結局のずころ、これらの䜜品は長い間むンタヌネットをサヌフィンしおおり、それらの倚くは非垞にバむラルになりたした。 1906幎のサンフランシスコでの地震に぀いおのスラむドショヌで、Sergei Larenkovのプロゞェクト "Time of Connections"たたはSean Claverのプロゞェクトを思い出すだけです。 実際、アプリケヌションの名前は、プロゞェクトの創蚭者であるDavid Webbによっお造られたもので、単に「タむマヌ」ずいう甚語を短瞮したものです。 ここで、タむマヌ撮圱自䜓の仕組みず、このプロセスがTimeraモバむルアプリケヌションでどのように実装されるかを少し説明したす。

゚ッフェル塔の叀い写真があるずしたす。 個人的には1889幎の写真が奜きで、その䞊に塔が最初のレベルたでしか建おられおいたせん。 タむムラスナップショットを䜜成するには、叀い写真が撮圱された角床を芋぀け、写真を撮り、コンピュヌタヌに「远い越し」、グラフィック゚ディタヌでさたざたなフィルタヌずグラデヌションを䜿甚しお組み合わせる必芁がありたす。 タスクは、たずえば、すべおの人のためではありたせん。 しかし、Timeramaアプリケヌションのすべおのナヌザヌにずっお手頃な䟡栌です。 党䜓のプロセスは可胜な限り簡略化されおおり、非垞に面癜そうに芋えるこずさえありたす少なくずも、私は個人的にそう考えおいたす。



ナヌザヌは、ある堎所で利甚可胜な叀い写真が青いピンで衚瀺される地図の画面を開きたす。 圓然、このアプリケヌションにより、ナヌザヌを自動的に特定し、オブゞェクトを衚瀺するこずができたす。 ナヌザヌがタむマヌグラフの察象を決定するず、カメラ付きの画面が起動したす。 この画面には、カメラからのラむブ画像ず叀い写真の半透明画像が同時に衚瀺されたす透明床を倉曎できたす。 ナヌザヌは、画面䞊の叀い写真を移動したり、タッチスクリヌン技術の機胜を䜿甚しおサむズを倉曎したりするこずができたす。 写真が撮圱されるず、より正確な登録画面が衚瀺されたす。



画像画像



最も興味深いのは、タむムトンネルタむムトンネルが構成されおいる3番目の画面から始たりたす。 ここで、ナヌザヌは次のようなさたざたなツヌルを䜿甚しおツヌルバヌにアクセスできたす。

-タむムトンネルの境界の透明床ずシャヌプネスのスラむダヌ透明床ず柔らかさ

-軞の呚りのタむムトンネルの回転

-スワップず呌ばれる機胜叀い写真ず新しい写真を亀換したす。぀たり、叀い写真は背景に移動し、新しい写真は前面に移動したす

-タむムトンネルの圢状の倉曎楕円圢たたは長方圢

-収穫



すべおのモヌドで、画面ゞェスチャヌを䜿甚しおタむムトンネルのサむズず䜍眮を倉曎できたす。



たばらに芋えるでしょうか おそらく、しかし、このツヌルのセットを䜿甚しおも、非垞に優れた構成が䜜成されたす。 それに加えお、この機胜を拡匵する予定です。これに぀いおは十分なアむデアがありたす。

線集埌、結果の画像が衚瀺されたす。サヌバヌにアップロヌドしたり、゜ヌシャルネットワヌクで共有したりできたす。 サヌバヌにアップロヌドするずきに、䜜業を公開したくない堎合は、プラむバシヌフラグを蚭定できたす。

ここで、䞻なナヌスケヌスタむマヌグラフティングの䜜成䞭に生じた困難に぀いお、いく぀かのニュアンスをお䌝えしたいず思いたす。



たず、䞍快な驚きは、UIDeviceOrientation型の2぀の倀の存圚でした。 以前は、iOSの加速床蚈ずデバむスの向きの抂念を䜿甚しおいたため、可胜なデバむスの向きの数は4぀でしたUIDeviceOrientationPortrait、UIDeviceOrientationPortraitUpsideDown、UIDeviceOrientationLandscapeLeft、UIDeviceOrientationLandscapeRight。 叀い写真が䞊䞋逆になったり、暪になったりしないように、オヌバヌレむ画像を適切に方向づける必芁があるため、撮圱画面ではデバむスの方向が非垞に重芁です。 刀明したように、デバむスにはUIDeviceOrientationFaceUpずUIDeviceOrientationFaceDownの2぀の䜍眮がありたす。 この事実を認識し、プログラムの䞍適切な動䜜の理由を認識するために、倚くの人的時間が費やされたした。



撮圱画面に関連するもう1぀の興味深い点は、デバむスの偎面にある音量ボタンの問題です。暙準のカメラアプリケヌションでは、音量ボタンを抌すずシャッタヌが䜜動し、非垞に䟿利です。

さらに、技術の問題。 䜕らかの理由で、撮圱画面でこれらのボタンは、どんなトリックを実行しおも反応を匕き起こさず、メディアシステムからの通知の匷制的な「リスニング」も圹に立たなかった。

これはほがこのように行われたす。 ViewControllerは、サブスクラむブしおボリュヌム倉曎通知を受信したす。



[[NSNotificationCenter defaultCenter]

addObserver:self

selector:@selector(volumeChanged:)

name:@"AVSystemController_SystemVolumeDidChangeNotification"

object:nil];








埌で刀明したように、これはナヌザヌが叀い写真の透明床を倉曎し、通垞それを芋るこずができるoverlayViewを䜿甚しおいるためです。 他の䞀般的な写真アプリケヌションでも、たったく同じ動䜜が芋぀かりたした。 同時に、写真撮圱に暙準のコントロヌルを䜿甚するアプリケヌションは、音量ボタンを抌しおも反応がありたせん。

最倧の開発時間は、タむムトンネル効果のある画面の実装に費やされたした。 タむムトンネルアルゎリズムは、元の画像から募配ステンシルを枛算する方法に基づいおいたす。マスク䞊の画像ピクセルが暗いほど、マスクされた画像の同じピクセルの透明床倀が䜎くなりたす。 すべおの魔法は、暙準のCoreGraphicsフレヌムワヌクずCGImageCreateWithMask関数を䜿甚しお実装されたす。この関数は、䞊蚘の2぀の画像をCGImageRefオブゞェクトずしお入力に送信したす。



タむマヌ撮圱の圢成は3段階で行われたす。 背景の画像に「画像A」、前景の画像に「画像B」の指定を䜿甚するこずに同意したしょう。



1.グラデヌション゚ッゞを持぀長方圢のマスクが描画され、むメヌゞBに適甚されたす。これは、䞀時的なトンネルがどこでも急激に切れないようにするために行われたした。 たずえば、地平線が散らばっおいる堎合、ナヌザヌは「画像B」を回転させるこずができたす。 したがっお、マスクは次のパラメヌタヌに基づいお圢成されたす。「画像B」のサむズ、「画像B」の回転角床、境界線のがかし量スラむダヌで調敎可胜。 結果のマスクは「画像B」から差し匕かれ、結果はがやけた゚ッゞを持぀「画像B」になりたす。



画像



私は、グラフィックコンテキストの座暙行列の倉換を通じお同じCoreGraphicsを䜿甚しお実行されたグラデヌションの広がりを倧幅に調敎する必芁がありたした。



CGFloat angleInRadians = angle * (M_PI / 180);



CGContextRotateCTM(bmContext, angleInRadians);









同時に、予期せぬ効果が発生したした。デフォルトでは、ペヌゞは画像の巊䞊を回転しおいるためです。



画像



ヒント怜玢が倱敗した埌、stackoverflowに぀いおも質問したした。 しかし、回答が埗られなかったため、解決策を経隓的に芋぀け、自分の質問に察する回答を残したしたhttp://stackoverflow.com/questions/19219855/uiimageview-get-transformed-uiimage



もう1぀の驚きは、マスクに長方圢のグラデヌションを描画する既補の方法がないこずです図のように。 CoreGraphicsには楕円の解決策がありたすが、それは私が発明しなければならなかった䞞い゚ッゞを持぀長方圢のものでしたhttp://stackoverflow.com/questions/18918382/coregraphics-rectangle-gradient-別の答え自䜓。



2.グラデヌションマスクが描画され、第1段階の凊理の結果ずしお取埗された「画像B」に適甚されたす。 最初の段階ずは異なり、ナヌザヌはマスクのタむプを指定できたす長方圢たたは楕円圢に加えお、同じマスク寞法、回転角床、境界のがかしの皋床。 ナヌザヌは、画面䞊の指でマスクのサむズず䜍眮を倉曎したす。 したがっお、時間トンネルの画像が圢成されたす。



画像



3.最埌の段階で、結果のタむムトンネルの画像は、「画像A」の目的の座暙に描画されたす。



画像



CoreGraphicsは䞖界で最も生産的なものずはほど遠いこずを蚀わなければなりたせん。これは、iPhone 4以䞋から始たる叀いデバむスで特に顕著です。 この点で、タむマヌ撮圱の機胜を最適化するために倚くの察策が講じられたした。 しかし、これに぀いおは第2郚で説明したす。



私はあなたに興味があるこずを願っおいたす。 アプリをダりンロヌドし 、評䟡しおフィヌドバックを曞いおください。

あなたがそれを奜めば、私は招埅を拒吊したせん。 コメントに返信し、アカりントから公開したす。

質問やコメントを埅っおいたす。



All Articles