├── .gitignore ├── .travis.yml ├── Info.plist ├── LICENSE ├── README.md ├── Sample ├── yavflSample-OSX │ ├── AppDelegate.swift │ ├── Base.lproj │ │ └── Main.storyboard │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ └── ViewController.swift └── yavflSample-iOS │ ├── AppDelegate.swift │ ├── Base.lproj │ └── Main.storyboard │ ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json │ ├── Info.plist │ └── ViewController.swift ├── Tests ├── yavflOSXTests │ ├── Info.plist │ └── yavflOSXTests.swift ├── yavflTests-tvos │ ├── Info.plist │ └── yavflTests_tvos.swift └── yavflTests │ ├── Info.plist │ └── yavflTests.swift ├── images └── layout_sample.png ├── yavfl.h ├── yavfl.playground ├── Contents.swift ├── contents.xcplayground └── timeline.xctimeline ├── yavfl.podspec ├── yavfl.swift └── yavfl.xcodeproj ├── project.pbxproj ├── project.xcworkspace └── contents.xcworkspacedata └── xcshareddata └── xcschemes ├── yavfl-OSX.xcscheme ├── yavfl-iOS.xcscheme └── yavfl-tvOS.xcscheme /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | *.xccheckout 14 | *.moved-aside 15 | DerivedData 16 | *.hmap 17 | *.ipa 18 | *.xcuserstate 19 | 20 | # CocoaPods 21 | # 22 | # We recommend against adding the Pods directory to your .gitignore. However 23 | # you should judge for yourself, the pros and cons are mentioned at: 24 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 25 | # 26 | # Pods/ 27 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | osx_image: xcode9 3 | 4 | script: 5 | - xcrun simctl list 6 | - set -o pipefail 7 | - xcodebuild -project yavfl.xcodeproj -scheme yavfl-iOS test -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPhone 6" | xcpretty -c 8 | - xcodebuild -project yavfl.xcodeproj -scheme yavfl-iOS test -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPhone 6s Plus" | xcpretty -c 9 | - xcodebuild -project yavfl.xcodeproj -scheme yavfl-iOS test -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Air" | xcpretty -c 10 | #- xcodebuild -project yavfl.xcodeproj -scheme yavfl-iOS test -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPad Pro" | xcpretty -c 11 | - xcodebuild -project yavfl.xcodeproj -scheme yavfl-tvOS test -sdk appletvsimulator -destination "platform=tvOS Simulator,name=Apple TV 1080p" | xcpretty -c 12 | - xcodebuild -project yavfl.xcodeproj -scheme yavfl-OSX test -sdk macosx | xcpretty -c 13 | - pod lib lint --quick 14 | 15 | after_success: 16 | - bash <(curl -s https://codecov.io/bash) 17 | -------------------------------------------------------------------------------- /Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # yavfl 2 | 3 | [![TravisCI](http://img.shields.io/travis/safx/yavfl.svg?style=flat)](https://travis-ci.org/safx/yavfl) 4 | [![codecov.io](http://codecov.io/github/safx/yavfl/coverage.svg?branch=master)](http://codecov.io/github/safx/yavfl?branch=master) 5 | ![Platform](https://img.shields.io/cocoapods/p/yavfl.svg?style=flat) 6 | ![License](https://img.shields.io/cocoapods/l/yavfl.svg?style=flat) 7 | ![Version](https://img.shields.io/cocoapods/v/yavfl.svg?style=flat) 8 | ![Carthage](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat) 9 | 10 | yavfl is Yet Anoter Visual Format Language for Auto Layout. 11 | 12 | ## Usage 13 | 14 | In yavfl, you can write the code of visual format language as follows: 15 | 16 | ```swift 17 | visualFormat(label, textField) { l, t in 18 | .v ~ |-40-[l,==32]; 19 | .v ~ |-40-[t,==32]; 20 | .h ~ |-20-[l,==t]-10-[t]-| 21 | } 22 | ``` 23 | 24 | * Trailing `;`s are needed since Xcode 7 beta 3 when you will write multiple statements in a block. 25 | 26 | ![](./images/layout_sample.png) 27 | 28 | The following code is the equivallent code of the original visual format: 29 | 30 | ```swift 31 | let dic = ["l": label, "t": textField] 32 | label.setTranslatesAutoresizingMaskIntoConstraints(false) 33 | textField.setTranslatesAutoresizingMaskIntoConstraints(false) 34 | let c1 = NSLayoutConstraint.constraintsWithVisualFormat("V:|-40-[l(32)]", options: nil, metrics: nil, views: dic) 35 | let c2 = NSLayoutConstraint.constraintsWithVisualFormat("V:|-40-[t(32)]", options: nil, metrics: nil, views: dic) 36 | let c3 = NSLayoutConstraint.constraintsWithVisualFormat("|-20-[l(==t)]-10-[t]-|", options: nil, metrics: nil, views: dic) 37 | self.view.addConstraints(c1) 38 | self.view.addConstraints(c2) 39 | self.view.addConstraints(c3) 40 | ``` 41 | 42 | If you aren't familiar with Visual Format Language, please visit [the original Visual Format Language page](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/VisualFormatLanguage/VisualFormatLanguage.html) first. 43 | 44 | ## More Examples 45 | 46 | | yavfl | origial | 47 | |-----------------------------------------------|-------------------------------------------| 48 | | `.h ~ [button]-[textField]` | `[button]-[textField]` | 49 | | `.h ~ [button,>=50]` | `[button(>=50)]` | 50 | | `.h ~ |-50-[purpleBox]-50-|` | `|-50-[purpleBox]-50-|` | 51 | | `.v ~ [topField]-10-[bottomField]` | `V:[topField]-10-[bottomField]` | 52 | | `.h ~ [maroonView]-0-[blueView]` | `[maroonView][blueView]` | 53 | | `.h ~ [button,==100~20]` | `[button(100@20)]` | 54 | | `.h ~ [button1,==button2]` | `[button1(==button2)]` | 55 | | `.h ~ [flexibleButton,>=70,<=100]` | `[flexibleButton(>=70,<=100)]` | 56 | | `.h ~ |-[find]-[findNext]-[findField,>=20]-|` | `|-[find]-[findNext]-[findField(>=20)]-|` | 57 | 58 | 59 | ## Limitations 60 | 61 | * Yavfl does not check syntatic validity. You don't expect the code is valid even if its compilation succeeded. 62 | * *Connection*'s *predicateList* supports only one *predicate*. 63 | * function `visualFormat` supports up to 5 views. 64 | 65 | ## Differences from the Original Visual Format Language 66 | 67 | Some parts of the syntax are changed due to Swift's syntax limitation. 68 | 69 | * Do not use `()` for view's *predicate*. 70 | * Use `[button1,==button2]` instead of `[button1(==button2)]`. 71 | * Use `~` instead of `:` for *orientation* and `@` for *priority*, because these can not be used for custom operators. 72 | * Use `.h ~ |-[view]-|` instead of `h:|-[view]-|`. 73 | * Use `[view,==100~200]` instead of `[view(==100@200)]`. 74 | * *Orientation* (`.h` or `.v`) and operator `~` are required for applying layout constraints. 75 | * Operator `~` is a trigger for creating and applying constraints. 76 | * *Connection* (`-`) is required between views. 77 | * `[v1][v2]` is not allowed due to the syntax limitation. Use `[v1]-0-[v2]` instead. 78 | * *Relation* (`==`, `<=` or `>=`) is required for *predicate*. 79 | * `[view,100]` is not allowed. Use `[view,==100]` instead. 80 | 81 | 82 | ## Install 83 | 84 | pod 'yavfl' 85 | 86 | Or, just copy `yavfl.swift` into your project. 87 | 88 | ## Other Resources (in Japanese) 89 | 90 | * [Blog article](http://safx-dev.blogspot.jp/2014/12/auto-layoutvisual-format-languageswift.html) 91 | * [Slide @ Speaker Deck](https://speakerdeck.com/matuyuji/visual-format-languageka-jian-dan-nishu-keruswiftraihurari-yavfl) 92 | -------------------------------------------------------------------------------- /Sample/yavflSample-OSX/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // yavflSample-OSX 4 | // 5 | // Created by Safx Developer on 2015/01/23. 6 | // Copyright (c) 2015 Safx Developers. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | @NSApplicationMain 12 | class AppDelegate: NSObject, NSApplicationDelegate { 13 | 14 | 15 | 16 | func applicationDidFinishLaunching(aNotification: NSNotification) { 17 | // Insert code here to initialize your application 18 | } 19 | 20 | func applicationWillTerminate(aNotification: NSNotification) { 21 | // Insert code here to tear down your application 22 | } 23 | 24 | 25 | } 26 | 27 | -------------------------------------------------------------------------------- /Sample/yavflSample-OSX/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | Default 510 | 511 | 512 | 513 | 514 | 515 | 516 | Left to Right 517 | 518 | 519 | 520 | 521 | 522 | 523 | Right to Left 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | Default 535 | 536 | 537 | 538 | 539 | 540 | 541 | Left to Right 542 | 543 | 544 | 545 | 546 | 547 | 548 | Right to Left 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | -------------------------------------------------------------------------------- /Sample/yavflSample-OSX/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "size" : "512x512", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "size" : "512x512", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /Sample/yavflSample-OSX/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2015年 Safx Developers. All rights reserved. 29 | NSMainStoryboardFile 30 | Main 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /Sample/yavflSample-OSX/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // yavflSample-OSX 4 | // 5 | // Created by Safx Developer on 2015/01/23. 6 | // Copyright (c) 2015 Safx Developers. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class ViewController: NSViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | // Do any additional setup after loading the view. 17 | let textField1 = NSTextField() 18 | let textField2 = NSTextField() 19 | 20 | textField1.stringValue = "Label" 21 | textField1.backgroundColor = NSColor.gray 22 | view.addSubview(textField1) 23 | view.addSubview(textField2) 24 | 25 | visualFormat(textField1, textField2) { l, t in 26 | .v ~ |-80-[l,==32]; 27 | .v ~ [t,==48]; 28 | .h ~ |-20-[l,==t]-10-[t]-| % .alignAllCenterY 29 | } 30 | } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /Sample/yavflSample-iOS/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // yavfl 4 | // 5 | // Created by Safx Developer on 2014/12/07. 6 | // Copyright (c) 2014 Safx Developers. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | } 17 | 18 | -------------------------------------------------------------------------------- /Sample/yavflSample-iOS/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Sample/yavflSample-iOS/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /Sample/yavflSample-iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /Sample/yavflSample-iOS/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // yavfl 4 | // 5 | // Created by Safx Developer on 2014/12/07. 6 | // Copyright (c) 2014 Safx Developers. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ViewController: UIViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | // Do any additional setup after loading the view, typically from a nib. 16 | 17 | let label = UILabel() 18 | let textField = UITextField() 19 | 20 | label.text = "Label" 21 | label.backgroundColor = UIColor.gray 22 | textField.placeholder = "Input some text" 23 | textField.borderStyle = .line 24 | view.addSubview(label) 25 | view.addSubview(textField) 26 | 27 | visualFormat(label, textField) { l, t in 28 | .v ~ |-80-[l,==32]; 29 | .v ~ [t,==48]; 30 | .h ~ |-20-[l,==t]-10-[t]-| % .alignAllCenterY 31 | } 32 | } 33 | 34 | override func didReceiveMemoryWarning() { 35 | super.didReceiveMemoryWarning() 36 | // Dispose of any resources that can be recreated. 37 | } 38 | 39 | } 40 | 41 | -------------------------------------------------------------------------------- /Tests/yavflOSXTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Tests/yavflOSXTests/yavflOSXTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // yavflOSXTests.swift 3 | // yavflOSXTests 4 | // 5 | // Created by Safx Developer on 2015/01/26. 6 | // Copyright (c) 2015年 Safx Developers. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | import XCTest 11 | @testable import yavfl 12 | 13 | extension LayoutViewName: Equatable {} 14 | public func == (lhs: LayoutViewName, rhs: LayoutViewName) -> Bool { 15 | return lhs.index == rhs.index && lhs.view === rhs.view 16 | } 17 | 18 | 19 | class yavflTests: XCTestCase { 20 | 21 | func vf(_ vf: VisualFormat) -> String { 22 | return vf.description 23 | } 24 | 25 | func opt(_ vf: VisualFormat) -> NSLayoutConstraint.FormatOptions { 26 | return vf.options 27 | } 28 | 29 | func rv(_ vf: VisualFormat) -> [LayoutViewName] { 30 | return vf.relatedViews 31 | } 32 | 33 | func testVisualFormat() { 34 | let x : ViewExpression = .view(LayoutViewName(view: NSView(), index: 1)) 35 | let y : ViewExpression = .view(LayoutViewName(view: NSView(), index: 2)) 36 | let z : ViewExpression = .view(LayoutViewName(view: NSView(), index: 3)) 37 | 38 | XCTAssertEqual(vf(|[x]|) , "|[v1]|") 39 | XCTAssertEqual(vf(|-[x]|) , "|-[v1]|") 40 | XCTAssertEqual(vf(|[x]-|) , "|[v1]-|") 41 | XCTAssertEqual(vf(|-[x]-|) , "|-[v1]-|") 42 | XCTAssertEqual(vf(|-10-[x]-20-|) , "|-10-[v1]-20-|") 43 | XCTAssertEqual(vf(|-(>=100)-[x]-0-|) , "|-(>=100)-[v1]-0-|") 44 | XCTAssertEqual(vf(|-[x]-(>=99)-|) , "|-[v1]-(>=99)-|") 45 | XCTAssertEqual(vf([x,<=y~1000]) , "[v1(<=v2@1000)]") 46 | XCTAssertEqual(vf(|-0-[x,==200]-[y]-|), "|-0-[v1(==200)]-[v2]-|") 47 | 48 | XCTAssertEqual(vf([x]-[y]) , "[v1]-[v2]") 49 | XCTAssertEqual(vf([x,>=50]) , "[v1(>=50)]") 50 | XCTAssertEqual(vf(|-50-[x]-50-|) , "|-50-[v1]-50-|") 51 | XCTAssertEqual(vf([x]-10-[y]) , "[v1]-10-[v2]") 52 | XCTAssertEqual(vf([x]-0-[y]) , "[v1]-0-[v2]") 53 | XCTAssertEqual(vf([x,==100~20]) , "[v1(==100@20)]") 54 | XCTAssertEqual(vf([x,==y]) , "[v1(==v2)]") 55 | XCTAssertEqual(vf([x,>=70,<=100]) , "[v1(>=70,<=100)]") 56 | XCTAssertEqual(vf(|-[x]-[y]-[z,>=20]-|) , "|-[v1]-[v2]-[v3(>=20)]-|") 57 | } 58 | 59 | func testRelatedViews() { 60 | let x_ = NSView() 61 | let y_ = NSView() 62 | let z_ = NSView() 63 | let xn = LayoutViewName(view: x_, index: 1) 64 | let yn = LayoutViewName(view: y_, index: 2) 65 | let zn = LayoutViewName(view: z_, index: 3) 66 | 67 | visualFormat(x_, y_, z_) { x, y, z in 68 | XCTAssertEqual(rv(|[x]|) , [xn]) 69 | XCTAssertEqual(rv(|-[x]|) , [xn]) 70 | XCTAssertEqual(rv(|[x]-|) , [xn]) 71 | XCTAssertEqual(rv(|-[x]-|) , [xn]) 72 | XCTAssertEqual(rv(|-10-[x]-20-|) , [xn]) 73 | XCTAssertEqual(rv(|-(>=100)-[x]-0-|) , [xn]) 74 | XCTAssertEqual(rv(|-[x]-(>=99)-|) , [xn]) 75 | XCTAssertEqual(rv([x,<=y~1000]) , [xn, yn]) 76 | XCTAssertEqual(rv(|-0-[x,==200]-[y]-|), [xn, yn]) 77 | 78 | XCTAssertEqual(rv([x]-[y]) , [xn, yn]) 79 | XCTAssertEqual(rv([x,>=50]) , [xn]) 80 | XCTAssertEqual(rv(|-50-[x]-50-|) , [xn]) 81 | XCTAssertEqual(rv([x]-10-[y]) , [xn, yn]) 82 | XCTAssertEqual(rv([x]-0-[y]) , [xn, yn]) 83 | XCTAssertEqual(rv([x,==100~20]) , [xn]) 84 | XCTAssertEqual(rv([x,==y]) , [xn, yn]) 85 | XCTAssertEqual(rv([x,>=70,<=100]) , [xn]) 86 | XCTAssertEqual(rv(|-[x]-[y]-[z,>=20]-|) , [xn, yn, zn]) 87 | } 88 | } 89 | 90 | func testOptions() { 91 | let x : ViewExpression = .view(LayoutViewName(view: NSView(), index: 1)) 92 | 93 | XCTAssertEqual(opt(|[x]|) , NSLayoutConstraint.FormatOptions()) 94 | XCTAssertEqual(opt(|[x]| % .alignAllCenterY), NSLayoutConstraint.FormatOptions.alignAllCenterY) 95 | } 96 | 97 | func testCapture() { 98 | let par = NSView() 99 | let v = NSView() 100 | par.addSubview(v) 101 | 102 | var q1: [AnyObject]? 103 | visualFormat(v) { v in 104 | q1 = .h ~ |-[v] 105 | } 106 | XCTAssertEqual((q1!).count, 1) 107 | 108 | var q2: [AnyObject]? 109 | visualFormat(v) { v in 110 | q2 = .h ~ |-[v]-| 111 | } 112 | XCTAssertEqual((q2!).count, 2) 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /Tests/yavflTests-tvos/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Tests/yavflTests-tvos/yavflTests_tvos.swift: -------------------------------------------------------------------------------- 1 | // 2 | // yavflTests_tvos.swift 3 | // yavflTests-tvos 4 | // 5 | // Created by Safx Developer on 2015/11/17. 6 | // Copyright © 2015年 Safx Developers. All rights reserved. 7 | // 8 | 9 | 10 | import UIKit 11 | import XCTest 12 | @testable import yavfl 13 | 14 | extension LayoutViewName: Equatable {} 15 | public func == (lhs: LayoutViewName, rhs: LayoutViewName) -> Bool { 16 | return lhs.index == rhs.index && lhs.view === rhs.view 17 | } 18 | 19 | 20 | class yavflTests: XCTestCase { 21 | 22 | func vf(_ vf: VisualFormat) -> String { 23 | return vf.description 24 | } 25 | 26 | func opt(_ vf: VisualFormat) -> NSLayoutFormatOptions { 27 | return vf.options 28 | } 29 | 30 | func rv(_ vf: VisualFormat) -> [LayoutViewName] { 31 | return vf.relatedViews 32 | } 33 | 34 | func testVisualFormat() { 35 | let x : ViewExpression = .view(LayoutViewName(view: UIView(), index: 1)) 36 | let y : ViewExpression = .view(LayoutViewName(view: UIView(), index: 2)) 37 | let z : ViewExpression = .view(LayoutViewName(view: UIView(), index: 3)) 38 | 39 | XCTAssertEqual(vf(|[x]|) , "|[v1]|") 40 | XCTAssertEqual(vf(|-[x]|) , "|-[v1]|") 41 | XCTAssertEqual(vf(|[x]-|) , "|[v1]-|") 42 | XCTAssertEqual(vf(|-[x]-|) , "|-[v1]-|") 43 | XCTAssertEqual(vf(|-10-[x]-20-|) , "|-10-[v1]-20-|") 44 | XCTAssertEqual(vf(|-(>=100)-[x]-0-|) , "|-(>=100)-[v1]-0-|") 45 | XCTAssertEqual(vf(|-[x]-(>=99)-|) , "|-[v1]-(>=99)-|") 46 | XCTAssertEqual(vf([x,<=y~1000]) , "[v1(<=v2@1000)]") 47 | XCTAssertEqual(vf(|-0-[x,==200]-[y]-|), "|-0-[v1(==200)]-[v2]-|") 48 | 49 | XCTAssertEqual(vf([x]-[y]) , "[v1]-[v2]") 50 | XCTAssertEqual(vf([x,>=50]) , "[v1(>=50)]") 51 | XCTAssertEqual(vf(|-50-[x]-50-|) , "|-50-[v1]-50-|") 52 | XCTAssertEqual(vf([x]-10-[y]) , "[v1]-10-[v2]") 53 | XCTAssertEqual(vf([x]-0-[y]) , "[v1]-0-[v2]") 54 | XCTAssertEqual(vf([x,==100~20]) , "[v1(==100@20)]") 55 | XCTAssertEqual(vf([x,==y]) , "[v1(==v2)]") 56 | XCTAssertEqual(vf([x,>=70,<=100]) , "[v1(>=70,<=100)]") 57 | XCTAssertEqual(vf(|-[x]-[y]-[z,>=20]-|) , "|-[v1]-[v2]-[v3(>=20)]-|") 58 | } 59 | 60 | func testRelatedViews() { 61 | let x_ = UIView() 62 | let y_ = UIView() 63 | let z_ = UIView() 64 | let xn = LayoutViewName(view: x_, index: 1) 65 | let yn = LayoutViewName(view: y_, index: 2) 66 | let zn = LayoutViewName(view: z_, index: 3) 67 | 68 | visualFormat(x_, y_, z_) { x, y, z in 69 | XCTAssertEqual(rv(|[x]|) , [xn]) 70 | XCTAssertEqual(rv(|-[x]|) , [xn]) 71 | XCTAssertEqual(rv(|[x]-|) , [xn]) 72 | XCTAssertEqual(rv(|-[x]-|) , [xn]) 73 | XCTAssertEqual(rv(|-10-[x]-20-|) , [xn]) 74 | XCTAssertEqual(rv(|-(>=100)-[x]-0-|) , [xn]) 75 | XCTAssertEqual(rv(|-[x]-(>=99)-|) , [xn]) 76 | XCTAssertEqual(rv([x,<=y~1000]) , [xn, yn]) 77 | XCTAssertEqual(rv(|-0-[x,==200]-[y]-|), [xn, yn]) 78 | 79 | XCTAssertEqual(rv([x]-[y]) , [xn, yn]) 80 | XCTAssertEqual(rv([x,>=50]) , [xn]) 81 | XCTAssertEqual(rv(|-50-[x]-50-|) , [xn]) 82 | XCTAssertEqual(rv([x]-10-[y]) , [xn, yn]) 83 | XCTAssertEqual(rv([x]-0-[y]) , [xn, yn]) 84 | XCTAssertEqual(rv([x,==100~20]) , [xn]) 85 | XCTAssertEqual(rv([x,==y]) , [xn, yn]) 86 | XCTAssertEqual(rv([x,>=70,<=100]) , [xn]) 87 | XCTAssertEqual(rv(|-[x]-[y]-[z,>=20]-|) , [xn, yn, zn]) 88 | } 89 | } 90 | 91 | func testOptions() { 92 | let x : ViewExpression = .view(LayoutViewName(view: UIView(), index: 1)) 93 | 94 | XCTAssertEqual(opt(|[x]|) , NSLayoutFormatOptions()) 95 | XCTAssertEqual(opt(|[x]| % .alignAllCenterY), NSLayoutFormatOptions.alignAllCenterY) 96 | } 97 | 98 | func testCapture() { 99 | let par = UIView() 100 | let v = UIView() 101 | par.addSubview(v) 102 | 103 | var q1: [AnyObject]? 104 | visualFormat(v) { v in 105 | q1 = .h ~ |-[v] 106 | } 107 | XCTAssertEqual((q1!).count, 1) 108 | 109 | var q2: [AnyObject]? 110 | visualFormat(v) { v in 111 | q2 = .h ~ |-[v]-| 112 | } 113 | XCTAssertEqual((q2!).count, 2) 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /Tests/yavflTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Tests/yavflTests/yavflTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // yavflTests.swift 3 | // yavflTests 4 | // 5 | // Created by Safx Developer on 2015/01/26. 6 | // Copyright (c) 2015年 Safx Developers. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import XCTest 11 | @testable import yavfl 12 | 13 | extension LayoutViewName: Equatable {} 14 | public func == (lhs: LayoutViewName, rhs: LayoutViewName) -> Bool { 15 | return lhs.index == rhs.index && lhs.view === rhs.view 16 | } 17 | 18 | 19 | class yavflTests: XCTestCase { 20 | 21 | func vf(_ vf: VisualFormat) -> String { 22 | return vf.description 23 | } 24 | 25 | func opt(_ vf: VisualFormat) -> NSLayoutFormatOptions { 26 | return vf.options 27 | } 28 | 29 | func rv(_ vf: VisualFormat) -> [LayoutViewName] { 30 | return vf.relatedViews 31 | } 32 | 33 | func testVisualFormat() { 34 | let x : ViewExpression = .view(LayoutViewName(view: UIView(), index: 1)) 35 | let y : ViewExpression = .view(LayoutViewName(view: UIView(), index: 2)) 36 | let z : ViewExpression = .view(LayoutViewName(view: UIView(), index: 3)) 37 | 38 | XCTAssertEqual(vf(|[x]|) , "|[v1]|") 39 | XCTAssertEqual(vf(|-[x]|) , "|-[v1]|") 40 | XCTAssertEqual(vf(|[x]-|) , "|[v1]-|") 41 | XCTAssertEqual(vf(|-[x]-|) , "|-[v1]-|") 42 | XCTAssertEqual(vf(|-10-[x]-20-|) , "|-10-[v1]-20-|") 43 | XCTAssertEqual(vf(|-(>=100)-[x]-0-|) , "|-(>=100)-[v1]-0-|") 44 | XCTAssertEqual(vf(|-[x]-(>=99)-|) , "|-[v1]-(>=99)-|") 45 | XCTAssertEqual(vf([x,<=y~1000]) , "[v1(<=v2@1000)]") 46 | XCTAssertEqual(vf(|-0-[x,==200]-[y]-|), "|-0-[v1(==200)]-[v2]-|") 47 | 48 | XCTAssertEqual(vf([x]-[y]) , "[v1]-[v2]") 49 | XCTAssertEqual(vf([x,>=50]) , "[v1(>=50)]") 50 | XCTAssertEqual(vf(|-50-[x]-50-|) , "|-50-[v1]-50-|") 51 | XCTAssertEqual(vf([x]-10-[y]) , "[v1]-10-[v2]") 52 | XCTAssertEqual(vf([x]-0-[y]) , "[v1]-0-[v2]") 53 | XCTAssertEqual(vf([x,==100~20]) , "[v1(==100@20)]") 54 | XCTAssertEqual(vf([x,==y]) , "[v1(==v2)]") 55 | XCTAssertEqual(vf([x,>=70,<=100]) , "[v1(>=70,<=100)]") 56 | XCTAssertEqual(vf(|-[x]-[y]-[z,>=20]-|) , "|-[v1]-[v2]-[v3(>=20)]-|") 57 | } 58 | 59 | func testRelatedViews() { 60 | let x_ = UIView() 61 | let y_ = UIView() 62 | let z_ = UIView() 63 | let xn = LayoutViewName(view: x_, index: 1) 64 | let yn = LayoutViewName(view: y_, index: 2) 65 | let zn = LayoutViewName(view: z_, index: 3) 66 | 67 | visualFormat(x_, y_, z_) { x, y, z in 68 | XCTAssertEqual(rv(|[x]|) , [xn]) 69 | XCTAssertEqual(rv(|-[x]|) , [xn]) 70 | XCTAssertEqual(rv(|[x]-|) , [xn]) 71 | XCTAssertEqual(rv(|-[x]-|) , [xn]) 72 | XCTAssertEqual(rv(|-10-[x]-20-|) , [xn]) 73 | XCTAssertEqual(rv(|-(>=100)-[x]-0-|) , [xn]) 74 | XCTAssertEqual(rv(|-[x]-(>=99)-|) , [xn]) 75 | XCTAssertEqual(rv([x,<=y~1000]) , [xn, yn]) 76 | XCTAssertEqual(rv(|-0-[x,==200]-[y]-|), [xn, yn]) 77 | 78 | XCTAssertEqual(rv([x]-[y]) , [xn, yn]) 79 | XCTAssertEqual(rv([x,>=50]) , [xn]) 80 | XCTAssertEqual(rv(|-50-[x]-50-|) , [xn]) 81 | XCTAssertEqual(rv([x]-10-[y]) , [xn, yn]) 82 | XCTAssertEqual(rv([x]-0-[y]) , [xn, yn]) 83 | XCTAssertEqual(rv([x,==100~20]) , [xn]) 84 | XCTAssertEqual(rv([x,==y]) , [xn, yn]) 85 | XCTAssertEqual(rv([x,>=70,<=100]) , [xn]) 86 | XCTAssertEqual(rv(|-[x]-[y]-[z,>=20]-|) , [xn, yn, zn]) 87 | } 88 | } 89 | 90 | func testOptions() { 91 | let x : ViewExpression = .view(LayoutViewName(view: UIView(), index: 1)) 92 | 93 | XCTAssertEqual(opt(|[x]|) , NSLayoutFormatOptions()) 94 | XCTAssertEqual(opt(|[x]| % .alignAllCenterY), NSLayoutFormatOptions.alignAllCenterY) 95 | } 96 | 97 | func testCapture() { 98 | let par = UIView() 99 | let v = UIView() 100 | par.addSubview(v) 101 | 102 | var q1: [AnyObject]? 103 | visualFormat(v) { v in 104 | q1 = .h ~ |-[v] 105 | } 106 | XCTAssertEqual((q1!).count, 1) 107 | 108 | var q2: [AnyObject]? 109 | visualFormat(v) { v in 110 | q2 = .h ~ |-[v]-| 111 | } 112 | XCTAssertEqual((q2!).count, 2) 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /images/layout_sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/safx/yavfl/bf89bfebed8cecaf0c5a383d56120f7c17ebb9de/images/layout_sample.png -------------------------------------------------------------------------------- /yavfl.h: -------------------------------------------------------------------------------- 1 | // 2 | // yavfl.h 3 | // yavfl 4 | // 5 | // Created by Safx Developer on 2015/11/17. 6 | // Copyright © 2015年 Safx Developers. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for yavfl-tvos. 12 | FOUNDATION_EXPORT double yavfl_VersionNumber; 13 | 14 | //! Project version string for yavfl-tvos. 15 | FOUNDATION_EXPORT const unsigned char yavfl_VersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /yavfl.playground/Contents.swift: -------------------------------------------------------------------------------- 1 | // Playground - noun: a place where people can play 2 | 3 | import UIKit 4 | import XCPlayground 5 | import yavfl 6 | 7 | func Root(color: UIColor = .red) -> UIView { 8 | let v = UIView(frame: CGRect(x: 0, y: 0, width: 280, height: 150)) 9 | v.layer.borderWidth = 1 10 | v.backgroundColor = .white 11 | return v 12 | } 13 | 14 | let root = Root() 15 | 16 | func View(text: String, color: UIColor = .red) -> UIView { 17 | let v = UILabel() 18 | v.text = text 19 | v.textAlignment = .center 20 | v.layer.borderWidth = 1 21 | v.layer.borderColor = color.cgColor 22 | root.addSubview(v) 23 | return v 24 | } 25 | 26 | 27 | let x = View(text: "x", color: .blue) 28 | let y = View(text: "y", color: .green) 29 | 30 | //: ### Sample 1 31 | visualFormat(x, y) { x, y in 32 | .v ~ |-20-[x,==80]; 33 | .v ~ [y,==50]; 34 | .h ~ |-20-[x,==y]-10-[y]-20-| % .alignAllCenterY 35 | } 36 | 37 | 38 | XCPlaygroundPage.currentPage.liveView = root 39 | root 40 | -------------------------------------------------------------------------------- /yavfl.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /yavfl.playground/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 29 | 30 | 34 | 35 | 39 | 40 | 44 | 45 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /yavfl.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "yavfl" 3 | s.version = "0.2.0" 4 | s.summary = "Yet Anoter Visual Format Language for Auto Layout in Swift" 5 | s.homepage = "https://github.com/safx/yavfl" 6 | s.license = { :type => "MIT", :file => "LICENSE" } 7 | s.author = { "MATSUMOTO Yuji" => "safxdev@gmail.com" } 8 | s.source = { :git => "https://github.com/safx/yavfl.git", :tag => s.version } 9 | s.source_files = "yavfl.swift" 10 | s.framework = 'Foundation' 11 | s.ios.deployment_target = "8.0" 12 | s.tvos.deployment_target = "9.0" 13 | s.osx.deployment_target = "10.10" 14 | s.requires_arc = true 15 | end 16 | -------------------------------------------------------------------------------- /yavfl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // yavfl.swift 3 | // 4 | // yavfl : Yet Another Visual Format Language for Auto layout 5 | // 6 | // Created by Safx Developer on 2014/12/08. 7 | // Copyright (c) 2014 Safx Developers. All rights reserved. 8 | // 9 | 10 | 11 | import Foundation 12 | 13 | #if os(iOS) || os(tvOS) 14 | import UIKit 15 | public typealias YAVView = UIView 16 | public typealias LayoutFormatOptions = NSLayoutFormatOptions 17 | #else 18 | import AppKit 19 | public typealias YAVView = NSView 20 | public typealias LayoutFormatOptions = NSLayoutConstraint.FormatOptions 21 | #endif 22 | 23 | public func visualFormat(_ v1: YAVView, 24 | closure: (ViewExpression) -> ()) { 25 | v1.translatesAutoresizingMaskIntoConstraints = false 26 | 27 | closure(.view(LayoutViewName(view: v1, index: 1))) 28 | 29 | v1.updateConstraints() 30 | } 31 | 32 | public func visualFormat(_ v1: YAVView, _ v2: YAVView, 33 | closure: (ViewExpression, ViewExpression) -> ()) { 34 | v1.translatesAutoresizingMaskIntoConstraints = false 35 | v2.translatesAutoresizingMaskIntoConstraints = false 36 | 37 | closure(.view(LayoutViewName(view: v1, index: 1)), 38 | .view(LayoutViewName(view: v2, index: 2))) 39 | 40 | v1.updateConstraints() 41 | v2.updateConstraints() 42 | } 43 | 44 | public func visualFormat(_ v1: YAVView, _ v2: YAVView, _ v3: YAVView, 45 | closure: (ViewExpression, ViewExpression, ViewExpression) -> ()) { 46 | v1.translatesAutoresizingMaskIntoConstraints = false 47 | v2.translatesAutoresizingMaskIntoConstraints = false 48 | v3.translatesAutoresizingMaskIntoConstraints = false 49 | 50 | closure(.view(LayoutViewName(view: v1, index: 1)), 51 | .view(LayoutViewName(view: v2, index: 2)), 52 | .view(LayoutViewName(view: v3, index: 3))) 53 | 54 | v1.updateConstraints() 55 | v2.updateConstraints() 56 | v3.updateConstraints() 57 | } 58 | 59 | public func visualFormat(_ v1: YAVView, _ v2: YAVView, _ v3: YAVView, _ v4: YAVView, 60 | closure: (ViewExpression, ViewExpression, ViewExpression, ViewExpression) -> ()) { 61 | v1.translatesAutoresizingMaskIntoConstraints = false 62 | v2.translatesAutoresizingMaskIntoConstraints = false 63 | v3.translatesAutoresizingMaskIntoConstraints = false 64 | v4.translatesAutoresizingMaskIntoConstraints = false 65 | 66 | closure(.view(LayoutViewName(view: v1, index: 1)), 67 | .view(LayoutViewName(view: v2, index: 2)), 68 | .view(LayoutViewName(view: v3, index: 3)), 69 | .view(LayoutViewName(view: v4, index: 4))) 70 | 71 | v1.updateConstraints() 72 | v2.updateConstraints() 73 | v3.updateConstraints() 74 | v4.updateConstraints() 75 | } 76 | 77 | public func visualFormat(_ v1: YAVView, _ v2: YAVView, _ v3: YAVView, _ v4: YAVView, _ v5: YAVView, 78 | closure: (ViewExpression, ViewExpression, ViewExpression, ViewExpression, ViewExpression) -> ()) { 79 | v1.translatesAutoresizingMaskIntoConstraints = false 80 | v2.translatesAutoresizingMaskIntoConstraints = false 81 | v3.translatesAutoresizingMaskIntoConstraints = false 82 | v4.translatesAutoresizingMaskIntoConstraints = false 83 | v5.translatesAutoresizingMaskIntoConstraints = false 84 | 85 | closure(.view(LayoutViewName(view: v1, index: 1)), 86 | .view(LayoutViewName(view: v2, index: 2)), 87 | .view(LayoutViewName(view: v3, index: 3)), 88 | .view(LayoutViewName(view: v4, index: 4)), 89 | .view(LayoutViewName(view: v5, index: 5))) 90 | 91 | v1.updateConstraints() 92 | v2.updateConstraints() 93 | v3.updateConstraints() 94 | v4.updateConstraints() 95 | v5.updateConstraints() 96 | } 97 | 98 | // MARK: 99 | 100 | public enum ViewExpression { 101 | case view(LayoutViewName) 102 | case predicate(LayoutPredicate) 103 | } 104 | 105 | // MARK: 106 | 107 | public struct LayoutViewName : CustomStringConvertible { 108 | internal let view: YAVView 109 | internal let index: Int 110 | 111 | public var description: String { 112 | return "v" + String(index) 113 | } 114 | } 115 | 116 | // MARK: 117 | 118 | public struct LayoutPredicate : CustomStringConvertible { 119 | fileprivate let relation: LayoutRelation 120 | fileprivate let object: LayoutObjectOfPredicate 121 | fileprivate let priority: Int? 122 | 123 | public var description: String { 124 | let d = relation.rawValue + object.description 125 | guard let p = priority else { return d } 126 | return d + "@" + String(p) 127 | } 128 | } 129 | 130 | // MARK: 131 | 132 | public enum LayoutRelation : String { 133 | case equal = "==" 134 | case greaterThanOrEqual = ">=" 135 | case lessThanOrEqual = "<=" 136 | } 137 | 138 | // MARK: 139 | 140 | public enum LayoutObjectOfPredicate : CustomStringConvertible { 141 | case constant(Int) 142 | case view(LayoutViewName) 143 | 144 | public var description: String { 145 | switch self { 146 | case .constant(let n): return String(n) 147 | case .view(let view): return view.description 148 | } 149 | } 150 | } 151 | 152 | // MARK: 153 | 154 | public enum LayoutOrientation : String { 155 | case v = "V" 156 | case h = "H" 157 | } 158 | 159 | // MARK: 160 | 161 | public struct LayoutView : CustomStringConvertible { 162 | fileprivate let view: LayoutViewName 163 | fileprivate let predicates: [LayoutPredicate] 164 | 165 | public var description: String { 166 | let v = view.description 167 | if predicates.isEmpty { return v } 168 | return v + "(" + predicates.map { $0.description } .joined(separator: ",") + ")" 169 | } 170 | 171 | internal var relatedViews: [LayoutViewName] { 172 | return [view] + predicates.flatMap { e -> LayoutViewName? in 173 | switch e.object { 174 | case .view(let v): return v 175 | default: return nil 176 | } 177 | } 178 | } 179 | 180 | fileprivate init(_ elements: [ViewExpression]) { 181 | guard let view_part = elements.first, case let .view(v) = view_part else { 182 | fatalError("View expected") 183 | } 184 | view = v 185 | 186 | let pred_part = elements.dropFirst() 187 | predicates = pred_part.map { e in 188 | if case let .predicate(p) = e { return p } 189 | fatalError("Predicate expected") 190 | } 191 | } 192 | } 193 | 194 | // MARK: 195 | 196 | public enum VisualFormat : CustomStringConvertible, ExpressibleByIntegerLiteral, ExpressibleByArrayLiteral { 197 | case superview 198 | case view(LayoutView) 199 | case connection 200 | case predicate(LayoutPredicate) 201 | case number(Int) 202 | case composition([VisualFormat]) 203 | case options(LayoutFormatOptions) 204 | 205 | public var description: String { 206 | switch self { 207 | case .superview: return "|" 208 | case .view(let v): return "[" + v.description + "]" 209 | case .connection: return "-" 210 | case .predicate(let p): return "(" + p.description + ")" 211 | case .number(let n): return String(n) 212 | case .composition(let c): return c.map { $0.description } .joined(separator: "") 213 | case .options: return "" 214 | } 215 | } 216 | 217 | // FIXME: report error for multiple options 218 | internal var options: LayoutFormatOptions { 219 | switch self { 220 | case .options(let opts): return opts 221 | case .composition(let c): 222 | for case let .options(o) in c { return o } 223 | default: () 224 | } 225 | return LayoutFormatOptions() 226 | } 227 | 228 | internal var relatedViews: [LayoutViewName] { 229 | switch self { 230 | case .view(let v): return v.relatedViews 231 | case .composition(let c): return c.flatMap { $0.relatedViews } 232 | default: return [] 233 | } 234 | } 235 | 236 | internal var viewsDictionary: [String:AnyObject] { 237 | var d = [String:AnyObject]() 238 | relatedViews.forEach { d[$0.description] = $0.view } 239 | return d 240 | } 241 | 242 | public init(integerLiteral value: IntegerLiteralType) { 243 | self = .number(value) 244 | } 245 | 246 | public init(arrayLiteral elements: ViewExpression...) { 247 | self = .view(LayoutView(elements)) 248 | } 249 | 250 | fileprivate init(composition elements: VisualFormat...) { 251 | let t = elements.flatMap { e -> [VisualFormat] in 252 | switch e { 253 | case .composition(let c): return c 254 | default: return [e] 255 | } 256 | } 257 | self = .composition(t) 258 | } 259 | } 260 | 261 | // MARK: helper funcs 262 | 263 | private func createVisualFormatPredicate(view: ViewExpression, priority: Int? = nil) -> VisualFormat { 264 | if case let .predicate(p) = view { 265 | return .predicate(LayoutPredicate(relation: p.relation, object: p.object, priority: priority)) 266 | } 267 | fatalError("Error") 268 | } 269 | 270 | private func createViewExpressionPredicate(view: ViewExpression, relation: LayoutRelation) -> ViewExpression { 271 | if case let .view(v) = view { 272 | return .predicate(LayoutPredicate(relation: relation, object: .view(v), priority: nil)) 273 | } 274 | fatalError("Error") 275 | } 276 | 277 | // MARK: - operators 278 | 279 | prefix operator | 280 | 281 | public prefix func |(e: VisualFormat) -> VisualFormat { 282 | return VisualFormat(composition: .superview, e) 283 | } 284 | 285 | 286 | postfix operator | 287 | 288 | public postfix func |(e: VisualFormat) -> VisualFormat { 289 | return VisualFormat(composition: e, .superview) 290 | } 291 | 292 | 293 | prefix operator |- 294 | 295 | public prefix func |-(e: VisualFormat) -> VisualFormat { 296 | return VisualFormat(composition: .superview, .connection, e) 297 | } 298 | 299 | public prefix func |-(e: (ViewExpression)) -> VisualFormat { 300 | return VisualFormat(composition: .superview, .connection, createVisualFormatPredicate(view: e)) 301 | } 302 | 303 | 304 | postfix operator -| 305 | 306 | public postfix func -|(e: VisualFormat) -> VisualFormat { 307 | return VisualFormat(composition: e, .connection, .superview) 308 | } 309 | 310 | public postfix func -|(e: (ViewExpression)) -> VisualFormat { 311 | return VisualFormat(composition: createVisualFormatPredicate(view: e), .connection, .superview) 312 | } 313 | 314 | //infix operator -: AdditionPrecedence 315 | 316 | public func -(lhs: VisualFormat, rhs: VisualFormat) -> VisualFormat { 317 | return VisualFormat(composition: lhs, .connection, rhs) 318 | } 319 | 320 | public func -(lhs: VisualFormat, rhs: (ViewExpression)) -> VisualFormat { 321 | return VisualFormat(composition: lhs, .connection, createVisualFormatPredicate(view: rhs)) 322 | } 323 | 324 | 325 | prefix operator == 326 | 327 | public prefix func ==(n: Int) -> ViewExpression { 328 | return .predicate(LayoutPredicate(relation: .equal, object: .constant(n), priority: nil)) 329 | } 330 | 331 | public prefix func ==(view: ViewExpression) -> ViewExpression { 332 | return createViewExpressionPredicate(view: view, relation: .equal) 333 | } 334 | 335 | 336 | prefix operator <= 337 | 338 | public prefix func <=(n: Int) -> ViewExpression { 339 | return .predicate(LayoutPredicate(relation: .lessThanOrEqual, object: .constant(n), priority: nil)) 340 | } 341 | 342 | public prefix func <=(view: ViewExpression) -> ViewExpression { 343 | return createViewExpressionPredicate(view: view, relation: .lessThanOrEqual) 344 | } 345 | 346 | 347 | prefix operator >= 348 | 349 | public prefix func >=(n: Int) -> ViewExpression { 350 | return .predicate(LayoutPredicate(relation: .greaterThanOrEqual, object: .constant(n), priority: nil)) 351 | } 352 | 353 | public prefix func >=(view: ViewExpression) -> ViewExpression { 354 | return createViewExpressionPredicate(view: view, relation: .greaterThanOrEqual) 355 | } 356 | 357 | 358 | //infix operator % {} 359 | 360 | public func %(lhs: VisualFormat, rhs: LayoutFormatOptions) -> VisualFormat { 361 | return VisualFormat(composition: lhs, .options(rhs)) 362 | } 363 | 364 | 365 | infix operator ~: AssignmentPrecedence 366 | 367 | @discardableResult 368 | public func ~(lhs: ViewExpression, rhs: Int) -> ViewExpression { 369 | if case let .predicate(p) = lhs { 370 | return .predicate(LayoutPredicate(relation: p.relation, object: p.object, priority: rhs)) 371 | } 372 | fatalError("Error") 373 | } 374 | 375 | @discardableResult 376 | public func ~(lhs: LayoutOrientation, rhs: VisualFormat) -> [AnyObject] { 377 | let exp = lhs.rawValue + ":" + rhs.description 378 | let c = NSLayoutConstraint.constraints(withVisualFormat: exp, options: rhs.options, metrics: nil, views: rhs.viewsDictionary) 379 | NSLayoutConstraint.activate(c) 380 | return c 381 | } 382 | -------------------------------------------------------------------------------- /yavfl.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 8D556EF71A727791004FA111 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D556EF61A727791004FA111 /* AppDelegate.swift */; }; 11 | 8D556EF91A727791004FA111 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D556EF81A727791004FA111 /* ViewController.swift */; }; 12 | 8D556EFB1A727791004FA111 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8D556EFA1A727791004FA111 /* Images.xcassets */; }; 13 | 8D556EFE1A727791004FA111 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8D556EFC1A727791004FA111 /* Main.storyboard */; }; 14 | 8D7AC98E1A7547BB00574AAC /* yavfl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D7AC9831A7547BB00574AAC /* yavfl.framework */; }; 15 | 8D7AC9971A7547BC00574AAC /* yavflTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D7AC9961A7547BB00574AAC /* yavflTests.swift */; }; 16 | 8D7AC99A1A7547BC00574AAC /* yavfl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D7AC9831A7547BB00574AAC /* yavfl.framework */; }; 17 | 8D7AC99B1A7547BC00574AAC /* yavfl.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8D7AC9831A7547BB00574AAC /* yavfl.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 18 | 8D7AC9A21A7547C300574AAC /* yavfl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DF1B0F71A349D2500295741 /* yavfl.swift */; }; 19 | 8D7AC9B41A75495900574AAC /* yavfl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D7AC9A91A75495900574AAC /* yavfl.framework */; }; 20 | 8D7AC9BD1A75495900574AAC /* yavflOSXTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D7AC9BC1A75495900574AAC /* yavflOSXTests.swift */; }; 21 | 8D7AC9C01A75495900574AAC /* yavfl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D7AC9A91A75495900574AAC /* yavfl.framework */; }; 22 | 8D7AC9C11A75495900574AAC /* yavfl.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8D7AC9A91A75495900574AAC /* yavfl.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 23 | 8D7AC9C81A75496F00574AAC /* yavfl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DF1B0F71A349D2500295741 /* yavfl.swift */; }; 24 | 8DEC2B511BFB58E40083EC9D /* yavfl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DF1B0F71A349D2500295741 /* yavfl.swift */; }; 25 | 8DEC2B591BFB594F0083EC9D /* yavflTests_tvos.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DEC2B581BFB594F0083EC9D /* yavflTests_tvos.swift */; }; 26 | 8DEC2B5B1BFB594F0083EC9D /* yavfl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DEC2B451BFB57D00083EC9D /* yavfl.framework */; }; 27 | 8DF1B0D71A349BC200295741 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DF1B0D61A349BC200295741 /* AppDelegate.swift */; }; 28 | 8DF1B0D91A349BC200295741 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DF1B0D81A349BC200295741 /* ViewController.swift */; }; 29 | 8DF1B0DC1A349BC200295741 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8DF1B0DA1A349BC200295741 /* Main.storyboard */; }; 30 | 8DF1B0DE1A349BC200295741 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8DF1B0DD1A349BC200295741 /* Images.xcassets */; }; 31 | 8DF2D42D1B2AF45B005D77DC /* yavfl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DF1B0F71A349D2500295741 /* yavfl.swift */; }; 32 | 8DF2D42E1B2AF45C005D77DC /* yavfl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DF1B0F71A349D2500295741 /* yavfl.swift */; }; 33 | /* End PBXBuildFile section */ 34 | 35 | /* Begin PBXContainerItemProxy section */ 36 | 8D7AC98F1A7547BB00574AAC /* PBXContainerItemProxy */ = { 37 | isa = PBXContainerItemProxy; 38 | containerPortal = 8DF1B0C91A349BC200295741 /* Project object */; 39 | proxyType = 1; 40 | remoteGlobalIDString = 8D7AC9821A7547BB00574AAC; 41 | remoteInfo = yavfl; 42 | }; 43 | 8D7AC9911A7547BB00574AAC /* PBXContainerItemProxy */ = { 44 | isa = PBXContainerItemProxy; 45 | containerPortal = 8DF1B0C91A349BC200295741 /* Project object */; 46 | proxyType = 1; 47 | remoteGlobalIDString = 8DF1B0D01A349BC200295741; 48 | remoteInfo = "yavflSample-iOS"; 49 | }; 50 | 8D7AC9981A7547BC00574AAC /* PBXContainerItemProxy */ = { 51 | isa = PBXContainerItemProxy; 52 | containerPortal = 8DF1B0C91A349BC200295741 /* Project object */; 53 | proxyType = 1; 54 | remoteGlobalIDString = 8D7AC9821A7547BB00574AAC; 55 | remoteInfo = yavfl; 56 | }; 57 | 8D7AC9B51A75495900574AAC /* PBXContainerItemProxy */ = { 58 | isa = PBXContainerItemProxy; 59 | containerPortal = 8DF1B0C91A349BC200295741 /* Project object */; 60 | proxyType = 1; 61 | remoteGlobalIDString = 8D7AC9A81A75495900574AAC; 62 | remoteInfo = yavflOSX; 63 | }; 64 | 8D7AC9B71A75495900574AAC /* PBXContainerItemProxy */ = { 65 | isa = PBXContainerItemProxy; 66 | containerPortal = 8DF1B0C91A349BC200295741 /* Project object */; 67 | proxyType = 1; 68 | remoteGlobalIDString = 8D556EF11A727791004FA111; 69 | remoteInfo = "yavflSample-OSX"; 70 | }; 71 | 8D7AC9BE1A75495900574AAC /* PBXContainerItemProxy */ = { 72 | isa = PBXContainerItemProxy; 73 | containerPortal = 8DF1B0C91A349BC200295741 /* Project object */; 74 | proxyType = 1; 75 | remoteGlobalIDString = 8D7AC9A81A75495900574AAC; 76 | remoteInfo = yavflOSX; 77 | }; 78 | 8DEC2B5C1BFB594F0083EC9D /* PBXContainerItemProxy */ = { 79 | isa = PBXContainerItemProxy; 80 | containerPortal = 8DF1B0C91A349BC200295741 /* Project object */; 81 | proxyType = 1; 82 | remoteGlobalIDString = 8DEC2B441BFB57D00083EC9D; 83 | remoteInfo = "yavfl-tvos"; 84 | }; 85 | /* End PBXContainerItemProxy section */ 86 | 87 | /* Begin PBXCopyFilesBuildPhase section */ 88 | 8D7AC9511A7546A200574AAC /* Embed Frameworks */ = { 89 | isa = PBXCopyFilesBuildPhase; 90 | buildActionMask = 2147483647; 91 | dstPath = ""; 92 | dstSubfolderSpec = 10; 93 | files = ( 94 | 8D7AC99B1A7547BC00574AAC /* yavfl.framework in Embed Frameworks */, 95 | ); 96 | name = "Embed Frameworks"; 97 | runOnlyForDeploymentPostprocessing = 0; 98 | }; 99 | 8D7AC9761A7546E200574AAC /* Embed Frameworks */ = { 100 | isa = PBXCopyFilesBuildPhase; 101 | buildActionMask = 2147483647; 102 | dstPath = ""; 103 | dstSubfolderSpec = 10; 104 | files = ( 105 | 8D7AC9C11A75495900574AAC /* yavfl.framework in Embed Frameworks */, 106 | ); 107 | name = "Embed Frameworks"; 108 | runOnlyForDeploymentPostprocessing = 0; 109 | }; 110 | /* End PBXCopyFilesBuildPhase section */ 111 | 112 | /* Begin PBXFileReference section */ 113 | 8D556EF21A727791004FA111 /* yavflSample-OSX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "yavflSample-OSX.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 114 | 8D556EF51A727791004FA111 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 115 | 8D556EF61A727791004FA111 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 116 | 8D556EF81A727791004FA111 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 117 | 8D556EFA1A727791004FA111 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 118 | 8D556EFD1A727791004FA111 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 119 | 8D57035A1A9F386D00AB719F /* yavfl.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = yavfl.playground; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 120 | 8D7AC9831A7547BB00574AAC /* yavfl.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = yavfl.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 121 | 8D7AC9861A7547BB00574AAC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 122 | 8D7AC98D1A7547BB00574AAC /* yavflTests-iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "yavflTests-iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 123 | 8D7AC9951A7547BB00574AAC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = yavflTests/Info.plist; sourceTree = ""; }; 124 | 8D7AC9961A7547BB00574AAC /* yavflTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = yavflTests.swift; path = yavflTests/yavflTests.swift; sourceTree = ""; }; 125 | 8D7AC9A91A75495900574AAC /* yavfl.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = yavfl.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 126 | 8D7AC9B31A75495900574AAC /* yavflTests-OSX.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "yavflTests-OSX.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 127 | 8D7AC9BB1A75495900574AAC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 128 | 8D7AC9BC1A75495900574AAC /* yavflOSXTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = yavflOSXTests.swift; sourceTree = ""; }; 129 | 8DEC2B451BFB57D00083EC9D /* yavfl.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = yavfl.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 130 | 8DEC2B4D1BFB58CC0083EC9D /* yavfl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yavfl.h; sourceTree = ""; }; 131 | 8DEC2B561BFB594F0083EC9D /* yavflTests-tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "yavflTests-tvOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 132 | 8DEC2B581BFB594F0083EC9D /* yavflTests_tvos.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = yavflTests_tvos.swift; sourceTree = ""; }; 133 | 8DEC2B5A1BFB594F0083EC9D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 134 | 8DF1B0D11A349BC200295741 /* yavflSample-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "yavflSample-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 135 | 8DF1B0D51A349BC200295741 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 136 | 8DF1B0D61A349BC200295741 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 137 | 8DF1B0D81A349BC200295741 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 138 | 8DF1B0DB1A349BC200295741 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 139 | 8DF1B0DD1A349BC200295741 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 140 | 8DF1B0F71A349D2500295741 /* yavfl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = yavfl.swift; sourceTree = ""; }; 141 | /* End PBXFileReference section */ 142 | 143 | /* Begin PBXFrameworksBuildPhase section */ 144 | 8D556EEF1A727791004FA111 /* Frameworks */ = { 145 | isa = PBXFrameworksBuildPhase; 146 | buildActionMask = 2147483647; 147 | files = ( 148 | 8D7AC9C01A75495900574AAC /* yavfl.framework in Frameworks */, 149 | ); 150 | runOnlyForDeploymentPostprocessing = 0; 151 | }; 152 | 8D7AC97F1A7547BB00574AAC /* Frameworks */ = { 153 | isa = PBXFrameworksBuildPhase; 154 | buildActionMask = 2147483647; 155 | files = ( 156 | ); 157 | runOnlyForDeploymentPostprocessing = 0; 158 | }; 159 | 8D7AC98A1A7547BB00574AAC /* Frameworks */ = { 160 | isa = PBXFrameworksBuildPhase; 161 | buildActionMask = 2147483647; 162 | files = ( 163 | 8D7AC98E1A7547BB00574AAC /* yavfl.framework in Frameworks */, 164 | ); 165 | runOnlyForDeploymentPostprocessing = 0; 166 | }; 167 | 8D7AC9A51A75495900574AAC /* Frameworks */ = { 168 | isa = PBXFrameworksBuildPhase; 169 | buildActionMask = 2147483647; 170 | files = ( 171 | ); 172 | runOnlyForDeploymentPostprocessing = 0; 173 | }; 174 | 8D7AC9B01A75495900574AAC /* Frameworks */ = { 175 | isa = PBXFrameworksBuildPhase; 176 | buildActionMask = 2147483647; 177 | files = ( 178 | 8D7AC9B41A75495900574AAC /* yavfl.framework in Frameworks */, 179 | ); 180 | runOnlyForDeploymentPostprocessing = 0; 181 | }; 182 | 8DEC2B411BFB57D00083EC9D /* Frameworks */ = { 183 | isa = PBXFrameworksBuildPhase; 184 | buildActionMask = 2147483647; 185 | files = ( 186 | ); 187 | runOnlyForDeploymentPostprocessing = 0; 188 | }; 189 | 8DEC2B531BFB594F0083EC9D /* Frameworks */ = { 190 | isa = PBXFrameworksBuildPhase; 191 | buildActionMask = 2147483647; 192 | files = ( 193 | 8DEC2B5B1BFB594F0083EC9D /* yavfl.framework in Frameworks */, 194 | ); 195 | runOnlyForDeploymentPostprocessing = 0; 196 | }; 197 | 8DF1B0CE1A349BC200295741 /* Frameworks */ = { 198 | isa = PBXFrameworksBuildPhase; 199 | buildActionMask = 2147483647; 200 | files = ( 201 | 8D7AC99A1A7547BC00574AAC /* yavfl.framework in Frameworks */, 202 | ); 203 | runOnlyForDeploymentPostprocessing = 0; 204 | }; 205 | /* End PBXFrameworksBuildPhase section */ 206 | 207 | /* Begin PBXGroup section */ 208 | 8D556EF31A727791004FA111 /* yavflSample-OSX */ = { 209 | isa = PBXGroup; 210 | children = ( 211 | 8D556EF61A727791004FA111 /* AppDelegate.swift */, 212 | 8D556EF81A727791004FA111 /* ViewController.swift */, 213 | 8D556EFA1A727791004FA111 /* Images.xcassets */, 214 | 8D556EFC1A727791004FA111 /* Main.storyboard */, 215 | 8D556EF41A727791004FA111 /* Supporting Files */, 216 | ); 217 | name = "yavflSample-OSX"; 218 | path = "Sample/yavflSample-OSX"; 219 | sourceTree = ""; 220 | }; 221 | 8D556EF41A727791004FA111 /* Supporting Files */ = { 222 | isa = PBXGroup; 223 | children = ( 224 | 8D556EF51A727791004FA111 /* Info.plist */, 225 | ); 226 | name = "Supporting Files"; 227 | sourceTree = ""; 228 | }; 229 | 8D7AC9931A7547BB00574AAC /* yavflTests */ = { 230 | isa = PBXGroup; 231 | children = ( 232 | 8D7AC9961A7547BB00574AAC /* yavflTests.swift */, 233 | 8D7AC9941A7547BB00574AAC /* Supporting Files */, 234 | ); 235 | name = yavflTests; 236 | path = Tests; 237 | sourceTree = ""; 238 | }; 239 | 8D7AC9941A7547BB00574AAC /* Supporting Files */ = { 240 | isa = PBXGroup; 241 | children = ( 242 | 8D7AC9951A7547BB00574AAC /* Info.plist */, 243 | ); 244 | name = "Supporting Files"; 245 | sourceTree = ""; 246 | }; 247 | 8D7AC9B91A75495900574AAC /* yavflOSXTests */ = { 248 | isa = PBXGroup; 249 | children = ( 250 | 8D7AC9BC1A75495900574AAC /* yavflOSXTests.swift */, 251 | 8D7AC9BA1A75495900574AAC /* Supporting Files */, 252 | ); 253 | name = yavflOSXTests; 254 | path = Tests/yavflOSXTests; 255 | sourceTree = ""; 256 | }; 257 | 8D7AC9BA1A75495900574AAC /* Supporting Files */ = { 258 | isa = PBXGroup; 259 | children = ( 260 | 8D7AC9BB1A75495900574AAC /* Info.plist */, 261 | ); 262 | name = "Supporting Files"; 263 | sourceTree = ""; 264 | }; 265 | 8DEC2B571BFB594F0083EC9D /* yavflTests-tvos */ = { 266 | isa = PBXGroup; 267 | children = ( 268 | 8DEC2B581BFB594F0083EC9D /* yavflTests_tvos.swift */, 269 | 8DEC2B5A1BFB594F0083EC9D /* Info.plist */, 270 | ); 271 | name = "yavflTests-tvos"; 272 | path = "Tests/yavflTests-tvos"; 273 | sourceTree = ""; 274 | }; 275 | 8DF1B0C81A349BC200295741 = { 276 | isa = PBXGroup; 277 | children = ( 278 | 8D57035A1A9F386D00AB719F /* yavfl.playground */, 279 | 8DF1B0F61A349D0D00295741 /* yavfl */, 280 | 8DF1B0D31A349BC200295741 /* yavflSample-iOS */, 281 | 8D556EF31A727791004FA111 /* yavflSample-OSX */, 282 | 8D7AC9931A7547BB00574AAC /* yavflTests */, 283 | 8D7AC9B91A75495900574AAC /* yavflOSXTests */, 284 | 8DEC2B571BFB594F0083EC9D /* yavflTests-tvos */, 285 | 8DF1B0D21A349BC200295741 /* Products */, 286 | ); 287 | sourceTree = ""; 288 | }; 289 | 8DF1B0D21A349BC200295741 /* Products */ = { 290 | isa = PBXGroup; 291 | children = ( 292 | 8DF1B0D11A349BC200295741 /* yavflSample-iOS.app */, 293 | 8D556EF21A727791004FA111 /* yavflSample-OSX.app */, 294 | 8D7AC9831A7547BB00574AAC /* yavfl.framework */, 295 | 8D7AC98D1A7547BB00574AAC /* yavflTests-iOS.xctest */, 296 | 8D7AC9A91A75495900574AAC /* yavfl.framework */, 297 | 8D7AC9B31A75495900574AAC /* yavflTests-OSX.xctest */, 298 | 8DEC2B451BFB57D00083EC9D /* yavfl.framework */, 299 | 8DEC2B561BFB594F0083EC9D /* yavflTests-tvOS.xctest */, 300 | ); 301 | name = Products; 302 | sourceTree = ""; 303 | }; 304 | 8DF1B0D31A349BC200295741 /* yavflSample-iOS */ = { 305 | isa = PBXGroup; 306 | children = ( 307 | 8DF1B0D61A349BC200295741 /* AppDelegate.swift */, 308 | 8DF1B0D81A349BC200295741 /* ViewController.swift */, 309 | 8DF1B0DA1A349BC200295741 /* Main.storyboard */, 310 | 8DF1B0DD1A349BC200295741 /* Images.xcassets */, 311 | 8DF1B0D41A349BC200295741 /* Supporting Files */, 312 | ); 313 | name = "yavflSample-iOS"; 314 | path = "Sample/yavflSample-iOS"; 315 | sourceTree = ""; 316 | }; 317 | 8DF1B0D41A349BC200295741 /* Supporting Files */ = { 318 | isa = PBXGroup; 319 | children = ( 320 | 8DF1B0D51A349BC200295741 /* Info.plist */, 321 | ); 322 | name = "Supporting Files"; 323 | sourceTree = ""; 324 | }; 325 | 8DF1B0F61A349D0D00295741 /* yavfl */ = { 326 | isa = PBXGroup; 327 | children = ( 328 | 8DF1B0F71A349D2500295741 /* yavfl.swift */, 329 | 8DEC2B4D1BFB58CC0083EC9D /* yavfl.h */, 330 | 8D7AC9861A7547BB00574AAC /* Info.plist */, 331 | ); 332 | name = yavfl; 333 | sourceTree = ""; 334 | }; 335 | /* End PBXGroup section */ 336 | 337 | /* Begin PBXHeadersBuildPhase section */ 338 | 8D7AC9801A7547BB00574AAC /* Headers */ = { 339 | isa = PBXHeadersBuildPhase; 340 | buildActionMask = 2147483647; 341 | files = ( 342 | ); 343 | runOnlyForDeploymentPostprocessing = 0; 344 | }; 345 | 8D7AC9A61A75495900574AAC /* Headers */ = { 346 | isa = PBXHeadersBuildPhase; 347 | buildActionMask = 2147483647; 348 | files = ( 349 | ); 350 | runOnlyForDeploymentPostprocessing = 0; 351 | }; 352 | 8DEC2B421BFB57D00083EC9D /* Headers */ = { 353 | isa = PBXHeadersBuildPhase; 354 | buildActionMask = 2147483647; 355 | files = ( 356 | ); 357 | runOnlyForDeploymentPostprocessing = 0; 358 | }; 359 | /* End PBXHeadersBuildPhase section */ 360 | 361 | /* Begin PBXNativeTarget section */ 362 | 8D556EF11A727791004FA111 /* yavflSample-OSX */ = { 363 | isa = PBXNativeTarget; 364 | buildConfigurationList = 8D556F0F1A727791004FA111 /* Build configuration list for PBXNativeTarget "yavflSample-OSX" */; 365 | buildPhases = ( 366 | 8D556EEE1A727791004FA111 /* Sources */, 367 | 8D556EEF1A727791004FA111 /* Frameworks */, 368 | 8D556EF01A727791004FA111 /* Resources */, 369 | 8D7AC9761A7546E200574AAC /* Embed Frameworks */, 370 | ); 371 | buildRules = ( 372 | ); 373 | dependencies = ( 374 | 8D7AC9BF1A75495900574AAC /* PBXTargetDependency */, 375 | ); 376 | name = "yavflSample-OSX"; 377 | productName = "yavflSample-OSX"; 378 | productReference = 8D556EF21A727791004FA111 /* yavflSample-OSX.app */; 379 | productType = "com.apple.product-type.application"; 380 | }; 381 | 8D7AC9821A7547BB00574AAC /* yavfl-iOS */ = { 382 | isa = PBXNativeTarget; 383 | buildConfigurationList = 8D7AC99C1A7547BC00574AAC /* Build configuration list for PBXNativeTarget "yavfl-iOS" */; 384 | buildPhases = ( 385 | 8D7AC97E1A7547BB00574AAC /* Sources */, 386 | 8D7AC97F1A7547BB00574AAC /* Frameworks */, 387 | 8D7AC9801A7547BB00574AAC /* Headers */, 388 | 8D7AC9811A7547BB00574AAC /* Resources */, 389 | ); 390 | buildRules = ( 391 | ); 392 | dependencies = ( 393 | ); 394 | name = "yavfl-iOS"; 395 | productName = yavfl; 396 | productReference = 8D7AC9831A7547BB00574AAC /* yavfl.framework */; 397 | productType = "com.apple.product-type.framework"; 398 | }; 399 | 8D7AC98C1A7547BB00574AAC /* yavflTests-iOS */ = { 400 | isa = PBXNativeTarget; 401 | buildConfigurationList = 8D7AC99F1A7547BC00574AAC /* Build configuration list for PBXNativeTarget "yavflTests-iOS" */; 402 | buildPhases = ( 403 | 8D7AC9891A7547BB00574AAC /* Sources */, 404 | 8D7AC98A1A7547BB00574AAC /* Frameworks */, 405 | 8D7AC98B1A7547BB00574AAC /* Resources */, 406 | ); 407 | buildRules = ( 408 | ); 409 | dependencies = ( 410 | 8D7AC9901A7547BB00574AAC /* PBXTargetDependency */, 411 | 8D7AC9921A7547BB00574AAC /* PBXTargetDependency */, 412 | ); 413 | name = "yavflTests-iOS"; 414 | productName = yavflTests; 415 | productReference = 8D7AC98D1A7547BB00574AAC /* yavflTests-iOS.xctest */; 416 | productType = "com.apple.product-type.bundle.unit-test"; 417 | }; 418 | 8D7AC9A81A75495900574AAC /* yavfl-OSX */ = { 419 | isa = PBXNativeTarget; 420 | buildConfigurationList = 8D7AC9C21A75495900574AAC /* Build configuration list for PBXNativeTarget "yavfl-OSX" */; 421 | buildPhases = ( 422 | 8D7AC9A41A75495900574AAC /* Sources */, 423 | 8D7AC9A51A75495900574AAC /* Frameworks */, 424 | 8D7AC9A61A75495900574AAC /* Headers */, 425 | 8D7AC9A71A75495900574AAC /* Resources */, 426 | ); 427 | buildRules = ( 428 | ); 429 | dependencies = ( 430 | ); 431 | name = "yavfl-OSX"; 432 | productName = yavflOSX; 433 | productReference = 8D7AC9A91A75495900574AAC /* yavfl.framework */; 434 | productType = "com.apple.product-type.framework"; 435 | }; 436 | 8D7AC9B21A75495900574AAC /* yavflTests-OSX */ = { 437 | isa = PBXNativeTarget; 438 | buildConfigurationList = 8D7AC9C51A75495900574AAC /* Build configuration list for PBXNativeTarget "yavflTests-OSX" */; 439 | buildPhases = ( 440 | 8D7AC9AF1A75495900574AAC /* Sources */, 441 | 8D7AC9B01A75495900574AAC /* Frameworks */, 442 | 8D7AC9B11A75495900574AAC /* Resources */, 443 | ); 444 | buildRules = ( 445 | ); 446 | dependencies = ( 447 | 8D7AC9B61A75495900574AAC /* PBXTargetDependency */, 448 | 8D7AC9B81A75495900574AAC /* PBXTargetDependency */, 449 | ); 450 | name = "yavflTests-OSX"; 451 | productName = yavflOSXTests; 452 | productReference = 8D7AC9B31A75495900574AAC /* yavflTests-OSX.xctest */; 453 | productType = "com.apple.product-type.bundle.unit-test"; 454 | }; 455 | 8DEC2B441BFB57D00083EC9D /* yavfl-tvOS */ = { 456 | isa = PBXNativeTarget; 457 | buildConfigurationList = 8DEC2B4C1BFB57D00083EC9D /* Build configuration list for PBXNativeTarget "yavfl-tvOS" */; 458 | buildPhases = ( 459 | 8DEC2B401BFB57D00083EC9D /* Sources */, 460 | 8DEC2B411BFB57D00083EC9D /* Frameworks */, 461 | 8DEC2B421BFB57D00083EC9D /* Headers */, 462 | 8DEC2B431BFB57D00083EC9D /* Resources */, 463 | ); 464 | buildRules = ( 465 | ); 466 | dependencies = ( 467 | ); 468 | name = "yavfl-tvOS"; 469 | productName = "yavfl-tvos"; 470 | productReference = 8DEC2B451BFB57D00083EC9D /* yavfl.framework */; 471 | productType = "com.apple.product-type.framework"; 472 | }; 473 | 8DEC2B551BFB594F0083EC9D /* yavflTests-tvOS */ = { 474 | isa = PBXNativeTarget; 475 | buildConfigurationList = 8DEC2B5E1BFB594F0083EC9D /* Build configuration list for PBXNativeTarget "yavflTests-tvOS" */; 476 | buildPhases = ( 477 | 8DEC2B521BFB594F0083EC9D /* Sources */, 478 | 8DEC2B531BFB594F0083EC9D /* Frameworks */, 479 | 8DEC2B541BFB594F0083EC9D /* Resources */, 480 | ); 481 | buildRules = ( 482 | ); 483 | dependencies = ( 484 | 8DEC2B5D1BFB594F0083EC9D /* PBXTargetDependency */, 485 | ); 486 | name = "yavflTests-tvOS"; 487 | productName = "yavflTests-tvos"; 488 | productReference = 8DEC2B561BFB594F0083EC9D /* yavflTests-tvOS.xctest */; 489 | productType = "com.apple.product-type.bundle.unit-test"; 490 | }; 491 | 8DF1B0D01A349BC200295741 /* yavflSample-iOS */ = { 492 | isa = PBXNativeTarget; 493 | buildConfigurationList = 8DF1B0F01A349BC200295741 /* Build configuration list for PBXNativeTarget "yavflSample-iOS" */; 494 | buildPhases = ( 495 | 8DF1B0CD1A349BC200295741 /* Sources */, 496 | 8DF1B0CE1A349BC200295741 /* Frameworks */, 497 | 8DF1B0CF1A349BC200295741 /* Resources */, 498 | 8D7AC9511A7546A200574AAC /* Embed Frameworks */, 499 | ); 500 | buildRules = ( 501 | ); 502 | dependencies = ( 503 | 8D7AC9991A7547BC00574AAC /* PBXTargetDependency */, 504 | ); 505 | name = "yavflSample-iOS"; 506 | productName = yavfl; 507 | productReference = 8DF1B0D11A349BC200295741 /* yavflSample-iOS.app */; 508 | productType = "com.apple.product-type.application"; 509 | }; 510 | /* End PBXNativeTarget section */ 511 | 512 | /* Begin PBXProject section */ 513 | 8DF1B0C91A349BC200295741 /* Project object */ = { 514 | isa = PBXProject; 515 | attributes = { 516 | LastSwiftUpdateCheck = 0710; 517 | LastUpgradeCheck = 0900; 518 | ORGANIZATIONNAME = "Safx Developers"; 519 | TargetAttributes = { 520 | 8D556EF11A727791004FA111 = { 521 | CreatedOnToolsVersion = 6.1.1; 522 | }; 523 | 8D7AC9821A7547BB00574AAC = { 524 | CreatedOnToolsVersion = 6.1.1; 525 | }; 526 | 8D7AC98C1A7547BB00574AAC = { 527 | CreatedOnToolsVersion = 6.1.1; 528 | }; 529 | 8D7AC9A81A75495900574AAC = { 530 | CreatedOnToolsVersion = 6.1.1; 531 | }; 532 | 8D7AC9B21A75495900574AAC = { 533 | CreatedOnToolsVersion = 6.1.1; 534 | }; 535 | 8DEC2B441BFB57D00083EC9D = { 536 | CreatedOnToolsVersion = 7.1.1; 537 | }; 538 | 8DEC2B551BFB594F0083EC9D = { 539 | CreatedOnToolsVersion = 7.1.1; 540 | }; 541 | 8DF1B0D01A349BC200295741 = { 542 | CreatedOnToolsVersion = 6.1.1; 543 | }; 544 | }; 545 | }; 546 | buildConfigurationList = 8DF1B0CC1A349BC200295741 /* Build configuration list for PBXProject "yavfl" */; 547 | compatibilityVersion = "Xcode 3.2"; 548 | developmentRegion = English; 549 | hasScannedForEncodings = 0; 550 | knownRegions = ( 551 | en, 552 | Base, 553 | ); 554 | mainGroup = 8DF1B0C81A349BC200295741; 555 | productRefGroup = 8DF1B0D21A349BC200295741 /* Products */; 556 | projectDirPath = ""; 557 | projectRoot = ""; 558 | targets = ( 559 | 8D7AC9821A7547BB00574AAC /* yavfl-iOS */, 560 | 8DEC2B441BFB57D00083EC9D /* yavfl-tvOS */, 561 | 8D7AC9A81A75495900574AAC /* yavfl-OSX */, 562 | 8D7AC98C1A7547BB00574AAC /* yavflTests-iOS */, 563 | 8D7AC9B21A75495900574AAC /* yavflTests-OSX */, 564 | 8DEC2B551BFB594F0083EC9D /* yavflTests-tvOS */, 565 | 8DF1B0D01A349BC200295741 /* yavflSample-iOS */, 566 | 8D556EF11A727791004FA111 /* yavflSample-OSX */, 567 | ); 568 | }; 569 | /* End PBXProject section */ 570 | 571 | /* Begin PBXResourcesBuildPhase section */ 572 | 8D556EF01A727791004FA111 /* Resources */ = { 573 | isa = PBXResourcesBuildPhase; 574 | buildActionMask = 2147483647; 575 | files = ( 576 | 8D556EFB1A727791004FA111 /* Images.xcassets in Resources */, 577 | 8D556EFE1A727791004FA111 /* Main.storyboard in Resources */, 578 | ); 579 | runOnlyForDeploymentPostprocessing = 0; 580 | }; 581 | 8D7AC9811A7547BB00574AAC /* Resources */ = { 582 | isa = PBXResourcesBuildPhase; 583 | buildActionMask = 2147483647; 584 | files = ( 585 | ); 586 | runOnlyForDeploymentPostprocessing = 0; 587 | }; 588 | 8D7AC98B1A7547BB00574AAC /* Resources */ = { 589 | isa = PBXResourcesBuildPhase; 590 | buildActionMask = 2147483647; 591 | files = ( 592 | ); 593 | runOnlyForDeploymentPostprocessing = 0; 594 | }; 595 | 8D7AC9A71A75495900574AAC /* Resources */ = { 596 | isa = PBXResourcesBuildPhase; 597 | buildActionMask = 2147483647; 598 | files = ( 599 | ); 600 | runOnlyForDeploymentPostprocessing = 0; 601 | }; 602 | 8D7AC9B11A75495900574AAC /* Resources */ = { 603 | isa = PBXResourcesBuildPhase; 604 | buildActionMask = 2147483647; 605 | files = ( 606 | ); 607 | runOnlyForDeploymentPostprocessing = 0; 608 | }; 609 | 8DEC2B431BFB57D00083EC9D /* Resources */ = { 610 | isa = PBXResourcesBuildPhase; 611 | buildActionMask = 2147483647; 612 | files = ( 613 | ); 614 | runOnlyForDeploymentPostprocessing = 0; 615 | }; 616 | 8DEC2B541BFB594F0083EC9D /* Resources */ = { 617 | isa = PBXResourcesBuildPhase; 618 | buildActionMask = 2147483647; 619 | files = ( 620 | ); 621 | runOnlyForDeploymentPostprocessing = 0; 622 | }; 623 | 8DF1B0CF1A349BC200295741 /* Resources */ = { 624 | isa = PBXResourcesBuildPhase; 625 | buildActionMask = 2147483647; 626 | files = ( 627 | 8DF1B0DC1A349BC200295741 /* Main.storyboard in Resources */, 628 | 8DF1B0DE1A349BC200295741 /* Images.xcassets in Resources */, 629 | ); 630 | runOnlyForDeploymentPostprocessing = 0; 631 | }; 632 | /* End PBXResourcesBuildPhase section */ 633 | 634 | /* Begin PBXSourcesBuildPhase section */ 635 | 8D556EEE1A727791004FA111 /* Sources */ = { 636 | isa = PBXSourcesBuildPhase; 637 | buildActionMask = 2147483647; 638 | files = ( 639 | 8DF2D42E1B2AF45C005D77DC /* yavfl.swift in Sources */, 640 | 8D556EF91A727791004FA111 /* ViewController.swift in Sources */, 641 | 8D556EF71A727791004FA111 /* AppDelegate.swift in Sources */, 642 | ); 643 | runOnlyForDeploymentPostprocessing = 0; 644 | }; 645 | 8D7AC97E1A7547BB00574AAC /* Sources */ = { 646 | isa = PBXSourcesBuildPhase; 647 | buildActionMask = 2147483647; 648 | files = ( 649 | 8D7AC9A21A7547C300574AAC /* yavfl.swift in Sources */, 650 | ); 651 | runOnlyForDeploymentPostprocessing = 0; 652 | }; 653 | 8D7AC9891A7547BB00574AAC /* Sources */ = { 654 | isa = PBXSourcesBuildPhase; 655 | buildActionMask = 2147483647; 656 | files = ( 657 | 8D7AC9971A7547BC00574AAC /* yavflTests.swift in Sources */, 658 | ); 659 | runOnlyForDeploymentPostprocessing = 0; 660 | }; 661 | 8D7AC9A41A75495900574AAC /* Sources */ = { 662 | isa = PBXSourcesBuildPhase; 663 | buildActionMask = 2147483647; 664 | files = ( 665 | 8D7AC9C81A75496F00574AAC /* yavfl.swift in Sources */, 666 | ); 667 | runOnlyForDeploymentPostprocessing = 0; 668 | }; 669 | 8D7AC9AF1A75495900574AAC /* Sources */ = { 670 | isa = PBXSourcesBuildPhase; 671 | buildActionMask = 2147483647; 672 | files = ( 673 | 8D7AC9BD1A75495900574AAC /* yavflOSXTests.swift in Sources */, 674 | ); 675 | runOnlyForDeploymentPostprocessing = 0; 676 | }; 677 | 8DEC2B401BFB57D00083EC9D /* Sources */ = { 678 | isa = PBXSourcesBuildPhase; 679 | buildActionMask = 2147483647; 680 | files = ( 681 | 8DEC2B511BFB58E40083EC9D /* yavfl.swift in Sources */, 682 | ); 683 | runOnlyForDeploymentPostprocessing = 0; 684 | }; 685 | 8DEC2B521BFB594F0083EC9D /* Sources */ = { 686 | isa = PBXSourcesBuildPhase; 687 | buildActionMask = 2147483647; 688 | files = ( 689 | 8DEC2B591BFB594F0083EC9D /* yavflTests_tvos.swift in Sources */, 690 | ); 691 | runOnlyForDeploymentPostprocessing = 0; 692 | }; 693 | 8DF1B0CD1A349BC200295741 /* Sources */ = { 694 | isa = PBXSourcesBuildPhase; 695 | buildActionMask = 2147483647; 696 | files = ( 697 | 8DF2D42D1B2AF45B005D77DC /* yavfl.swift in Sources */, 698 | 8DF1B0D91A349BC200295741 /* ViewController.swift in Sources */, 699 | 8DF1B0D71A349BC200295741 /* AppDelegate.swift in Sources */, 700 | ); 701 | runOnlyForDeploymentPostprocessing = 0; 702 | }; 703 | /* End PBXSourcesBuildPhase section */ 704 | 705 | /* Begin PBXTargetDependency section */ 706 | 8D7AC9901A7547BB00574AAC /* PBXTargetDependency */ = { 707 | isa = PBXTargetDependency; 708 | target = 8D7AC9821A7547BB00574AAC /* yavfl-iOS */; 709 | targetProxy = 8D7AC98F1A7547BB00574AAC /* PBXContainerItemProxy */; 710 | }; 711 | 8D7AC9921A7547BB00574AAC /* PBXTargetDependency */ = { 712 | isa = PBXTargetDependency; 713 | target = 8DF1B0D01A349BC200295741 /* yavflSample-iOS */; 714 | targetProxy = 8D7AC9911A7547BB00574AAC /* PBXContainerItemProxy */; 715 | }; 716 | 8D7AC9991A7547BC00574AAC /* PBXTargetDependency */ = { 717 | isa = PBXTargetDependency; 718 | target = 8D7AC9821A7547BB00574AAC /* yavfl-iOS */; 719 | targetProxy = 8D7AC9981A7547BC00574AAC /* PBXContainerItemProxy */; 720 | }; 721 | 8D7AC9B61A75495900574AAC /* PBXTargetDependency */ = { 722 | isa = PBXTargetDependency; 723 | target = 8D7AC9A81A75495900574AAC /* yavfl-OSX */; 724 | targetProxy = 8D7AC9B51A75495900574AAC /* PBXContainerItemProxy */; 725 | }; 726 | 8D7AC9B81A75495900574AAC /* PBXTargetDependency */ = { 727 | isa = PBXTargetDependency; 728 | target = 8D556EF11A727791004FA111 /* yavflSample-OSX */; 729 | targetProxy = 8D7AC9B71A75495900574AAC /* PBXContainerItemProxy */; 730 | }; 731 | 8D7AC9BF1A75495900574AAC /* PBXTargetDependency */ = { 732 | isa = PBXTargetDependency; 733 | target = 8D7AC9A81A75495900574AAC /* yavfl-OSX */; 734 | targetProxy = 8D7AC9BE1A75495900574AAC /* PBXContainerItemProxy */; 735 | }; 736 | 8DEC2B5D1BFB594F0083EC9D /* PBXTargetDependency */ = { 737 | isa = PBXTargetDependency; 738 | target = 8DEC2B441BFB57D00083EC9D /* yavfl-tvOS */; 739 | targetProxy = 8DEC2B5C1BFB594F0083EC9D /* PBXContainerItemProxy */; 740 | }; 741 | /* End PBXTargetDependency section */ 742 | 743 | /* Begin PBXVariantGroup section */ 744 | 8D556EFC1A727791004FA111 /* Main.storyboard */ = { 745 | isa = PBXVariantGroup; 746 | children = ( 747 | 8D556EFD1A727791004FA111 /* Base */, 748 | ); 749 | name = Main.storyboard; 750 | sourceTree = ""; 751 | }; 752 | 8DF1B0DA1A349BC200295741 /* Main.storyboard */ = { 753 | isa = PBXVariantGroup; 754 | children = ( 755 | 8DF1B0DB1A349BC200295741 /* Base */, 756 | ); 757 | name = Main.storyboard; 758 | sourceTree = ""; 759 | }; 760 | /* End PBXVariantGroup section */ 761 | 762 | /* Begin XCBuildConfiguration section */ 763 | 8D556F0B1A727791004FA111 /* Debug */ = { 764 | isa = XCBuildConfiguration; 765 | buildSettings = { 766 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 767 | CODE_SIGN_IDENTITY = "-"; 768 | COMBINE_HIDPI_IMAGES = YES; 769 | GCC_PREPROCESSOR_DEFINITIONS = ( 770 | "DEBUG=1", 771 | "$(inherited)", 772 | ); 773 | INFOPLIST_FILE = "$(SRCROOT)/Sample/yavflSample-OSX/Info.plist"; 774 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 775 | MACOSX_DEPLOYMENT_TARGET = 10.10; 776 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.$(PRODUCT_NAME:rfc1034identifier)"; 777 | PRODUCT_NAME = "$(TARGET_NAME)"; 778 | SDKROOT = macosx; 779 | SWIFT_VERSION = 4.0; 780 | }; 781 | name = Debug; 782 | }; 783 | 8D556F0C1A727791004FA111 /* Release */ = { 784 | isa = XCBuildConfiguration; 785 | buildSettings = { 786 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 787 | CODE_SIGN_IDENTITY = "-"; 788 | COMBINE_HIDPI_IMAGES = YES; 789 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 790 | INFOPLIST_FILE = "$(SRCROOT)/Sample/yavflSample-OSX/Info.plist"; 791 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 792 | MACOSX_DEPLOYMENT_TARGET = 10.10; 793 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.$(PRODUCT_NAME:rfc1034identifier)"; 794 | PRODUCT_NAME = "$(TARGET_NAME)"; 795 | SDKROOT = macosx; 796 | SWIFT_VERSION = 4.0; 797 | }; 798 | name = Release; 799 | }; 800 | 8D7AC99D1A7547BC00574AAC /* Debug */ = { 801 | isa = XCBuildConfiguration; 802 | buildSettings = { 803 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 804 | CURRENT_PROJECT_VERSION = 1; 805 | DEFINES_MODULE = YES; 806 | DYLIB_COMPATIBILITY_VERSION = 1; 807 | DYLIB_CURRENT_VERSION = 1; 808 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 809 | GCC_PREPROCESSOR_DEFINITIONS = ( 810 | "DEBUG=1", 811 | "$(inherited)", 812 | ); 813 | INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; 814 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 815 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 816 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 817 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.$(PRODUCT_NAME:rfc1034identifier)"; 818 | PRODUCT_NAME = yavfl; 819 | SKIP_INSTALL = YES; 820 | SWIFT_VERSION = 4.0; 821 | VERSIONING_SYSTEM = "apple-generic"; 822 | VERSION_INFO_PREFIX = ""; 823 | }; 824 | name = Debug; 825 | }; 826 | 8D7AC99E1A7547BC00574AAC /* Release */ = { 827 | isa = XCBuildConfiguration; 828 | buildSettings = { 829 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 830 | CURRENT_PROJECT_VERSION = 1; 831 | DEFINES_MODULE = YES; 832 | DYLIB_COMPATIBILITY_VERSION = 1; 833 | DYLIB_CURRENT_VERSION = 1; 834 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 835 | INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; 836 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 837 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 838 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 839 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.$(PRODUCT_NAME:rfc1034identifier)"; 840 | PRODUCT_NAME = yavfl; 841 | SKIP_INSTALL = YES; 842 | SWIFT_VERSION = 4.0; 843 | VERSIONING_SYSTEM = "apple-generic"; 844 | VERSION_INFO_PREFIX = ""; 845 | }; 846 | name = Release; 847 | }; 848 | 8D7AC9A01A7547BC00574AAC /* Debug */ = { 849 | isa = XCBuildConfiguration; 850 | buildSettings = { 851 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 852 | GCC_PREPROCESSOR_DEFINITIONS = ( 853 | "DEBUG=1", 854 | "$(inherited)", 855 | ); 856 | INFOPLIST_FILE = Tests/yavflTests/Info.plist; 857 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 858 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.$(PRODUCT_NAME:rfc1034identifier)"; 859 | PRODUCT_NAME = "$(TARGET_NAME)"; 860 | SWIFT_VERSION = 4.0; 861 | }; 862 | name = Debug; 863 | }; 864 | 8D7AC9A11A7547BC00574AAC /* Release */ = { 865 | isa = XCBuildConfiguration; 866 | buildSettings = { 867 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 868 | INFOPLIST_FILE = Tests/yavflTests/Info.plist; 869 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 870 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.$(PRODUCT_NAME:rfc1034identifier)"; 871 | PRODUCT_NAME = "$(TARGET_NAME)"; 872 | SWIFT_VERSION = 4.0; 873 | }; 874 | name = Release; 875 | }; 876 | 8D7AC9C31A75495900574AAC /* Debug */ = { 877 | isa = XCBuildConfiguration; 878 | buildSettings = { 879 | CODE_SIGN_IDENTITY = "-"; 880 | COMBINE_HIDPI_IMAGES = YES; 881 | CURRENT_PROJECT_VERSION = 1; 882 | DEFINES_MODULE = YES; 883 | DYLIB_COMPATIBILITY_VERSION = 1; 884 | DYLIB_CURRENT_VERSION = 1; 885 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 886 | FRAMEWORK_VERSION = A; 887 | GCC_PREPROCESSOR_DEFINITIONS = ( 888 | "DEBUG=1", 889 | "$(inherited)", 890 | ); 891 | INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; 892 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 893 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 894 | MACOSX_DEPLOYMENT_TARGET = 10.10; 895 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.$(PRODUCT_NAME:rfc1034identifier)"; 896 | PRODUCT_NAME = yavfl; 897 | SDKROOT = macosx; 898 | SKIP_INSTALL = YES; 899 | SWIFT_VERSION = 4.0; 900 | VERSIONING_SYSTEM = "apple-generic"; 901 | VERSION_INFO_PREFIX = ""; 902 | }; 903 | name = Debug; 904 | }; 905 | 8D7AC9C41A75495900574AAC /* Release */ = { 906 | isa = XCBuildConfiguration; 907 | buildSettings = { 908 | CODE_SIGN_IDENTITY = "-"; 909 | COMBINE_HIDPI_IMAGES = YES; 910 | CURRENT_PROJECT_VERSION = 1; 911 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 912 | DEFINES_MODULE = YES; 913 | DYLIB_COMPATIBILITY_VERSION = 1; 914 | DYLIB_CURRENT_VERSION = 1; 915 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 916 | FRAMEWORK_VERSION = A; 917 | INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; 918 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 919 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 920 | MACOSX_DEPLOYMENT_TARGET = 10.10; 921 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.$(PRODUCT_NAME:rfc1034identifier)"; 922 | PRODUCT_NAME = yavfl; 923 | SDKROOT = macosx; 924 | SKIP_INSTALL = YES; 925 | SWIFT_VERSION = 4.0; 926 | VERSIONING_SYSTEM = "apple-generic"; 927 | VERSION_INFO_PREFIX = ""; 928 | }; 929 | name = Release; 930 | }; 931 | 8D7AC9C61A75495900574AAC /* Debug */ = { 932 | isa = XCBuildConfiguration; 933 | buildSettings = { 934 | COMBINE_HIDPI_IMAGES = YES; 935 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 936 | GCC_PREPROCESSOR_DEFINITIONS = ( 937 | "DEBUG=1", 938 | "$(inherited)", 939 | ); 940 | INFOPLIST_FILE = Tests/yavflOSXTests/Info.plist; 941 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 942 | MACOSX_DEPLOYMENT_TARGET = 10.10; 943 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.$(PRODUCT_NAME:rfc1034identifier)"; 944 | PRODUCT_NAME = "$(TARGET_NAME)"; 945 | SDKROOT = macosx; 946 | SWIFT_VERSION = 4.0; 947 | }; 948 | name = Debug; 949 | }; 950 | 8D7AC9C71A75495900574AAC /* Release */ = { 951 | isa = XCBuildConfiguration; 952 | buildSettings = { 953 | COMBINE_HIDPI_IMAGES = YES; 954 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 955 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 956 | INFOPLIST_FILE = Tests/yavflOSXTests/Info.plist; 957 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 958 | MACOSX_DEPLOYMENT_TARGET = 10.10; 959 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.$(PRODUCT_NAME:rfc1034identifier)"; 960 | PRODUCT_NAME = "$(TARGET_NAME)"; 961 | SDKROOT = macosx; 962 | SWIFT_VERSION = 4.0; 963 | }; 964 | name = Release; 965 | }; 966 | 8DEC2B4A1BFB57D00083EC9D /* Debug */ = { 967 | isa = XCBuildConfiguration; 968 | buildSettings = { 969 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 970 | CURRENT_PROJECT_VERSION = 1; 971 | DEBUG_INFORMATION_FORMAT = dwarf; 972 | DEFINES_MODULE = YES; 973 | DYLIB_COMPATIBILITY_VERSION = 1; 974 | DYLIB_CURRENT_VERSION = 1; 975 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 976 | GCC_NO_COMMON_BLOCKS = YES; 977 | INFOPLIST_FILE = Info.plist; 978 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 979 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 980 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.yavfl-tvos"; 981 | PRODUCT_NAME = yavfl; 982 | SDKROOT = appletvos; 983 | SKIP_INSTALL = YES; 984 | SWIFT_VERSION = 4.0; 985 | TARGETED_DEVICE_FAMILY = 3; 986 | TVOS_DEPLOYMENT_TARGET = 9.0; 987 | VERSIONING_SYSTEM = "apple-generic"; 988 | VERSION_INFO_PREFIX = ""; 989 | }; 990 | name = Debug; 991 | }; 992 | 8DEC2B4B1BFB57D00083EC9D /* Release */ = { 993 | isa = XCBuildConfiguration; 994 | buildSettings = { 995 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 996 | COPY_PHASE_STRIP = NO; 997 | CURRENT_PROJECT_VERSION = 1; 998 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 999 | DEFINES_MODULE = YES; 1000 | DYLIB_COMPATIBILITY_VERSION = 1; 1001 | DYLIB_CURRENT_VERSION = 1; 1002 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1003 | GCC_NO_COMMON_BLOCKS = YES; 1004 | INFOPLIST_FILE = Info.plist; 1005 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1006 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1007 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.yavfl-tvos"; 1008 | PRODUCT_NAME = yavfl; 1009 | SDKROOT = appletvos; 1010 | SKIP_INSTALL = YES; 1011 | SWIFT_VERSION = 4.0; 1012 | TARGETED_DEVICE_FAMILY = 3; 1013 | TVOS_DEPLOYMENT_TARGET = 9.0; 1014 | VERSIONING_SYSTEM = "apple-generic"; 1015 | VERSION_INFO_PREFIX = ""; 1016 | }; 1017 | name = Release; 1018 | }; 1019 | 8DEC2B5F1BFB594F0083EC9D /* Debug */ = { 1020 | isa = XCBuildConfiguration; 1021 | buildSettings = { 1022 | DEBUG_INFORMATION_FORMAT = dwarf; 1023 | GCC_NO_COMMON_BLOCKS = YES; 1024 | INFOPLIST_FILE = "Tests/yavflTests-tvos/Info.plist"; 1025 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1026 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.yavflTests-tvos"; 1027 | PRODUCT_NAME = "$(TARGET_NAME)"; 1028 | SDKROOT = appletvos; 1029 | SWIFT_VERSION = 4.0; 1030 | TVOS_DEPLOYMENT_TARGET = 9.0; 1031 | }; 1032 | name = Debug; 1033 | }; 1034 | 8DEC2B601BFB594F0083EC9D /* Release */ = { 1035 | isa = XCBuildConfiguration; 1036 | buildSettings = { 1037 | COPY_PHASE_STRIP = NO; 1038 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1039 | GCC_NO_COMMON_BLOCKS = YES; 1040 | INFOPLIST_FILE = "Tests/yavflTests-tvos/Info.plist"; 1041 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1042 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.yavflTests-tvos"; 1043 | PRODUCT_NAME = "$(TARGET_NAME)"; 1044 | SDKROOT = appletvos; 1045 | SWIFT_VERSION = 4.0; 1046 | TVOS_DEPLOYMENT_TARGET = 9.0; 1047 | }; 1048 | name = Release; 1049 | }; 1050 | 8DF1B0EE1A349BC200295741 /* Debug */ = { 1051 | isa = XCBuildConfiguration; 1052 | buildSettings = { 1053 | ALWAYS_SEARCH_USER_PATHS = NO; 1054 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1055 | CLANG_CXX_LIBRARY = "libc++"; 1056 | CLANG_ENABLE_MODULES = YES; 1057 | CLANG_ENABLE_OBJC_ARC = YES; 1058 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1059 | CLANG_WARN_BOOL_CONVERSION = YES; 1060 | CLANG_WARN_COMMA = YES; 1061 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1062 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1063 | CLANG_WARN_EMPTY_BODY = YES; 1064 | CLANG_WARN_ENUM_CONVERSION = YES; 1065 | CLANG_WARN_INFINITE_RECURSION = YES; 1066 | CLANG_WARN_INT_CONVERSION = YES; 1067 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1068 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1069 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1070 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1071 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1072 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1073 | CLANG_WARN_UNREACHABLE_CODE = YES; 1074 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1075 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1076 | COPY_PHASE_STRIP = NO; 1077 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1078 | ENABLE_TESTABILITY = YES; 1079 | GCC_C_LANGUAGE_STANDARD = gnu99; 1080 | GCC_DYNAMIC_NO_PIC = NO; 1081 | GCC_GENERATE_TEST_COVERAGE_FILES = YES; 1082 | GCC_NO_COMMON_BLOCKS = YES; 1083 | GCC_OPTIMIZATION_LEVEL = 0; 1084 | GCC_PREPROCESSOR_DEFINITIONS = ( 1085 | "DEBUG=1", 1086 | "$(inherited)", 1087 | ); 1088 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 1089 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1090 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1091 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1092 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1093 | GCC_WARN_UNUSED_FUNCTION = YES; 1094 | GCC_WARN_UNUSED_VARIABLE = YES; 1095 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1096 | MACOSX_DEPLOYMENT_TARGET = 10.10; 1097 | MTL_ENABLE_DEBUG_INFO = YES; 1098 | ONLY_ACTIVE_ARCH = YES; 1099 | SDKROOT = iphoneos; 1100 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1101 | TARGETED_DEVICE_FAMILY = "1,2"; 1102 | }; 1103 | name = Debug; 1104 | }; 1105 | 8DF1B0EF1A349BC200295741 /* Release */ = { 1106 | isa = XCBuildConfiguration; 1107 | buildSettings = { 1108 | ALWAYS_SEARCH_USER_PATHS = NO; 1109 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1110 | CLANG_CXX_LIBRARY = "libc++"; 1111 | CLANG_ENABLE_MODULES = YES; 1112 | CLANG_ENABLE_OBJC_ARC = YES; 1113 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1114 | CLANG_WARN_BOOL_CONVERSION = YES; 1115 | CLANG_WARN_COMMA = YES; 1116 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1117 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1118 | CLANG_WARN_EMPTY_BODY = YES; 1119 | CLANG_WARN_ENUM_CONVERSION = YES; 1120 | CLANG_WARN_INFINITE_RECURSION = YES; 1121 | CLANG_WARN_INT_CONVERSION = YES; 1122 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1123 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1124 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1125 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1126 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1127 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1128 | CLANG_WARN_UNREACHABLE_CODE = YES; 1129 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1130 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1131 | COPY_PHASE_STRIP = YES; 1132 | ENABLE_NS_ASSERTIONS = NO; 1133 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1134 | GCC_C_LANGUAGE_STANDARD = gnu99; 1135 | GCC_GENERATE_TEST_COVERAGE_FILES = NO; 1136 | GCC_NO_COMMON_BLOCKS = YES; 1137 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1138 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1139 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1140 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1141 | GCC_WARN_UNUSED_FUNCTION = YES; 1142 | GCC_WARN_UNUSED_VARIABLE = YES; 1143 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1144 | MACOSX_DEPLOYMENT_TARGET = 10.10; 1145 | MTL_ENABLE_DEBUG_INFO = NO; 1146 | SDKROOT = iphoneos; 1147 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 1148 | TARGETED_DEVICE_FAMILY = "1,2"; 1149 | VALIDATE_PRODUCT = YES; 1150 | }; 1151 | name = Release; 1152 | }; 1153 | 8DF1B0F11A349BC200295741 /* Debug */ = { 1154 | isa = XCBuildConfiguration; 1155 | buildSettings = { 1156 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1157 | INFOPLIST_FILE = "$(SRCROOT)/Sample/yavflSample-iOS/Info.plist"; 1158 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1159 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1160 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.$(PRODUCT_NAME:rfc1034identifier)"; 1161 | PRODUCT_NAME = "$(TARGET_NAME)"; 1162 | SWIFT_VERSION = 4.0; 1163 | }; 1164 | name = Debug; 1165 | }; 1166 | 8DF1B0F21A349BC200295741 /* Release */ = { 1167 | isa = XCBuildConfiguration; 1168 | buildSettings = { 1169 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1170 | INFOPLIST_FILE = "$(SRCROOT)/Sample/yavflSample-iOS/Info.plist"; 1171 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1172 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1173 | PRODUCT_BUNDLE_IDENTIFIER = "com.blogspot.safx-dev.$(PRODUCT_NAME:rfc1034identifier)"; 1174 | PRODUCT_NAME = "$(TARGET_NAME)"; 1175 | SWIFT_VERSION = 4.0; 1176 | }; 1177 | name = Release; 1178 | }; 1179 | /* End XCBuildConfiguration section */ 1180 | 1181 | /* Begin XCConfigurationList section */ 1182 | 8D556F0F1A727791004FA111 /* Build configuration list for PBXNativeTarget "yavflSample-OSX" */ = { 1183 | isa = XCConfigurationList; 1184 | buildConfigurations = ( 1185 | 8D556F0B1A727791004FA111 /* Debug */, 1186 | 8D556F0C1A727791004FA111 /* Release */, 1187 | ); 1188 | defaultConfigurationIsVisible = 0; 1189 | defaultConfigurationName = Release; 1190 | }; 1191 | 8D7AC99C1A7547BC00574AAC /* Build configuration list for PBXNativeTarget "yavfl-iOS" */ = { 1192 | isa = XCConfigurationList; 1193 | buildConfigurations = ( 1194 | 8D7AC99D1A7547BC00574AAC /* Debug */, 1195 | 8D7AC99E1A7547BC00574AAC /* Release */, 1196 | ); 1197 | defaultConfigurationIsVisible = 0; 1198 | defaultConfigurationName = Release; 1199 | }; 1200 | 8D7AC99F1A7547BC00574AAC /* Build configuration list for PBXNativeTarget "yavflTests-iOS" */ = { 1201 | isa = XCConfigurationList; 1202 | buildConfigurations = ( 1203 | 8D7AC9A01A7547BC00574AAC /* Debug */, 1204 | 8D7AC9A11A7547BC00574AAC /* Release */, 1205 | ); 1206 | defaultConfigurationIsVisible = 0; 1207 | defaultConfigurationName = Release; 1208 | }; 1209 | 8D7AC9C21A75495900574AAC /* Build configuration list for PBXNativeTarget "yavfl-OSX" */ = { 1210 | isa = XCConfigurationList; 1211 | buildConfigurations = ( 1212 | 8D7AC9C31A75495900574AAC /* Debug */, 1213 | 8D7AC9C41A75495900574AAC /* Release */, 1214 | ); 1215 | defaultConfigurationIsVisible = 0; 1216 | defaultConfigurationName = Release; 1217 | }; 1218 | 8D7AC9C51A75495900574AAC /* Build configuration list for PBXNativeTarget "yavflTests-OSX" */ = { 1219 | isa = XCConfigurationList; 1220 | buildConfigurations = ( 1221 | 8D7AC9C61A75495900574AAC /* Debug */, 1222 | 8D7AC9C71A75495900574AAC /* Release */, 1223 | ); 1224 | defaultConfigurationIsVisible = 0; 1225 | defaultConfigurationName = Release; 1226 | }; 1227 | 8DEC2B4C1BFB57D00083EC9D /* Build configuration list for PBXNativeTarget "yavfl-tvOS" */ = { 1228 | isa = XCConfigurationList; 1229 | buildConfigurations = ( 1230 | 8DEC2B4A1BFB57D00083EC9D /* Debug */, 1231 | 8DEC2B4B1BFB57D00083EC9D /* Release */, 1232 | ); 1233 | defaultConfigurationIsVisible = 0; 1234 | defaultConfigurationName = Release; 1235 | }; 1236 | 8DEC2B5E1BFB594F0083EC9D /* Build configuration list for PBXNativeTarget "yavflTests-tvOS" */ = { 1237 | isa = XCConfigurationList; 1238 | buildConfigurations = ( 1239 | 8DEC2B5F1BFB594F0083EC9D /* Debug */, 1240 | 8DEC2B601BFB594F0083EC9D /* Release */, 1241 | ); 1242 | defaultConfigurationIsVisible = 0; 1243 | defaultConfigurationName = Release; 1244 | }; 1245 | 8DF1B0CC1A349BC200295741 /* Build configuration list for PBXProject "yavfl" */ = { 1246 | isa = XCConfigurationList; 1247 | buildConfigurations = ( 1248 | 8DF1B0EE1A349BC200295741 /* Debug */, 1249 | 8DF1B0EF1A349BC200295741 /* Release */, 1250 | ); 1251 | defaultConfigurationIsVisible = 0; 1252 | defaultConfigurationName = Release; 1253 | }; 1254 | 8DF1B0F01A349BC200295741 /* Build configuration list for PBXNativeTarget "yavflSample-iOS" */ = { 1255 | isa = XCConfigurationList; 1256 | buildConfigurations = ( 1257 | 8DF1B0F11A349BC200295741 /* Debug */, 1258 | 8DF1B0F21A349BC200295741 /* Release */, 1259 | ); 1260 | defaultConfigurationIsVisible = 0; 1261 | defaultConfigurationName = Release; 1262 | }; 1263 | /* End XCConfigurationList section */ 1264 | }; 1265 | rootObject = 8DF1B0C91A349BC200295741 /* Project object */; 1266 | } 1267 | -------------------------------------------------------------------------------- /yavfl.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /yavfl.xcodeproj/xcshareddata/xcschemes/yavfl-OSX.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 46 | 47 | 49 | 55 | 56 | 57 | 58 | 59 | 65 | 66 | 67 | 68 | 69 | 70 | 81 | 82 | 88 | 89 | 90 | 91 | 92 | 93 | 99 | 100 | 106 | 107 | 108 | 109 | 111 | 112 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /yavfl.xcodeproj/xcshareddata/xcschemes/yavfl-iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 46 | 47 | 49 | 55 | 56 | 57 | 58 | 59 | 65 | 66 | 67 | 68 | 69 | 70 | 81 | 82 | 88 | 89 | 90 | 91 | 92 | 93 | 99 | 100 | 106 | 107 | 108 | 109 | 111 | 112 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /yavfl.xcodeproj/xcshareddata/xcschemes/yavfl-tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 46 | 47 | 49 | 55 | 56 | 57 | 58 | 59 | 65 | 66 | 67 | 68 | 69 | 70 | 81 | 82 | 88 | 89 | 90 | 91 | 92 | 93 | 99 | 100 | 106 | 107 | 108 | 109 | 111 | 112 | 115 | 116 | 117 | --------------------------------------------------------------------------------