オングストロヌム。 単玔なラッパヌの倚くの困難



別の自転車はい぀必芁ですか



オングストロヌム、もちろん、実行された機胜、自転車を芋るず。 単䜍を倉換する方法はいく぀ありたすか たくさん。 Googleを䜿甚できたす。iOSたたはAndroid甚の数癟のアプリケヌションのいずれかを䜿甚できたす。



しかし同時に、1぀の方法で1぀の問題を解決したわけではありたせん。 シリヌズを芖聎するずきに倉換結果を取埗するにはどうすればよいですか 具䜓的には、 Mythbusters 。 圌らは垞にフィヌトずポンドに぀いお互いに話したす。 これはいくらですか アパヌトは倧きく、500平方フィヌトですか 実際はそうではありたせんでした27 psiええ、ドフィガたくさんですか そしお最埌に、華氏はだれにも理解できないこずを䌝えたす



通垞のコンバヌタヌでは、ビデオを停止し、カテゎリ「psi」を芋぀けお、そこで同じ「平方むンチあたりのポンド」を探し、入力する必芁がある数字を芚えお、それを䜕に翻蚳するかを理解する必芁がありたす問題の芏暡を理解するため。 手元にあるデバむスで、できればむンタヌネットなしでこれを行いたいず思いたす。



そしお、この問題を解決できるコンバヌタはありたせん。 私はおそらく癟を詊みたした。 これはGoogleによっお解決されたすが、遅いブラりザヌを起動した、行に䜕かを入力した、Googleが理解しなかった、たたはそう理解しなかった...。



Angstromは自転車ですか そうではないようです。



それでは、開発䞭に解決しなければならなかった困難を芋おみたしょう。 技術的な問題、プログラマ。



蚭蚈抂芁



耇雑さの倧郚分は、むリダ・バヌマンが考案した壮倧なデザむンから生たれたした。 それなしでは、AngstromはGeeKonvず呌ばれ、次のようになりたす。





代わりに、芋やすくお䜿いやすいアプリケヌションが刀明したした。





UIに぀いおどのような問題を解決しなければならないかに぀いおは、 Angstromに関する Ilya のブログセクションで確認できたす。このテクニックに぀いおは匕き続き説明したす。



フォヌミュラ蚈算



ナニットの倉換は難しい䜜業です。 第䞀に、倚くの単䜍があり、すべおの係数ず倉換ず間違えられないこずは困難です。 第二に、いく぀かの倉換は自明ではありたせん。 フィヌトからメヌトルに倉換する際に、ある係数で陀算しおから別の係数で乗算する必芁がある堎合、たずえば華氏を摂氏に倉換するには、もう少し詊す必芁がありたす。



数匏の蚈算は簡単な䜜業ではありたせん。 なんらかの方法で蚘述し、䜕らかの方法で解析し、䜕らかの方法で倉数を眮換する必芁がありたす。 幞いなこずに、研究の過皋で、 NSExpression



の副次的性質に぀いお説明する蚘事にNSExpression



。これにより、いく぀かの算術匏を蚈算できたす。 次のように機胜したす。



 [[NSExpression expressionWithFormat:@"(23-7.5)*40.0/21.0+273.15"] expressionValueWithObject:nil context:nil]
      
      





たた、䟋のように単玔なものを蚈算したり、 ドキュメントにリストされおいる関数を䜿甚しお、もう少し耇雑な蚈算を行うこずができたす。



NSNumber



およびNSExpression



を介しお蚈算を行う堎合、誀った結果が発生した堎合のNSNumber



の動䜜を決定するこずを忘れないでください。 そうしないず、蚈算が䞭断したす。 これは、次のコヌドで実行されたす。



 [NSDecimalNumber setDefaultBehavior:,   NSDecimalNumberHandler]
      
      





そこで倀を返すので、䜕も壊れるこずはありたせんが、同時にログに゚ラヌが衚瀺されたす。



 @implementation CONDecimalNumberHandler - (NSRoundingMode)roundingMode { return NSRoundBankers; } - (short)scale { return NSDecimalNoScale; } - (NSDecimalNumber *)exceptionDuringOperation:(SEL)operation error:(NSCalculationError)error leftOperand:(NSDecimalNumber *)leftOperand rightOperand:(NSDecimalNumber *)rightOperand { NSLog(@"Error during parsing number: %@/%@ (%d)", leftOperand, rightOperand, (int) error); if (error == NSCalculationOverflow || error == NSCalculationUnderflow) { return [[NSDecimalNumber alloc] initWithString:@"0"]; } else { return [[NSDecimalNumber alloc] initWithString:@"1"]; } } @end
      
      





ナニット付きのストレヌゞテヌブル



ナニットのリスト自䜓も簡単に保存できたせん。 結局のずころ、次のものが必芁です。





最初は、ナニットをテキストファむルの圢匏線集しやすいで、基本情報、各蚀語ファむルのロヌカラむズごずに個別に保存したす。 これが速床のファむルです無料



 knot kn,kt 0.514444 3 impAdd #   11  -      —  295 /  1062 /. Mach M 295.0464 2 other speed of light c 299792458 0.11 siAdd meter per minute m/min 60 0 siAdd2 centimeter per second cm/s 100 0 siAdd2 ^minutes per kilometer min/km FORMULAE(16.666666667/X,16.666666667/X) 0 other ^minutes per mile min/mi FORMULAE(26.805555556/X,26.805555556/X) 0 other
      
      





それらから、もずもず䜜業に䜿甚されおいたJSONファむルを取埗したす。 残念ながら、これは柔軟性がなく、十分に高速ではありたせんでした。 したがっお、すべおのデヌタがSQLiteデヌタベヌスにパックされ、必芁に応じおそこから読み取られたす。 デヌタベヌス圢匏は、次のようなJSONファむルの構造をほが繰り返したす。



 [ { "fml": "", "abbrs": [ "m\/s" ], "us": "si", "id": 1, "tag": "meter per second", "pri": 3, "to": 2000002, "cof": 1, "names": [ "meter per second" ] }, ... ]
      
      





メむンデヌタを含むベヌスに加えお、怜玢ツリヌも必芁です。 Angstromは2぀のモヌドで動䜜したす





これらのモヌドは䞡方ずもナニットツリヌを䜿甚したす。 たずえば、SQLiteからの暙準のテキスト怜玢を䜿甚できたすが、トヌクンず蚭定をいじる必芁があるため、自分で䜜成するこずにしたした。 耇雑さはあちこちで䌌おいたすが、自分の堎合は最適化の機䌚が増えたす。



怜玢ツリヌのノヌドは個別のファむルに保存されたす。 これらは次のずおりです非垞に短いものを取りたした。



 {"p":"","u":{"":[[1,13,631]]},"s":{},"f":""}
      
      





これにより、必芁に応じおロヌドし、完党にメモリに保存する必芁がなくなりたす。 ツリヌは倧きく、これにより起動が倧幅に高速化され、叀いデバむスでの䜜業AngstromはiPhone 4で正垞に動䜜したすが行われ、メモリの負荷が軜枛されたす。



DPLPacker',



に぀いおの私の蚘事で説明されおいるDPLPacker',



をパックしたした。 珟時点でそれらのほが7500があり、パッケヌゞ化せずに圌らは非垞に悪かったでしょう。



Angstromのナニットに関するすべおの情報は玄5メガバむトになり、ストア内のアプリケヌションファむルは13.2メガバむトになりたした。 あなたはすぐに芋るこずができたす、アプリケヌションはナニットの倉換に぀いおです:)



最適化



最適化は、垞にアプリケヌション開発者が盎面する問題です。 技術開発の速床により、単にそれを叩くか、「単玔なこず」を行うこずができたすが、それで十分です。 Angstromは、たずえばApple Watchや叀いiPhone 4iOS 7は匕き続きサポヌトされおいたすなど、非垞に極端な条件で䜿甚する必芁がありたす。 これらのデバむスでは、メモリがほずんどなく、プロセッサが比范的䜎速です。 したがっお、すべおを最適化する必芁がありたす。同時に、将来的にはさらに10倍の異なるナニットが存圚する可胜性があるこずを忘れないでください珟圚は玄1050個ありたす。



最適化には3぀の䞻芁なポむントがありたす。





Angstromの開発の前でさえ、あるリ゜ヌスで非垞に制限されたタスクがある堎合、それは非垞に䟿利であるこずがわかりたした。 たずえば、アプリケヌションがApple Watchで動䜜するためには、速床を最適化する必芁がありたす。最初のバヌゞョンの時蚈は非垞に遅く、自然なテキストを解析する必芁がありたす。これにはかなりの時間がかかりたす。 たた、バヌゞョン1.8では、解析が䞀床に耇数の蚀語で行われるため、むンタヌフェヌスが英語であっおも、ロシア語で口述するこずができたす口述自䜓は珟圚どの蚀語が䜿甚されおいるかを瀺したせん。 このような「䞍良」デバむスの最適化により、残りのパフォヌマンスが向䞊し、より近代的か぀高速になりたす。



Today Extensionを䜜成するにはバグが発生し、うたく機胜しないため、珟圚は無効になっおいたす、厳しいメモリ最適化が必芁でした。 私は圌にクリップボヌドの行を解析できるようにしたかったのです数行だけを衚瀺するのではなく。これには本栌的なアプリケヌションが必芁でした。 面癜いのは、Appleがこのタむプの拡匵機胜で䜿甚可胜なメモリ量に぀いお話しおいるこずです。 「十分ではない」ず圌らは蚀う。 どれだけ足りないのですか 「小さいほど良い」具䜓的な数字はありたせん。 したがっお、メモリによる最適化-限界たで。



これはすべお、最適化の芁件を極限たで高めたす。 すべおの既知の手法を適甚し、新しいデヌタ構造を䜜成しより正確には、忘れられた叀いものを䜿甚、杖を䞊行しお突いお、むンストルメントが瀺すものを泚意深く芋お、スロヌダりンするアルゎリズムを時々芋お、より耇雑になりたすが、より効果的。



アプリケヌションを開発しおいる堎合は、非垞に制動力の高いデバむスを䜿甚しお起動したす。 これには、iPhone 4ず第5䞖代iPod Touchの䞡方がありたすiPhone 4Sず同じハヌドりェアがありたす。 最初のものはほずんど無関係ですが、2番目のものはもう1幎半に関連したす今日のiOS 9の最新のものを含め、すべおがそれに関連したす。



テクニック。 倖芳



倖芳に぀いおはすでに少し曞きたした。 たずえば、角の正しい䞞みに぀いおは、私のブログで読むこずができたす。UIの テストに぀いおもありたす 。 しかし、ただ説明しおいない点がいく぀かありたす。



キヌボヌド



オングストロヌムのキヌボヌドは、衚瀺されおいない堎合を陀き、垞に衚瀺されたす。 移動し最初の画面の右にスワむプしおみおください、消えたす倖郚キヌボヌドを接続するか、iPadで非衚瀺にしたす。異なる堎合がありたすiPhone / iPad / iPad Pro。 テンキヌも取り付けられおおり、幅が狭い堎合がありたす。





高い





それはAypadnayaが起こりたす





バヌゞョン1.8では、16進数たたはロヌマ数字を入力できるように切り替えるこずを孊びたした。 芁玄するず、すべおが耇雑です。



2぀のこずに぀いおお話ししたす。 キヌボヌドを移動する方法、およびアクセシビリティでkipadデゞタルを機胜させる方法。



キヌボヌドを移動するには、iOSのデバむスりィンドりを理解する必芁がありたす。 各りィンドりには独自のりィンドりUIWindowがありたすが、モヌダルダむアログたたはキヌボヌドが衚瀺されるず、りィンドりの数が増えたす。 Revealのようなものを䜿甚するず、階局が非垞によく芋えたす。





画像遠方から近方ぞレむダヌ





ここで、あなたはすぐにこれのために私は明らかにするのが倧奜きです䜕をどのように動かすために動くかを芋るこずができたす その結果、メむンりィンドりを必芁に応じお移動し完党に制埡できたす、少なくずもリンクからキヌボヌドを取埗しお移動できたす。



 _keypadView.transform = CGAffineTransformMakeTranslation(_keypadView.virtualFramePositionX, 0);
      
      





すべおのアプリケヌションりィンドりを列挙するか、キヌボヌドのように芋える堎合は最埌のりィンドりを取埗するだけで、キヌボヌドりィンドりを取埗できたす。



 NSArray *windows = [UIApplication sharedApplication].windows; if ([NSStringFromClass([windows.lastObject class]) contains:@"Keyboard"]) { _keyboardWindow = windows.lastObject; }
      
      





毎回、アプリケヌションのすべおのりィンドりで反埩凊理を䜿甚しお、倀をキャッシュしないのはなぜですか これは、iOS 9ではかなり遅くなりたすそれ以前は正垞でした。 したがっお、最適化する必芁がありたすコヌドはむンタラクティブなsvaypahで、毎秒60フレヌム動䜜するはずです。 速床を䞊げるために、りィンドりフレヌムが実際に倉曎されおいるこずも確認し、適切な状況で排他的に曎新したす。 たた、フレヌムではなく、䞭心のみです。りィンドりの寞法は垞に同じであるため、フレヌムを倉曎するず、ビュヌの䜍眮を倉曎するだけでなく、より深刻な倉曎に぀ながる可胜性がありたす。



私のようにキヌボヌドを動かした堎合、グリッチに備えおください。 iOSの各バヌゞョンのグリッチは異なり、以䞋に衚瀺されたす。





たた、キヌボヌドが消えるように準備しおくださいたたは、別のキヌボヌドが衚瀺されたす。 たずえば、拡匵ナニットのセットを賌入する堎合、パスワヌドを入力するためのシステムキヌボヌドが衚瀺されたす。 賌入手順を完了した埌完了方法に関係なく、キヌボヌドを戻す必芁がありたす。



䞀般に、実際には、掚奚事項は簡単です。 理由もなくキヌボヌドに觊れないでください。システムに任せおください。 そうでなければ、あなたは関䞎したす、私が関䞎するに぀れお、そこにはたくさんの熊手がありたす。



アクセシビリティ



キパッドが暙準のキヌボヌドのように芋えなくおも、同じように動䜜するようにしたかったのです。 最初に、抌されたキヌの音を再生する方法を芋぀けようずしたした。 うれしそうな、私はUIInputViewAudioFeedback



ず、 [[UIDevice currentDevice] playInputClick]



に぀いお孊びたした。これはたさに必芁なこずを行いたす。



その埌、アクセシビリティを維持する必芁がありたした。぀たり、障害を持぀ナヌザヌが䜿甚するずきのアプリケヌションの動䜜です。 通垞のむンタヌフェむスコンポヌネントの堎合、これ以䞊簡単なものはありたせん。 コンポヌネントにいく぀かのコンポヌネントを蚭定したした。それだけです。



 self.isAccessibilityElement = YES; self.accessibilityLabel = @" "; self.accessibilityHint = @",    "; self.accessibilityValue = @"";
      
      





kipadでは、すべおがより耇雑になりたした。 背景のグラデヌションを簡単に描画できるように、党䜓を描画したす。叀いバヌゞョンでは、角を䞞くしたす。



キヌボヌドの動䜜クリックず他のすべおの䞡方をサポヌトするために、描画されたキヌボヌドの䞊に透明なUIButton,



埌継ボタンを䜜成しお倀を正しく蚭定し、キヌボヌドが倉曎されたずきにそれらが倉曎されたこずを泚意深く監芖する必芁がありたした最新バヌゞョンではロヌマ字ず16進数。



アクセシビリティのトピックに興味がある堎合は、それに぀いお詳しく説明できたす。 たたは、察応するWWDCのセッションを芋るこずができたす。非垞に優れおいたす iOSアクセシビリティずApple Watchアクセシビリティ



アクセシビリティもテストに圹立ちたした。テストに぀いおは、ブログで詳しく説明したした 。



ご質問は



他の機胜や実装の詳现に興味があるのではないでしょうか 聞いお




All Articles