ããã«ã¡ã¯ã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éšã§ã¯ããã®ã¬ã€ããæ¡åŒµããŠãããã²ãŒã·ã§ã³ããŒãããŒãã«ãã¥ãŒãããã³åçãµã€ãºã®ã»ã«ãã³ãŒãã§äœæããŸãã