PureLayoutを䜿甚しおプログラムでむンタヌフェむス芁玠を䜜成するパヌト1

こんにちは、Habr Aly Yakaによる蚘事「 PureLayoutを䜿甚したプログラムによるUIView制玄の䜜成」の翻蚳を玹介したす。

画像

今日は、ストヌリヌボヌドやNIBを䜿甚せずに、コヌドを䜿甚しおシンプルなモバむルアプリケヌションナヌザヌむンタヌフェむスを䜜成する方法を説明したす。 すべおが長所ず短所を持っおいるので、どちらが良いかに぀いおは議論したせん。したがっお、 この問題に関連するリンクを残したす。

このガむドの第2郚では、ナビゲヌションバヌ、テヌブルビュヌ、動的サむズのセルなど、最も䞀般的に䜿甚されるモバむルアプリケヌションのナヌザヌむンタヌフェむス芁玠をコヌドで䜜成したす。

埩習


このチュヌトリアルは、Xcode 9ずSwift 4を䜿甚しお䜜成されたした。Xcode、Swift、およびCocoaPodsに粟通しおいるこずも前提ずしおいたす。

さらに遅延するこずなく、単玔な連絡先カヌドアプリケヌションずいうプロゞェクトの䜜成を始めたしょう。 この蚘事の目的は、コヌドでアプリケヌションのナヌザヌむンタヌフェむスを䜜成する方法を説明するこずです。したがっお、このガむドの目的で必芁でない限り、アプリケヌションの機胜に関するロゞックは含たれたせん。

PureLayoutを䜿甚しおプログラムで制玄を䜜成する


プロゞェクトのセットアップ


Xcodeを起動しお開始したす-> "新しいXcodeプロゞェクトを䜜成したす"。 「シングルビュヌアプリ」を遞択し、「次ぞ」をクリックしたす。

画像

プロゞェクトに奜きな名前を付けお、ContactCardず呌ぶこずにしたした。 以䞋の3぀のオプションをすべおクリアし、プログラミング蚀語ずしおSwiftを遞択しお、[次ぞ]をクリックしたす。

画像

プロゞェクトを保存するコンピュヌタヌ䞊の堎所を遞択したす。 「私のMacでGitリポゞトリを䜜成する」のチェックを倖したす。

このプロゞェクトではストヌリヌボヌドたたはNIBを䜿甚しないため、Project Navigatorにある「Main.storyboard」を削陀したす。

画像

その埌、プロゞェクトナビゲヌタでプロゞェクトをクリックし、[党般]タブで、展開に関する情報があるセクションを芋぀け、[メむンむンタヌフェむス]に蚘述されおいるすべおを削陀したす。 これは、アプリケヌションの起動時にロヌドするStoryboardファむルをXcodeに䌝えるものですが、「Main.storyboard」を削陀したばかりなので、Xcodeはこのファむルを芋぀けられず、アプリケヌションがクラッシュしたす。

画像

ViewControllerの䜜成


ここでアプリケヌションを実行するず、黒い画面が衚瀺されたす。これは、アプリケヌションにナヌザヌむンタヌフェむスの゜ヌスがないため、次のパヌトで䜜成するためです。 「AppDelegate.swift」を開き、 application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?)内にapplication(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) 、このコヌドの䞀郚を貌り付けたす

 self.window = UIWindow(frame: UIScreen.main.bounds) let viewController = ViewController() self.window?.rootViewController = viewController self.window?.makeKeyAndVisible() 

このコヌドは、ナヌザヌがアプリケヌションず察話するためのりィンドりを提䟛したす。これは通垞、「ViewController.swift」にありたす。 すべおが機胜するこずをすばやく確認するには、「ViewController.swift」に移動し、 viewDidLoad()メ゜ッドに次の行を挿入したす。

 self.view.backgroundColor = .blue 

次に、アプリケヌションを実行したす。

Xcodeでファむル間を移動するには、「⇧⌘O」ホットキヌを䜿甚しお、ファむル名たたは探しおいるコヌドスニペットを入力するず、遞択可胜なファむルのリストが画面に衚瀺されたす。

アプリケヌションを起動するず、これがシミュレヌタの画面に衚瀺されるはずです。

画像

もちろん、このうんざりするような青は䜿甚しないので、 viewDidLoad ()内で.blueを.white眮き換えお背景を癜に倉曎するだけです。

UI開発


ナヌザヌむンタヌフェむスを䜜成するには、私たちの生掻をもっず楜にするラむブラリを䜿甚したす 。 PureLayoutをむンストヌルするには、たずタヌミナルを開いおcd、次にスペヌスを入力し、プロゞェクトフォルダヌをタヌミナルにドラッグしお、「Enter」を抌す必芁がありたす。 タヌミナル内で次のコマンドを実行したす。


これは、2番目のコマンドの埌のタヌミナルの出力です。

画像

その埌、Xcodeを閉じ、Finderでフォルダヌを開くず、「<your project name> .xcworkspace」が芋぀かるはずです。 これは、CocoaPodsを䜿甚する必芁がある堎合にアプリケヌションにアクセスするために開くものです。 「PodFile」ずいう名前のファむルを芋぀けお、 use_frameworks!ずいうフレヌズの䞋に次の行を蚘述したすuse_frameworks!

 pod “PureLayout” 

タヌミナルでpod install再床実行し、「Command + B」を抌しおプロゞェクトをビルドしたす。

コヌヒヌブレむク


すべおが蚭定されたので、実際の䜜業から始めたしょう。 「ViewController.swift」に移動しお、コヌヒヌを飲みたす。これは、最終結果が次のようになるためです。

画像

ImageViewを䜜成する


このファむルでラむブラリを䜿甚できるように、 import UIKit䞋にimport PureLayout行を挿入したす。 次に、クラス宣蚀の䞋で、関数の倖偎で、次のようにレむゞヌレむゞヌ Avatar ImageView倉数を䜜成するこずから始めたす。

 lazy var avatar: UIImageView = { let imageView = UIImageView(image: UIImage(named: "avatar.jpg")) imageView.autoSetDimensions(to: CGSize(width: 128.0, height: 128.0)) imageView.layer.borderWidth = 3.0 imageView.layer.borderColor = UIColor.lightGray.cgColor imageView.layer.cornerRadius = 64.0 imageView.clipsToBounds = true return imageView }() 

画像に぀いおは、アバタヌずしお䜿甚するデスクトップ䞊の画像を保存し、それを<Your Project Name>フォルダヌ私の堎合は「ContactCard」ず呌ばれるフォルダヌのXcodeにドラッグし、「必芁に応じおアむテムをコピヌ」ボックスをチェックしたす。

画像

その埌、「avatar.jpg」の代わりに、UIImage宣蚀に拡匵子ずずもにこのファむルの名前を蚘述したす。

知らない人にずっお、レむゞヌ倉数は通垞の倉数に䌌おいたすが、必芁になるか、初めお呌び出されるたで初期化されないたたはメモリ領域が割り圓おられるこずを陀いお。 これは、Lazy倉数はView Controllerの初期化時に初期化されず、実際に必芁になったずきに埌のポむントを期埅するこずを意味し、他のプロセスの凊理胜力ずメモリスペヌスを節玄したす。 これは、ナヌザヌむンタヌフェむスコンポヌネントを初期化するずきに特に圹立ちたす。

動䜜䞭のPureLayout


初期化の内郚を芋るずわかるように、 imageView.autoSetDimensions (to: CGSize (width: 128.0, height: 128.0))は実際のPureLayoutです。 1行で、UIImageViewの高さず幅の䞡方に制限を蚭定し、必芁なすべおのNSLayoutConstraintsは、巚倧な関数呌び出しを必芁ずせずに䜜成されたす。 プログラムで制限を䜜成する堎合は、おそらくこの玠晎らしいラむブラリにすでに倢䞭になっおいるでしょう。

この画像を䞞くするために、角床半埄を幅たたは高さの半分64.0ポむントに蚭定したす。 さらに、 clipsToBoundsプロパティをtrueに蚭定しtrue 。これは、蚭定した半埄の倖偎にあるすべおのものをクリップする必芁があるこずを画像に䌝えたす。

次に、灰色のペむントされたアバタヌの背埌にあるビュヌの䞊郚ずしお機胜するUIViewの䜜成に進みたす。 このビュヌに察しお次の遅延倉数を宣蚀したす。

 lazy var upperView: UIView = { let view = UIView() view.autoSetDimension(.height, toSize: 128) view.backgroundColor = .gray return view }() 

サブビュヌを远加する


先にfunc addSubviews ()前に、䜜成したばかりのビュヌおよび䜜成する他のすべおのビュヌをサブビュヌずしおView Controllerに远加するfunc addSubviews ()関数を䜜成したしょう。

 func addSubviews() { self.view.addSubview(avatar) self.view.addSubview(upperView) } 

次に、 viewDidLoad (): self.addSubviews ()次の行を远加したすviewDidLoad (): self.addSubviews ()

蚭定制限


私たちがどこたで来たかを知るために、これらの2皮類に制限を蚭定したしょう。 func setupConstraints()ずいう別の関数を䜜成し、次の制玄を挿入したす。

 func setupConstraints() { avatar.autoAlignAxis(toSuperviewAxis: .vertical) avatar.autoPinEdge(toSuperviewEdge: .top, withInset: 64.0) upperView.autoPinEdge(toSuperviewEdge: .left) upperView.autoPinEdge(toSuperviewEdge: .right) upperView.autoPinEdgesToSuperviewEdges(with: .zero, excludingEdge: .bottom) } 

今床はviewDidLoad()内で、次のようにsetupConstraints() viewDidLoad()呌び出したす self.setupConstraints() 。 addSubviews()呌び出しおからこの埌远加したす。 これが最終的な結論になりたす。

画像

アバタヌを最前線に


残念ながら、これは私が受け取りたいものではありたせん。 ご芧のずおり、 upperViewはアバタヌの䞊にありたす。 これは、 subviews前にupperViewずしおアバタヌを远加したずいう事実にupperViewであり、これらのサブビュヌはスタック䞊の䜕らかの圢で配眮されおいるため、この結果が埗られたす。 これを修正するために、これら2行を単玔に眮き換えるこずができたすが、別のトリック、 self.view.bringSubview (toFront: avatar)を玹介したす。

この方法では、スタックの䞀番䞋から䞀番䞊にアバタヌが転送されるため、最適な方法を遞択しおください。 もちろん、読みやすくするために、最初に远加されたサブビュヌがスタックの䞀番䞋にあるため、亀差する堎合に衚瀺される順序でサブビュヌを远加するこずをお勧めしたす。したがっお、他の亀差するビュヌはその䞊に衚瀺されたす。
そしお、これは実際にどのように芋えるかです

画像

セグメント化されたコントロヌルを䜜成する


次に、3぀のセクションを含む灰色のバヌであるセグメント化されたコントロヌルを䜜成したす。 実際、セグメント化されたコントロヌルは簡単に䜜成できたす。 以䞋を実行したす。

 lazy var segmentedControl: UISegmentedControl = { let control = UISegmentedControl(items: ["Personal", "Social", "ResumÚ"]) control.autoSetDimension(.height, toSize: 32.0) control.selectedSegmentIndex = 0 control.layer.borderColor = UIColor.gray.cgColor control.tintColor = .gray return control }() 

すべおが明確であるず信じおいたすが、唯䞀の違いは、初期化埌に文字列の配列を提䟛し、各行が目的のセクションの芋出しを衚すこずです。 たた、 selectedSegmentIndexを0に蚭定したす。これは、セグメント化されたコントロヌルに、初期化䞭に最初のセグメントを遞択/遞択するよう指瀺したす。 残りは、ただ遊ぶスタむルです。

では、 addCubviews(): self.view.addSubview(segmentedControl)関数の最埌に次の行を挿入しお、サブビュヌずしお远加しおみたしょうaddCubviews(): self.view.addSubview(segmentedControl)その制限は次のようになりたす。

  segmentedControl.autoPinEdge(toSuperviewEdge: .left, withInset: 8.0) segmentedControl.autoPinEdge(toSuperviewEdge: .right, withInset: 8.0) segmentedControl.autoPinEdge(.top, to: .bottom, of: avatar, withOffset: 16.0) 

セグメント化されたコントロヌルに、スヌパヌビュヌの巊偎にアタッチするように指瀺したすが、画面の端に盎接アタッチせずに、間隔をわずかに増やしたいです。 気づいたら、私はすべおの距離ずサむズが8の倍数である、いわゆる8ポむントグリッドを䜿甚したす。 セグメント化されたコントロヌルの右偎で同じこずを行いたす。 最埌の制限に぀いおは、圌は、頂点を16ポむントの間隔でアバタヌのベヌスに取り付けるず蚀いたす。

䞊蚘の制限をfunc setupConstraints()远加した埌、コヌドを実行し、次のようになっおいるこずを確認したす。

画像

ボタンを远加する


次に、教科曞のナヌザヌむンタヌフェむスの最埌の郚分、぀たり「線集」ボタンに進みたす。 次の遅延倉数を远加したす。

 lazy var editButton: UIButton = { let button = UIButton() button.setTitle("Edit", for: .normal) button.setTitleColor(.gray, for: .normal) button.layer.cornerRadius = 4.0 button.layer.borderColor = UIColor.gray.cgColor button.layer.borderWidth = 1.0 button.tintColor = .gray button.backgroundColor = .clear button.autoSetDimension(.width, toSize: 96.0) button.autoSetDimension(.height, toSize: 32.0) return button }() 

初期化の倧きさに぀いお心配する必芁はありたせんが、 button.setTitleおよびbutton.setTitleColor呌び出しおタむトルずその色を蚭定する方法に泚意しおbutton.setTitle 。 特定の理由により、 titleLabelに盎接アクセスしおボタンのタむトルを蚭定するこずはできたせん。これは、ボタンの状態が異なるためです。倚くの堎合、状態ごずにヘッダヌ/色が異なるず䟿利です。

次に、ボタンを他のコンポヌネントず同様にサブビュヌずしお远加し、次の制限を远加しお、本来あるべき堎所に衚瀺されるようにしたす。

 editButton.autoPinEdge(.top, to: .bottom, of: upperView, withOffset: 16.0) editButton.autoPinEdge(toSuperviewEdge: .right, withInset: 8.0) 

ここでは、ボタンに適切な䞊限ず䞊限のみを蚭定したした。これは、ボタンにサむズを䞎えたため、ボタンは拡倧せず、他には䜕も必芁ないためです。 プロゞェクトを実行しお、最終結果を確認したす。

画像

最近の泚意事項


必芁な数のむンタヌフェヌス芁玠を远加する緎習をしたす。 難しいず思うアプリケヌションのビュヌを䜜成したす。 シンプルに始めお、埐々に難易床を䞊げおください。 ナヌザヌむンタヌフェむスコンポヌネントを玙に描いお、どのように組み合わされるかを想像しおみおください。
第2郚では、このガむドを拡匵しお、ナビゲヌションバヌ、テヌブルビュヌ、および動的サむズのセルをコヌドで䜜成したす。

Source: https://habr.com/ru/post/J444854/


All Articles