Upgrade to iOS 15, added button configurations, UIVisualEffectView, UIToolTipInteraction, Pointer style buttons, SF Symbols
|
|
@ -1,4 +1,4 @@
|
||||||
Copyright © 2020 Apple Inc.
|
Copyright © 2021 Apple Inc.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
|
|
||||||
184
README.md
|
|
@ -4,80 +4,75 @@ Customize your app's user interface with views and controls.
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
This sample guides you through several types of customizations you can make in your iOS app. The sample uses a split-view controller architecture for navigating UIKit views and controls. The primary view controller (`MasterViewController`) shows the available views and controls. When you select one, `MasterViewController` shows the secondary view controller associated with it.
|
This sample guides you through several types of customizations you can make in your iOS app. It is built with Mac Catalyst, which means the sample runs on both iOS and macOS. The sample uses a split-view controller architecture to navigate UIKit views and controls. The primary view controller (`OutlineViewController`) shows the available views and controls. When you select one, `OutlineViewController` shows the secondary view controller associated with it.
|
||||||
|
|
||||||
The name of each secondary view controller reflects its *target item*. For example, the `AlertControllerViewController` class shows how to use a `UIAlertController` object. The only exceptions to this rule are `UISearchBar` and `UIToolbar`; the sample demonstrates these APIs in multiple view controllers to explain how their controls function and how to customize them. To demonstrate how to manage the complexity of your storyboards, the app hosts all view controllers in a separate storyboard and loaded when needed.
|
The name of each secondary view controller reflects its target item. For example, the `AlertControllerViewController` class shows how to use a `UIAlertController` object. The only exceptions to this rule are `UISearchBar` and `UIToolbar`; the sample demonstrates these APIs in multiple view controllers to explain how their controls function and how to customize them. To demonstrate how to manage the complexity of your storyboards, the app hosts all view controllers in a separate storyboard and loads each as it's when needed.
|
||||||
|
|
||||||
This sample demonstrates the following views and controls (several of which are referenced in the sections below):
|
This sample demonstrates the following views and controls; several of which are referenced in the sections below:
|
||||||
|
|
||||||
* [`UIActivityIndicatorView`](https://developer.apple.com/documentation/uikit/uiactivityindicatorview)
|
* [UIActivityIndicatorView](https://developer.apple.com/documentation/uikit/uiactivityindicatorview)
|
||||||
* [`UIAlertController`](https://developer.apple.com/documentation/uikit/uialertcontroller)
|
* [UIAlertController](https://developer.apple.com/documentation/uikit/uialertcontroller)
|
||||||
* [`UIButton`](https://developer.apple.com/documentation/uikit/uibutton)
|
* [UIButton](https://developer.apple.com/documentation/uikit/uibutton)
|
||||||
* [`UIDatePicker`](https://developer.apple.com/documentation/uikit/uidatepicker)
|
* [UIButton - PointerStyleProvider](https://developer.apple.com/documentation/uikit/uibutton/pointerstyleprovider)
|
||||||
* [`UIPickerView`](https://developer.apple.com/documentation/uikit/uipickerview)
|
* [UIDatePicker](https://developer.apple.com/documentation/uikit/uidatepicker)
|
||||||
* [`UIColorPickerViewController`](https://developer.apple.com/documentation/uikit/uicolorpickerviewcontroller)
|
* [UIPickerView](https://developer.apple.com/documentation/uikit/uipickerview)
|
||||||
* [`UIColorWell`](https://developer.apple.com/documentation/uikit/uicolorwell)
|
* [UIColorPickerViewController](https://developer.apple.com/documentation/uikit/uicolorpickerviewcontroller)
|
||||||
* [`UIFontPickerViewController`](https://developer.apple.com/documentation/uikit/uifontpickerviewcontroller)
|
* [UIColorWell](https://developer.apple.com/documentation/uikit/uicolorwell)
|
||||||
* [`UIImagePickerViewController`](https://developer.apple.com/documentation/uikit/uiimagepickercontroller)
|
* [UIFontPickerViewController](https://developer.apple.com/documentation/uikit/uifontpickerviewcontroller)
|
||||||
* [`UIImageView`](https://developer.apple.com/documentation/uikit/uiimageview)
|
* [UIImagePickerViewController](https://developer.apple.com/documentation/uikit/uiimagepickercontroller)
|
||||||
* [`UIPageControl`](https://developer.apple.com/documentation/uikit/uipagecontrol)
|
* [UIImageView](https://developer.apple.com/documentation/uikit/uiimageview)
|
||||||
* [`UIProgressView`](https://developer.apple.com/documentation/uikit/uiprogressview)
|
* [UIImageView with SF Symbols](https://developer.apple.com/design/human-interface-guidelines/sf-symbols/overview)
|
||||||
* [`UISearchBar`](https://developer.apple.com/documentation/uikit/uisearchbar)
|
* [UIPageControl](https://developer.apple.com/documentation/uikit/uipagecontrol)
|
||||||
* [`UISegmentedControl`](https://developer.apple.com/documentation/uikit/uisegmentedcontrol)
|
* [UIProgressView](https://developer.apple.com/documentation/uikit/uiprogressview)
|
||||||
* [`UISlider`](https://developer.apple.com/documentation/uikit/uislider)
|
* [UISearchBar](https://developer.apple.com/documentation/uikit/uisearchbar)
|
||||||
* [`UIStackView`](https://developer.apple.com/documentation/uikit/uistackview)
|
* [UISegmentedControl](https://developer.apple.com/documentation/uikit/uisegmentedcontrol)
|
||||||
* [`UIStepper`](https://developer.apple.com/documentation/uikit/uistepper)
|
* [UISlider](https://developer.apple.com/documentation/uikit/uislider)
|
||||||
* [`UISwitch`](https://developer.apple.com/documentation/uikit/uiswitch)
|
* [UIStackView](https://developer.apple.com/documentation/uikit/uistackview)
|
||||||
* [`UITextField`](https://developer.apple.com/documentation/uikit/uitextfield)
|
* [UIStepper](https://developer.apple.com/documentation/uikit/uistepper)
|
||||||
* [`UITextFormattingCoordinator`](https://developer.apple.com/documentation/uikit/uitextformattingcoordinator)
|
* [UISwitch](https://developer.apple.com/documentation/uikit/uiswitch)
|
||||||
* [`UITextView`](https://developer.apple.com/documentation/uikit/uitextview)
|
* [UITextField](https://developer.apple.com/documentation/uikit/uitextfield)
|
||||||
* [`UIToolbar`](https://developer.apple.com/documentation/uikit/uitoolbar)
|
* [UITextFormattingCoordinator](https://developer.apple.com/documentation/uikit/uitextformattingcoordinator)
|
||||||
* [`WKWebView`](https://developer.apple.com/documentation/webkit/wkwebview)
|
* [UITextView](https://developer.apple.com/documentation/uikit/uitextview)
|
||||||
|
* [UIToolbar](https://developer.apple.com/documentation/uikit/uitoolbar)
|
||||||
|
* [UIVisualEffectView](https://developer.apple.com/documentation/uikit/uivisualeffect)
|
||||||
|
* [WKWebView](https://developer.apple.com/documentation/webkit/wkwebview)
|
||||||
|
|
||||||
## Add Accessibility Support to Your Views
|
## Configure the Sample Code Project
|
||||||
|
|
||||||
VoiceOver and other system accessibility technologies use the information provided by views and controls to help all users navigate content. UIKit views include default accessibility support. Improve user experience by providing custom accessibility information.
|
In Xcode, select your development team on the iOS-Mac target's Signing and Capabilities tab.
|
||||||
|
|
||||||
In this UIKitCatalog sample, several view controllers configure the `accessibilityType` and `accessibilityLabel` properties of their associated view. Picker view columns don't have labels, so the picker view asks its delegate for the corresponding accessibility information:
|
## Customize the Look of Buttons with Button Configurations
|
||||||
|
|
||||||
|
You can customize the appearance and behavior of a UIButton by using `UIButton.Configuration`. This sample uses a `filled()` configuration so that the button draws with a red background color:
|
||||||
|
|
||||||
``` swift
|
``` swift
|
||||||
func pickerView(_ pickerView: UIPickerView, accessibilityLabelForComponent component: Int) -> String? {
|
var config = UIButton.Configuration.filled()
|
||||||
|
config.background.backgroundColor = .systemRed
|
||||||
switch ColorComponent(rawValue: component)! {
|
button.configuration = config
|
||||||
case .red:
|
|
||||||
return NSLocalizedString("Red color component value", comment: "")
|
|
||||||
|
|
||||||
case .green:
|
|
||||||
return NSLocalizedString("Green color component value", comment: "")
|
|
||||||
|
|
||||||
case .blue:
|
|
||||||
return NSLocalizedString("Blue color component value", comment: "")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Display a Custom Alert
|
## Display a Custom Alert
|
||||||
|
|
||||||
`AlertControllerViewController` demonstrates several techniques for displaying modal alerts and action sheets from an interface. The configuration process is similar for all alerts:
|
`AlertControllerViewController` demonstrates several techniques to display modal alerts and action sheets from an interface. The configuration process is similar for all alerts:
|
||||||
|
|
||||||
1. Determine the message you want to display in the alert.
|
1. Determine the message to display in the alert.
|
||||||
2. Create and configure a `UIAlertController` object.
|
2. Create and configure a `UIAlertController` object.
|
||||||
3. Add handlers for actions the user may take.
|
3. Add handlers for actions the user may take.
|
||||||
4. Present the alert controller.
|
4. Present the alert controller.
|
||||||
|
|
||||||
The `showSimpleAlert` function uses the `NSLocalizedString` function to retrieve the alert messages in the user’s preferred language. The `showSimpleAlert` function uses those strings to create and configure the `UIAlertController` object. Although the button in the alert has the title OK, the sample uses a cancel action to ensure the alert controller applies the proper styling to the button:
|
The `showSimpleAlert` function uses the `NSLocalizedString` function to retrieve the alert messages in the user’s preferred language. The `showSimpleAlert` function uses those strings to create and configure the `UIAlertController` object. Although the button in the alert has the title OK, the sample uses a cancel action to ensure that the alert controller applies the proper styling to the button:
|
||||||
|
|
||||||
``` swift
|
``` swift
|
||||||
func showSimpleAlert() {
|
func showSimpleAlert() {
|
||||||
let title = NSLocalizedString("A Short Title is Best", comment: "")
|
let title = NSLocalizedString("A Short Title is Best", comment: "")
|
||||||
let message = NSLocalizedString("A message should be a short, complete sentence.", comment: "")
|
let message = NSLocalizedString("A message needs to be a short, complete sentence.", comment: "")
|
||||||
let cancelButtonTitle = NSLocalizedString("OK", comment: "")
|
let cancelButtonTitle = NSLocalizedString("OK", comment: "")
|
||||||
|
|
||||||
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
|
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
|
||||||
|
|
||||||
// Create the action.
|
// Create the action.
|
||||||
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
|
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
|
||||||
print("The simple alert's cancel action occurred.")
|
Swift.debugPrint("The simple alert's cancel action occurred.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the action.
|
// Add the action.
|
||||||
|
|
@ -89,31 +84,50 @@ func showSimpleAlert() {
|
||||||
|
|
||||||
## Customize the Appearance of Sliders
|
## Customize the Appearance of Sliders
|
||||||
|
|
||||||
This sample demonstrates different ways to display a `UISlider`, a control you use to select a single value from a continuous range of values. Customize the appearance of a slider by assigning stretchable images for left-side tracking, right-side tracking, and the thumb. In this example, the track image is stretchable and is one pixel wide. Make the track images wider to provide rounded corners, but be sure to set these images' `capInsets` property to allow for the corners.
|
This sample demonstrates different ways to display a `UISlider`, a control to select a single value from a continuous range of values. Customize the appearance of a slider by assigning stretchable images for left-side tracking, right-side tracking, and the thumb. In this example, the track image is stretchable and is one pixel wide. Make the track images wider to provide rounded corners, but be sure to set these images' `capInsets` property to allow for the corners.
|
||||||
|
|
||||||
The `configureCustomSlider` function sets up a custom slider:
|
The `configureCustomSlider` function sets up a custom slider:
|
||||||
|
|
||||||
``` swift
|
``` swift
|
||||||
func configureCustomSlider() {
|
@available(iOS 15.0, *)
|
||||||
|
func configureCustomSlider(slider: UISlider) {
|
||||||
|
/** To keep the look the same betwen iOS and macOS:
|
||||||
|
For setMinimumTrackImage, setMaximumTrackImage, setThumbImage to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
|
||||||
|
Available in macOS 12 or later (Mac Catalyst 15.0 or later).
|
||||||
|
Use this for controls that need to look the same between iOS and macOS.
|
||||||
|
*/
|
||||||
|
if traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
slider.preferredBehavioralStyle = .pad
|
||||||
|
}
|
||||||
|
|
||||||
let leftTrackImage = UIImage(named: "slider_blue_track")
|
let leftTrackImage = UIImage(named: "slider_blue_track")
|
||||||
customSlider.setMinimumTrackImage(leftTrackImage, for: .normal)
|
slider.setMinimumTrackImage(leftTrackImage, for: .normal)
|
||||||
|
|
||||||
let rightTrackImage = UIImage(named: "slider_green_track")
|
let rightTrackImage = UIImage(named: "slider_green_track")
|
||||||
customSlider.setMaximumTrackImage(rightTrackImage, for: .normal)
|
slider.setMaximumTrackImage(rightTrackImage, for: .normal)
|
||||||
|
|
||||||
// Set the sliding thumb image (normal and highlighted).
|
// Set the sliding thumb image (normal and highlighted).
|
||||||
let thumbImageConfig = UIImage.SymbolConfiguration(scale: .large)
|
//
|
||||||
|
// For fun, choose a different image symbol configuraton for the thumb's image between macOS and iOS.
|
||||||
|
var thumbImageConfig: UIImage.SymbolConfiguration
|
||||||
|
if slider.traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
thumbImageConfig = UIImage.SymbolConfiguration(scale: .large)
|
||||||
|
} else {
|
||||||
|
thumbImageConfig = UIImage.SymbolConfiguration(pointSize: 30, weight: .heavy, scale: .large)
|
||||||
|
}
|
||||||
let thumbImage = UIImage(systemName: "circle.fill", withConfiguration: thumbImageConfig)
|
let thumbImage = UIImage(systemName: "circle.fill", withConfiguration: thumbImageConfig)
|
||||||
customSlider.setThumbImage(thumbImage, for: .normal)
|
slider.setThumbImage(thumbImage, for: .normal)
|
||||||
|
|
||||||
let thumbImageHighlighted = UIImage(systemName: "circle", withConfiguration: thumbImageConfig)
|
let thumbImageHighlighted = UIImage(systemName: "circle", withConfiguration: thumbImageConfig)
|
||||||
customSlider.setThumbImage(thumbImageHighlighted, for: .highlighted)
|
slider.setThumbImage(thumbImageHighlighted, for: .highlighted)
|
||||||
|
|
||||||
customSlider.minimumValue = 0
|
// Set the rest of the slider's attributes.
|
||||||
customSlider.maximumValue = 100
|
slider.minimumValue = 0
|
||||||
customSlider.isContinuous = false
|
slider.maximumValue = 100
|
||||||
customSlider.value = 84
|
slider.isContinuous = false
|
||||||
|
slider.value = 84
|
||||||
|
|
||||||
customSlider.addTarget(self, action: #selector(SliderViewController.sliderValueDidChange(_:)), for: .valueChanged)
|
slider.addTarget(self, action: #selector(SliderViewController.sliderValueDidChange(_:)), for: .valueChanged)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -193,7 +207,7 @@ override func viewDidLoad() {
|
||||||
|
|
||||||
## Add a Page Control Interface
|
## Add a Page Control Interface
|
||||||
|
|
||||||
Use a `UIPageControl` to structure an app's user interface. A page control is a specialized control that displays a horizontal series of dots, each of which corresponds to a page in the app’s document or other data-model entity. Customize a page control by setting its tint color for all the page-indicator dots, and for the current page-indicator dot.
|
Use a `UIPageControl` to structure an app's user interface. A *page control* is a specialized control that displays a horizontal series of dots, each of which corresponds to a page in the app’s document or other data-model entity. Customize a page control by setting its tint color for all the page-indicator dots, and for the current page-indicator dot.
|
||||||
|
|
||||||
The `configurePageControl` function sets up a customized page control:
|
The `configurePageControl` function sets up a customized page control:
|
||||||
|
|
||||||
|
|
@ -210,23 +224,23 @@ func configurePageControl() {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Add Menus to Your Controls
|
## Add Menus to Controls
|
||||||
|
|
||||||
Attach menus to controls like `UIButton` and `UIBarButtonItem`. Create menus with the [`UIAction`](https://developer.apple.com/documentation/uikit/uiaction) class, and attach a menu to each control by setting the [`UIMenu`](https://developer.apple.com/documentation/uikit/uimenu) property.
|
Attach menus to controls like `UIButton` and `UIBarButtonItem`. Create menus with the [`UIAction`](https://developer.apple.com/documentation/uikit/uiaction) class, and attach a menu to each control by setting the [`UIMenu`](https://developer.apple.com/documentation/uikit/uimenu) property.
|
||||||
|
|
||||||
Attach a menu to a `UIButton` as shown here:
|
Attach a menu to a `UIButton` as shown here:
|
||||||
|
|
||||||
``` swift
|
``` swift
|
||||||
func configureMenuButton() {
|
button.menu = UIMenu(children: [
|
||||||
let buttonTitle = NSLocalizedString("Button", comment: "")
|
UIAction(title: String(format: NSLocalizedString("ItemTitle", comment: ""), "1"),
|
||||||
menuButton.setTitle(buttonTitle, for: .normal)
|
identifier: UIAction.Identifier(ButtonMenuActionIdentifiers.item1.rawValue),
|
||||||
|
handler: menuHandler),
|
||||||
|
UIAction(title: String(format: NSLocalizedString("ItemTitle", comment: ""), "2"),
|
||||||
|
identifier: UIAction.Identifier(ButtonMenuActionIdentifiers.item2.rawValue),
|
||||||
|
handler: menuHandler)
|
||||||
|
])
|
||||||
|
|
||||||
let items = (1...5).map {
|
button.showsMenuAsPrimaryAction = true
|
||||||
UIAction(title: String(format: NSLocalizedString("ItemTitle", comment: ""), $0.description), handler: menuHandler)
|
|
||||||
}
|
|
||||||
menuButton.menu = UIMenu(title: NSLocalizedString("ChooseItemTitle", comment: ""), children: items)
|
|
||||||
menuButton.showsMenuAsPrimaryAction = true
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Create a `UIBarButtonItem` with a menu attached as shown here:
|
Create a `UIBarButtonItem` with a menu attached as shown here:
|
||||||
|
|
@ -241,14 +255,36 @@ var customTitleBarButtonItem: UIBarButtonItem {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Add Accessibility Support to Your Views
|
||||||
|
|
||||||
|
VoiceOver and other system accessibility technologies use the information provided by views and controls to help all users navigate content. UIKit views include default accessibility support. Improve user experience by providing custom accessibility information.
|
||||||
|
|
||||||
|
In this UIKitCatalog sample, several view controllers configure the `accessibilityType` and `accessibilityLabel` properties of their associated view. Picker view columns don't have labels, so the picker view asks its delegate for the corresponding accessibility information:
|
||||||
|
|
||||||
|
``` swift
|
||||||
|
func pickerView(_ pickerView: UIPickerView, accessibilityLabelForComponent component: Int) -> String? {
|
||||||
|
|
||||||
|
switch ColorComponent(rawValue: component)! {
|
||||||
|
case .red:
|
||||||
|
return NSLocalizedString("Red color component value", comment: "")
|
||||||
|
|
||||||
|
case .green:
|
||||||
|
return NSLocalizedString("Green color component value", comment: "")
|
||||||
|
|
||||||
|
case .blue:
|
||||||
|
return NSLocalizedString("Blue color component value", comment: "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Support Mac Catalyst
|
## Support Mac Catalyst
|
||||||
|
|
||||||
This sample app is built with Mac Catalyst, which means the sample runs on both iPad and Mac. This is achieved by selecting the Mac checkbox in Project Settings. For more about how Mac Catalyst works see [Mac Catalyst](https://developer.apple.com/mac-catalyst/).
|
This sample app is built with Mac Catalyst, which means the sample runs on both iOS and Mac. This is achieved by selecting the Mac checkbox in Project Settings. For more about how Mac Catalyst works see [Mac Catalyst](https://developer.apple.com/mac-catalyst/).
|
||||||
|
|
||||||
When built for Mac Catalyst, this sample achieves:
|
When built for Mac Catalyst, this sample achieves:
|
||||||
|
|
||||||
* Interface Optimization for Mac — With Optimize Interface For the Mac project setting turned on, the app has full control of every pixel on the screen, and the app can adopt more controls specific to Mac. Building the sample for Mac Catalyst makes the app take advantage of the system features in macOS. The option Show Designed for iPad Run Destination allows this sample, as an iPad app, to run "as-is" on Apple silicon Macs. This requires macOS 11 and a Mac with Apple silicon.
|
* Interface Optimization for Mac. With Optimize Interface For the Mac project setting turned on, the app has full control of every pixel on the screen, and the app can adopt more controls specific to Mac. Building the sample for Mac Catalyst makes the app take advantage of the system features in macOS. The option Show Designed for iPad Run Destination allows this sample, as an iPad app, to run as-is on Apple silicon Macs. This requires macOS 11 and a Mac with Apple silicon.
|
||||||
|
|
||||||
* Navigation and title bar hiding — The sample app hides these to make the app appear more like a Mac app. It also changes other behaviors by using traitCollection's `userInterfaceIdiom` or the compilation conditional block that uses the `targetEnvironment():` platform condition.
|
* Navigation and title bar hiding. The sample app hides these to make the app appear more like a Mac app. It also changes other behaviors by using traitCollection's `userInterfaceIdiom`.
|
||||||
|
|
||||||
* Translucent background — By setting the split view controller's `primaryBackgroundStyle` to `.sidebar`, the primary view controller or side bar shows a blurred desktop behind its view. Setting this property has no effect when running in iOS.
|
* Translucent background. By setting the split view controller's `primaryBackgroundStyle` to `.sidebar`, the primary view controller or side bar shows a blurred desktop behind its view. Setting this property has no effect when running on iOS.
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,10 @@
|
||||||
2200544A18BC54F5002A6E8B /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2200543B18BC54F5002A6E8B /* WebViewController.swift */; };
|
2200544A18BC54F5002A6E8B /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2200543B18BC54F5002A6E8B /* WebViewController.swift */; };
|
||||||
228DBA0818BC53F1002BA12A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 228DBA0718BC53F1002BA12A /* Assets.xcassets */; };
|
228DBA0818BC53F1002BA12A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 228DBA0718BC53F1002BA12A /* Assets.xcassets */; };
|
||||||
3E5C084E1974991E00969DD7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3E5C08501974991E00969DD7 /* Main.storyboard */; };
|
3E5C084E1974991E00969DD7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3E5C08501974991E00969DD7 /* Main.storyboard */; };
|
||||||
|
530A4AB626AF352B00C0C649 /* BaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530A4AB526AF352B00C0C649 /* BaseTableViewController.swift */; };
|
||||||
5312D0F222848B0200048DE2 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 5312D0F022848B0200048DE2 /* Credits.rtf */; };
|
5312D0F222848B0200048DE2 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 5312D0F022848B0200048DE2 /* Credits.rtf */; };
|
||||||
|
531AD242265E8B1200113EC6 /* VisualEffectViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531AD241265E8B1100113EC6 /* VisualEffectViewController.swift */; };
|
||||||
|
531AD245265E8B8700113EC6 /* VisualEffectViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 531AD243265E8B8700113EC6 /* VisualEffectViewController.storyboard */; };
|
||||||
5340A1B62496CF64004F3666 /* DefaultToolbarViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5340A1B02496CF64004F3666 /* DefaultToolbarViewController.storyboard */; };
|
5340A1B62496CF64004F3666 /* DefaultToolbarViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5340A1B02496CF64004F3666 /* DefaultToolbarViewController.storyboard */; };
|
||||||
5340A1B72496CF64004F3666 /* CustomToolbarViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5340A1B22496CF64004F3666 /* CustomToolbarViewController.storyboard */; };
|
5340A1B72496CF64004F3666 /* CustomToolbarViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5340A1B22496CF64004F3666 /* CustomToolbarViewController.storyboard */; };
|
||||||
5340A1B82496CF64004F3666 /* TintedToolbarViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5340A1B42496CF64004F3666 /* TintedToolbarViewController.storyboard */; };
|
5340A1B82496CF64004F3666 /* TintedToolbarViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5340A1B42496CF64004F3666 /* TintedToolbarViewController.storyboard */; };
|
||||||
|
|
@ -41,12 +44,15 @@
|
||||||
5364C0992496C2B3009A9A52 /* DefaultPageControlViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5364C0952496C2B3009A9A52 /* DefaultPageControlViewController.storyboard */; };
|
5364C0992496C2B3009A9A52 /* DefaultPageControlViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5364C0952496C2B3009A9A52 /* DefaultPageControlViewController.storyboard */; };
|
||||||
5364C09A2496C2B3009A9A52 /* CustomPageControlViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5364C0972496C2B3009A9A52 /* CustomPageControlViewController.storyboard */; };
|
5364C09A2496C2B3009A9A52 /* CustomPageControlViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5364C0972496C2B3009A9A52 /* CustomPageControlViewController.storyboard */; };
|
||||||
53654E232298881200B999C7 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53654E222298881200B999C7 /* WebKit.framework */; };
|
53654E232298881200B999C7 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53654E222298881200B999C7 /* WebKit.framework */; };
|
||||||
|
5387556B2660933A0041A1B4 /* PointerInteractionButtonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5387556A2660933A0041A1B4 /* PointerInteractionButtonViewController.swift */; };
|
||||||
|
53875571266095990041A1B4 /* PointerInteractionButtonViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5387556F266095990041A1B4 /* PointerInteractionButtonViewController.storyboard */; };
|
||||||
538B36F41F2A8E06002AE100 /* DatePickerController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 538B36F21F2A8D97002AE100 /* DatePickerController.storyboard */; };
|
538B36F41F2A8E06002AE100 /* DatePickerController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 538B36F21F2A8D97002AE100 /* DatePickerController.storyboard */; };
|
||||||
538B36F71F2A8E8A002AE100 /* TextViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 538B36F51F2A8E66002AE100 /* TextViewController.storyboard */; };
|
538B36F71F2A8E8A002AE100 /* TextViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 538B36F51F2A8E66002AE100 /* TextViewController.storyboard */; };
|
||||||
539029FF1F2A53AD009775E3 /* AlertControllerViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 539029FD1F2A53AD009775E3 /* AlertControllerViewController.storyboard */; };
|
539029FF1F2A53AD009775E3 /* AlertControllerViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 539029FD1F2A53AD009775E3 /* AlertControllerViewController.storyboard */; };
|
||||||
539C6BAE1F27F4980006C5A9 /* ActivityIndicatorViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 539C6BA81F27F4980006C5A9 /* ActivityIndicatorViewController.storyboard */; };
|
539C6BAE1F27F4980006C5A9 /* ActivityIndicatorViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 539C6BA81F27F4980006C5A9 /* ActivityIndicatorViewController.storyboard */; };
|
||||||
539C6BAF1F27F4980006C5A9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 539C6BAA1F27F4980006C5A9 /* LaunchScreen.storyboard */; };
|
539C6BAF1F27F4980006C5A9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 539C6BAA1F27F4980006C5A9 /* LaunchScreen.storyboard */; };
|
||||||
539C6BB01F27F4980006C5A9 /* WebViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 539C6BAC1F27F4980006C5A9 /* WebViewController.storyboard */; };
|
539C6BB01F27F4980006C5A9 /* WebViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 539C6BAC1F27F4980006C5A9 /* WebViewController.storyboard */; };
|
||||||
|
53A2264B26C1AE7000C0EF3F /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 53A2264926C1A70800C0EF3F /* Localizable.stringsdict */; };
|
||||||
53A266B52491ED77008EADBB /* ImagePickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A266AE2491ED77008EADBB /* ImagePickerViewController.swift */; };
|
53A266B52491ED77008EADBB /* ImagePickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A266AE2491ED77008EADBB /* ImagePickerViewController.swift */; };
|
||||||
53A266B62491ED77008EADBB /* CustomPageControlViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A266AF2491ED77008EADBB /* CustomPageControlViewController.swift */; };
|
53A266B62491ED77008EADBB /* CustomPageControlViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A266AF2491ED77008EADBB /* CustomPageControlViewController.swift */; };
|
||||||
53A266B82491ED77008EADBB /* ColorPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A266B12491ED77008EADBB /* ColorPickerViewController.swift */; };
|
53A266B82491ED77008EADBB /* ColorPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A266B12491ED77008EADBB /* ColorPickerViewController.swift */; };
|
||||||
|
|
@ -57,6 +63,9 @@
|
||||||
53B791DA1F85505400AB2FA6 /* content.html in Resources */ = {isa = PBXBuildFile; fileRef = 53B791D41F854B4700AB2FA6 /* content.html */; };
|
53B791DA1F85505400AB2FA6 /* content.html in Resources */ = {isa = PBXBuildFile; fileRef = 53B791D41F854B4700AB2FA6 /* content.html */; };
|
||||||
53B791DB1F85505700AB2FA6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53B791D61F854B4700AB2FA6 /* InfoPlist.strings */; };
|
53B791DB1F85505700AB2FA6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53B791D61F854B4700AB2FA6 /* InfoPlist.strings */; };
|
||||||
53B791DC1F85505A00AB2FA6 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53B791D81F854B4800AB2FA6 /* Localizable.strings */; };
|
53B791DC1F85505A00AB2FA6 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53B791D81F854B4800AB2FA6 /* Localizable.strings */; };
|
||||||
|
53CB2C59265FFE9900155325 /* ButtonViewController+Configs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53CB2C58265FFE9900155325 /* ButtonViewController+Configs.swift */; };
|
||||||
|
53CB2C60266003A800155325 /* MenuButtonViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53CB2C5E266003A800155325 /* MenuButtonViewController.storyboard */; };
|
||||||
|
53CB2C62266003B200155325 /* MenuButtonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53CB2C61266003B200155325 /* MenuButtonViewController.swift */; };
|
||||||
53CE5AD81F2A89E500D8A656 /* ButtonViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53CE5AD61F2A89E500D8A656 /* ButtonViewController.storyboard */; };
|
53CE5AD81F2A89E500D8A656 /* ButtonViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53CE5AD61F2A89E500D8A656 /* ButtonViewController.storyboard */; };
|
||||||
53CE5ADE1F2A8A3D00D8A656 /* ImageViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53CE5ADC1F2A8A3D00D8A656 /* ImageViewController.storyboard */; };
|
53CE5ADE1F2A8A3D00D8A656 /* ImageViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53CE5ADC1F2A8A3D00D8A656 /* ImageViewController.storyboard */; };
|
||||||
53CE5AE61F2A8AEF00D8A656 /* PickerViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53CE5AE41F2A8AEF00D8A656 /* PickerViewController.storyboard */; };
|
53CE5AE61F2A8AEF00D8A656 /* PickerViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53CE5AE41F2A8AEF00D8A656 /* PickerViewController.storyboard */; };
|
||||||
|
|
@ -67,6 +76,9 @@
|
||||||
53CE5AF51F2A8BB000D8A656 /* StepperViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53CE5AF31F2A8BB000D8A656 /* StepperViewController.storyboard */; };
|
53CE5AF51F2A8BB000D8A656 /* StepperViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53CE5AF31F2A8BB000D8A656 /* StepperViewController.storyboard */; };
|
||||||
53CE5AF81F2A8BD000D8A656 /* SwitchViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53CE5AF61F2A8BD000D8A656 /* SwitchViewController.storyboard */; };
|
53CE5AF81F2A8BD000D8A656 /* SwitchViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53CE5AF61F2A8BD000D8A656 /* SwitchViewController.storyboard */; };
|
||||||
53CE5AFB1F2A8BEB00D8A656 /* TextFieldViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53CE5AF91F2A8BEB00D8A656 /* TextFieldViewController.storyboard */; };
|
53CE5AFB1F2A8BEB00D8A656 /* TextFieldViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53CE5AF91F2A8BEB00D8A656 /* TextFieldViewController.storyboard */; };
|
||||||
|
53D054A526790B6E00CD8B1A /* SymbolViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53D054A326790B6E00CD8B1A /* SymbolViewController.storyboard */; };
|
||||||
|
53D054A726790B7D00CD8B1A /* SymbolViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D054A626790B7D00CD8B1A /* SymbolViewController.swift */; };
|
||||||
|
53F57011265761D500458712 /* CaseElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53F57010265761D500458712 /* CaseElement.swift */; };
|
||||||
B50F41081B1D284700E5147D /* StackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50F41071B1D284700E5147D /* StackViewController.swift */; };
|
B50F41081B1D284700E5147D /* StackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B50F41071B1D284700E5147D /* StackViewController.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
|
|
@ -96,7 +108,10 @@
|
||||||
228DB9F718BC53F1002BA12A /* UIKitCatalog-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "UIKitCatalog-Info.plist"; sourceTree = "<group>"; };
|
228DB9F718BC53F1002BA12A /* UIKitCatalog-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "UIKitCatalog-Info.plist"; sourceTree = "<group>"; };
|
||||||
228DBA0718BC53F1002BA12A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
228DBA0718BC53F1002BA12A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
3E5C084F1974991E00969DD7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
3E5C084F1974991E00969DD7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||||
|
530A4AB526AF352B00C0C649 /* BaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTableViewController.swift; sourceTree = "<group>"; };
|
||||||
5312D0F122848B0200048DE2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = Base; path = Base.lproj/Credits.rtf; sourceTree = "<group>"; };
|
5312D0F122848B0200048DE2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = Base; path = Base.lproj/Credits.rtf; sourceTree = "<group>"; };
|
||||||
|
531AD241265E8B1100113EC6 /* VisualEffectViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisualEffectViewController.swift; sourceTree = "<group>"; };
|
||||||
|
531AD244265E8B8700113EC6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/VisualEffectViewController.storyboard; sourceTree = "<group>"; };
|
||||||
5340A1B12496CF64004F3666 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/DefaultToolbarViewController.storyboard; sourceTree = "<group>"; };
|
5340A1B12496CF64004F3666 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/DefaultToolbarViewController.storyboard; sourceTree = "<group>"; };
|
||||||
5340A1B32496CF64004F3666 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/CustomToolbarViewController.storyboard; sourceTree = "<group>"; };
|
5340A1B32496CF64004F3666 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/CustomToolbarViewController.storyboard; sourceTree = "<group>"; };
|
||||||
5340A1B52496CF64004F3666 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/TintedToolbarViewController.storyboard; sourceTree = "<group>"; };
|
5340A1B52496CF64004F3666 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/TintedToolbarViewController.storyboard; sourceTree = "<group>"; };
|
||||||
|
|
@ -108,12 +123,15 @@
|
||||||
5364C0962496C2B3009A9A52 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/DefaultPageControlViewController.storyboard; sourceTree = "<group>"; };
|
5364C0962496C2B3009A9A52 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/DefaultPageControlViewController.storyboard; sourceTree = "<group>"; };
|
||||||
5364C0982496C2B3009A9A52 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/CustomPageControlViewController.storyboard; sourceTree = "<group>"; };
|
5364C0982496C2B3009A9A52 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/CustomPageControlViewController.storyboard; sourceTree = "<group>"; };
|
||||||
53654E222298881200B999C7 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
|
53654E222298881200B999C7 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
|
||||||
|
5387556A2660933A0041A1B4 /* PointerInteractionButtonViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PointerInteractionButtonViewController.swift; sourceTree = "<group>"; };
|
||||||
|
53875570266095990041A1B4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/PointerInteractionButtonViewController.storyboard; sourceTree = "<group>"; };
|
||||||
538B36F31F2A8D97002AE100 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/DatePickerController.storyboard; sourceTree = "<group>"; };
|
538B36F31F2A8D97002AE100 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/DatePickerController.storyboard; sourceTree = "<group>"; };
|
||||||
538B36F61F2A8E66002AE100 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/TextViewController.storyboard; sourceTree = "<group>"; };
|
538B36F61F2A8E66002AE100 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/TextViewController.storyboard; sourceTree = "<group>"; };
|
||||||
539029FE1F2A53AD009775E3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/AlertControllerViewController.storyboard; sourceTree = "<group>"; };
|
539029FE1F2A53AD009775E3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/AlertControllerViewController.storyboard; sourceTree = "<group>"; };
|
||||||
539C6BA91F27F4980006C5A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ActivityIndicatorViewController.storyboard; sourceTree = "<group>"; };
|
539C6BA91F27F4980006C5A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ActivityIndicatorViewController.storyboard; sourceTree = "<group>"; };
|
||||||
539C6BAB1F27F4980006C5A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
539C6BAB1F27F4980006C5A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
539C6BAD1F27F4980006C5A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/WebViewController.storyboard; sourceTree = "<group>"; };
|
539C6BAD1F27F4980006C5A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/WebViewController.storyboard; sourceTree = "<group>"; };
|
||||||
|
53A2264A26C1A70800C0EF3F /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = Base; path = UIKitCatalog/Base.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
|
||||||
53A266AE2491ED77008EADBB /* ImagePickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImagePickerViewController.swift; sourceTree = "<group>"; };
|
53A266AE2491ED77008EADBB /* ImagePickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImagePickerViewController.swift; sourceTree = "<group>"; };
|
||||||
53A266AF2491ED77008EADBB /* CustomPageControlViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomPageControlViewController.swift; sourceTree = "<group>"; };
|
53A266AF2491ED77008EADBB /* CustomPageControlViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomPageControlViewController.swift; sourceTree = "<group>"; };
|
||||||
53A266B12491ED77008EADBB /* ColorPickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorPickerViewController.swift; sourceTree = "<group>"; };
|
53A266B12491ED77008EADBB /* ColorPickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorPickerViewController.swift; sourceTree = "<group>"; };
|
||||||
|
|
@ -124,6 +142,9 @@
|
||||||
53B791D51F854B4700AB2FA6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = Base; path = Base.lproj/content.html; sourceTree = "<group>"; };
|
53B791D51F854B4700AB2FA6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = Base; path = Base.lproj/content.html; sourceTree = "<group>"; };
|
||||||
53B791D71F854B4700AB2FA6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
53B791D71F854B4700AB2FA6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||||
53B791D91F854B4800AB2FA6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = "<group>"; };
|
53B791D91F854B4800AB2FA6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||||
|
53CB2C58265FFE9900155325 /* ButtonViewController+Configs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ButtonViewController+Configs.swift"; sourceTree = "<group>"; };
|
||||||
|
53CB2C5F266003A800155325 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MenuButtonViewController.storyboard; sourceTree = "<group>"; };
|
||||||
|
53CB2C61266003B200155325 /* MenuButtonViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuButtonViewController.swift; sourceTree = "<group>"; };
|
||||||
53CE5AD71F2A89E500D8A656 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ButtonViewController.storyboard; sourceTree = "<group>"; };
|
53CE5AD71F2A89E500D8A656 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ButtonViewController.storyboard; sourceTree = "<group>"; };
|
||||||
53CE5ADD1F2A8A3D00D8A656 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ImageViewController.storyboard; sourceTree = "<group>"; };
|
53CE5ADD1F2A8A3D00D8A656 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ImageViewController.storyboard; sourceTree = "<group>"; };
|
||||||
53CE5AE51F2A8AEF00D8A656 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/PickerViewController.storyboard; sourceTree = "<group>"; };
|
53CE5AE51F2A8AEF00D8A656 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/PickerViewController.storyboard; sourceTree = "<group>"; };
|
||||||
|
|
@ -134,7 +155,10 @@
|
||||||
53CE5AF41F2A8BB000D8A656 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/StepperViewController.storyboard; sourceTree = "<group>"; };
|
53CE5AF41F2A8BB000D8A656 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/StepperViewController.storyboard; sourceTree = "<group>"; };
|
||||||
53CE5AF71F2A8BD000D8A656 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/SwitchViewController.storyboard; sourceTree = "<group>"; };
|
53CE5AF71F2A8BD000D8A656 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/SwitchViewController.storyboard; sourceTree = "<group>"; };
|
||||||
53CE5AFA1F2A8BEB00D8A656 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/TextFieldViewController.storyboard; sourceTree = "<group>"; };
|
53CE5AFA1F2A8BEB00D8A656 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/TextFieldViewController.storyboard; sourceTree = "<group>"; };
|
||||||
|
53D054A426790B6E00CD8B1A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/SymbolViewController.storyboard; sourceTree = "<group>"; };
|
||||||
|
53D054A626790B7D00CD8B1A /* SymbolViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SymbolViewController.swift; sourceTree = "<group>"; };
|
||||||
53DDE73C22776382000006CF /* UIKitCatalog.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = UIKitCatalog.entitlements; sourceTree = "<group>"; };
|
53DDE73C22776382000006CF /* UIKitCatalog.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = UIKitCatalog.entitlements; sourceTree = "<group>"; };
|
||||||
|
53F57010265761D500458712 /* CaseElement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaseElement.swift; sourceTree = "<group>"; };
|
||||||
64D8CD77C30F3CED2D55B8F2 /* LICENSE.txt */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE.txt; sourceTree = "<group>"; };
|
64D8CD77C30F3CED2D55B8F2 /* LICENSE.txt */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE.txt; sourceTree = "<group>"; };
|
||||||
8A04EFECD9880EE89ADA2FE8 /* SampleCode.xcconfig */ = {isa = PBXFileReference; name = SampleCode.xcconfig; path = Configuration/SampleCode.xcconfig; sourceTree = "<group>"; };
|
8A04EFECD9880EE89ADA2FE8 /* SampleCode.xcconfig */ = {isa = PBXFileReference; name = SampleCode.xcconfig; path = Configuration/SampleCode.xcconfig; sourceTree = "<group>"; };
|
||||||
B50F41071B1D284700E5147D /* StackViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StackViewController.swift; sourceTree = "<group>"; };
|
B50F41071B1D284700E5147D /* StackViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StackViewController.swift; sourceTree = "<group>"; };
|
||||||
|
|
@ -203,6 +227,7 @@
|
||||||
53B791D41F854B4700AB2FA6 /* content.html */,
|
53B791D41F854B4700AB2FA6 /* content.html */,
|
||||||
53B791D61F854B4700AB2FA6 /* InfoPlist.strings */,
|
53B791D61F854B4700AB2FA6 /* InfoPlist.strings */,
|
||||||
53B791D81F854B4800AB2FA6 /* Localizable.strings */,
|
53B791D81F854B4800AB2FA6 /* Localizable.strings */,
|
||||||
|
53A2264926C1A70800C0EF3F /* Localizable.stringsdict */,
|
||||||
5312D0F022848B0200048DE2 /* Credits.rtf */,
|
5312D0F022848B0200048DE2 /* Credits.rtf */,
|
||||||
);
|
);
|
||||||
name = "Supporting Files";
|
name = "Supporting Files";
|
||||||
|
|
@ -235,20 +260,16 @@
|
||||||
3E1DA7601931CC99000114A9 /* Controls */ = {
|
3E1DA7601931CC99000114A9 /* Controls */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
2200542118BC54EC002A6E8B /* ButtonViewController.swift */,
|
53D34692265D86FF00D0B553 /* Button */,
|
||||||
53CE5AD61F2A89E500D8A656 /* ButtonViewController.storyboard */,
|
53CB2C5A2660038E00155325 /* Menu Button */,
|
||||||
|
53875569266093290041A1B4 /* Pointer Interaction Button */,
|
||||||
5364C0942496C22D009A9A52 /* Page Control */,
|
5364C0942496C22D009A9A52 /* Page Control */,
|
||||||
22B7BB9718BC601D006C4AD5 /* Search */,
|
22B7BB9718BC601D006C4AD5 /* Search */,
|
||||||
2200543318BC54F5002A6E8B /* SegmentedControlViewController.swift */,
|
53D34693265D871500D0B553 /* Segmented */,
|
||||||
53CE5AEA1F2A8B2F00D8A656 /* SegmentedControlViewController.storyboard */,
|
53D34694265D872A00D0B553 /* Slider */,
|
||||||
2200543418BC54F5002A6E8B /* SliderViewController.swift */,
|
53D428AA26826A8D001A0414 /* Stepper */,
|
||||||
53CE5AED1F2A8B4F00D8A656 /* SliderViewController.storyboard */,
|
53D428AC26826AB1001A0414 /* Switch */,
|
||||||
2200543618BC54F5002A6E8B /* StepperViewController.swift */,
|
53D428AB26826A9C001A0414 /* TextField */,
|
||||||
53CE5AF31F2A8BB000D8A656 /* StepperViewController.storyboard */,
|
|
||||||
2200543718BC54F5002A6E8B /* SwitchViewController.swift */,
|
|
||||||
53CE5AF61F2A8BD000D8A656 /* SwitchViewController.storyboard */,
|
|
||||||
2200543818BC54F5002A6E8B /* TextFieldViewController.swift */,
|
|
||||||
53CE5AF91F2A8BEB00D8A656 /* TextFieldViewController.storyboard */,
|
|
||||||
);
|
);
|
||||||
name = Controls;
|
name = Controls;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
|
@ -259,6 +280,8 @@
|
||||||
2200541C18BC54E8002A6E8B /* AppDelegate.swift */,
|
2200541C18BC54E8002A6E8B /* AppDelegate.swift */,
|
||||||
535D32B124970EF10011E153 /* SceneDelegate.swift */,
|
535D32B124970EF10011E153 /* SceneDelegate.swift */,
|
||||||
5364C08A249696D7009A9A52 /* OutlineViewController.swift */,
|
5364C08A249696D7009A9A52 /* OutlineViewController.swift */,
|
||||||
|
53F57010265761D500458712 /* CaseElement.swift */,
|
||||||
|
530A4AB526AF352B00C0C649 /* BaseTableViewController.swift */,
|
||||||
);
|
);
|
||||||
name = Application;
|
name = Application;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
|
@ -282,22 +305,39 @@
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
53875569266093290041A1B4 /* Pointer Interaction Button */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
5387556A2660933A0041A1B4 /* PointerInteractionButtonViewController.swift */,
|
||||||
|
5387556F266095990041A1B4 /* PointerInteractionButtonViewController.storyboard */,
|
||||||
|
);
|
||||||
|
name = "Pointer Interaction Button";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
53927674268684F900CB7664 /* ProgressView */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
2200543218BC54F5002A6E8B /* ProgressViewController.swift */,
|
||||||
|
53CE5AE71F2A8B1000D8A656 /* ProgressViewController.storyboard */,
|
||||||
|
);
|
||||||
|
name = ProgressView;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
539383DE2492800100A489A9 /* Views */ = {
|
539383DE2492800100A489A9 /* Views */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
2200541A18BC54E8002A6E8B /* ActivityIndicatorViewController.swift */,
|
53D428AD2682C58C001A0414 /* ActivityIndicator */,
|
||||||
539C6BA81F27F4980006C5A9 /* ActivityIndicatorViewController.storyboard */,
|
|
||||||
2200541B18BC54E8002A6E8B /* AlertControllerViewController.swift */,
|
2200541B18BC54E8002A6E8B /* AlertControllerViewController.swift */,
|
||||||
539029FD1F2A53AD009775E3 /* AlertControllerViewController.storyboard */,
|
539029FD1F2A53AD009775E3 /* AlertControllerViewController.storyboard */,
|
||||||
2200542D18BC54F5002A6E8B /* ImageViewController.swift */,
|
|
||||||
53CE5ADC1F2A8A3D00D8A656 /* ImageViewController.storyboard */,
|
|
||||||
2200543218BC54F5002A6E8B /* ProgressViewController.swift */,
|
|
||||||
53CE5AE71F2A8B1000D8A656 /* ProgressViewController.storyboard */,
|
|
||||||
B50F41071B1D284700E5147D /* StackViewController.swift */,
|
|
||||||
53CE5AF01F2A8B8300D8A656 /* StackViewController.storyboard */,
|
|
||||||
2200543918BC54F5002A6E8B /* TextViewController.swift */,
|
2200543918BC54F5002A6E8B /* TextViewController.swift */,
|
||||||
538B36F51F2A8E66002AE100 /* TextViewController.storyboard */,
|
538B36F51F2A8E66002AE100 /* TextViewController.storyboard */,
|
||||||
|
53D0549F26790A3200CD8B1A /* Image View */,
|
||||||
|
53927674268684F900CB7664 /* ProgressView */,
|
||||||
|
B50F41071B1D284700E5147D /* StackViewController.swift */,
|
||||||
|
53CE5AF01F2A8B8300D8A656 /* StackViewController.storyboard */,
|
||||||
22B7BB9818BC6024006C4AD5 /* Toolbar */,
|
22B7BB9818BC6024006C4AD5 /* Toolbar */,
|
||||||
|
531AD241265E8B1100113EC6 /* VisualEffectViewController.swift */,
|
||||||
|
531AD243265E8B8700113EC6 /* VisualEffectViewController.storyboard */,
|
||||||
2200543B18BC54F5002A6E8B /* WebViewController.swift */,
|
2200543B18BC54F5002A6E8B /* WebViewController.swift */,
|
||||||
539C6BAC1F27F4980006C5A9 /* WebViewController.storyboard */,
|
539C6BAC1F27F4980006C5A9 /* WebViewController.storyboard */,
|
||||||
);
|
);
|
||||||
|
|
@ -321,6 +361,90 @@
|
||||||
name = Pickers;
|
name = Pickers;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
53CB2C5A2660038E00155325 /* Menu Button */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
53CB2C61266003B200155325 /* MenuButtonViewController.swift */,
|
||||||
|
53CB2C5E266003A800155325 /* MenuButtonViewController.storyboard */,
|
||||||
|
);
|
||||||
|
name = "Menu Button";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
53D0549F26790A3200CD8B1A /* Image View */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
2200542D18BC54F5002A6E8B /* ImageViewController.swift */,
|
||||||
|
53CE5ADC1F2A8A3D00D8A656 /* ImageViewController.storyboard */,
|
||||||
|
53D054A626790B7D00CD8B1A /* SymbolViewController.swift */,
|
||||||
|
53D054A326790B6E00CD8B1A /* SymbolViewController.storyboard */,
|
||||||
|
);
|
||||||
|
name = "Image View";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
53D34692265D86FF00D0B553 /* Button */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
2200542118BC54EC002A6E8B /* ButtonViewController.swift */,
|
||||||
|
53CB2C58265FFE9900155325 /* ButtonViewController+Configs.swift */,
|
||||||
|
53CE5AD61F2A89E500D8A656 /* ButtonViewController.storyboard */,
|
||||||
|
);
|
||||||
|
name = Button;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
53D34693265D871500D0B553 /* Segmented */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
2200543318BC54F5002A6E8B /* SegmentedControlViewController.swift */,
|
||||||
|
53CE5AEA1F2A8B2F00D8A656 /* SegmentedControlViewController.storyboard */,
|
||||||
|
);
|
||||||
|
name = Segmented;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
53D34694265D872A00D0B553 /* Slider */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
2200543418BC54F5002A6E8B /* SliderViewController.swift */,
|
||||||
|
53CE5AED1F2A8B4F00D8A656 /* SliderViewController.storyboard */,
|
||||||
|
);
|
||||||
|
name = Slider;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
53D428AA26826A8D001A0414 /* Stepper */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
2200543618BC54F5002A6E8B /* StepperViewController.swift */,
|
||||||
|
53CE5AF31F2A8BB000D8A656 /* StepperViewController.storyboard */,
|
||||||
|
);
|
||||||
|
name = Stepper;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
53D428AB26826A9C001A0414 /* TextField */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
2200543818BC54F5002A6E8B /* TextFieldViewController.swift */,
|
||||||
|
53CE5AF91F2A8BEB00D8A656 /* TextFieldViewController.storyboard */,
|
||||||
|
);
|
||||||
|
name = TextField;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
53D428AC26826AB1001A0414 /* Switch */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
2200543718BC54F5002A6E8B /* SwitchViewController.swift */,
|
||||||
|
53CE5AF61F2A8BD000D8A656 /* SwitchViewController.storyboard */,
|
||||||
|
);
|
||||||
|
name = Switch;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
53D428AD2682C58C001A0414 /* ActivityIndicator */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
2200541A18BC54E8002A6E8B /* ActivityIndicatorViewController.swift */,
|
||||||
|
539C6BA81F27F4980006C5A9 /* ActivityIndicatorViewController.storyboard */,
|
||||||
|
);
|
||||||
|
name = ActivityIndicator;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
D9361AEE59ED9397893793F6 /* LICENSE */ = {
|
D9361AEE59ED9397893793F6 /* LICENSE */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
|
@ -399,12 +523,14 @@
|
||||||
53A266C22491ED9E008EADBB /* ImagePickerViewController.storyboard in Resources */,
|
53A266C22491ED9E008EADBB /* ImagePickerViewController.storyboard in Resources */,
|
||||||
5364C0992496C2B3009A9A52 /* DefaultPageControlViewController.storyboard in Resources */,
|
5364C0992496C2B3009A9A52 /* DefaultPageControlViewController.storyboard in Resources */,
|
||||||
5340A1B72496CF64004F3666 /* CustomToolbarViewController.storyboard in Resources */,
|
5340A1B72496CF64004F3666 /* CustomToolbarViewController.storyboard in Resources */,
|
||||||
|
53875571266095990041A1B4 /* PointerInteractionButtonViewController.storyboard in Resources */,
|
||||||
53CE5AE61F2A8AEF00D8A656 /* PickerViewController.storyboard in Resources */,
|
53CE5AE61F2A8AEF00D8A656 /* PickerViewController.storyboard in Resources */,
|
||||||
53B791DA1F85505400AB2FA6 /* content.html in Resources */,
|
53B791DA1F85505400AB2FA6 /* content.html in Resources */,
|
||||||
3E5C084E1974991E00969DD7 /* Main.storyboard in Resources */,
|
3E5C084E1974991E00969DD7 /* Main.storyboard in Resources */,
|
||||||
53CE5AEC1F2A8B2F00D8A656 /* SegmentedControlViewController.storyboard in Resources */,
|
53CE5AEC1F2A8B2F00D8A656 /* SegmentedControlViewController.storyboard in Resources */,
|
||||||
5364C0932496BEFD009A9A52 /* CustomSearchBarViewController.storyboard in Resources */,
|
5364C0932496BEFD009A9A52 /* CustomSearchBarViewController.storyboard in Resources */,
|
||||||
53B791DB1F85505700AB2FA6 /* InfoPlist.strings in Resources */,
|
53B791DB1F85505700AB2FA6 /* InfoPlist.strings in Resources */,
|
||||||
|
53CB2C60266003A800155325 /* MenuButtonViewController.storyboard in Resources */,
|
||||||
539C6BAE1F27F4980006C5A9 /* ActivityIndicatorViewController.storyboard in Resources */,
|
539C6BAE1F27F4980006C5A9 /* ActivityIndicatorViewController.storyboard in Resources */,
|
||||||
53CE5AFB1F2A8BEB00D8A656 /* TextFieldViewController.storyboard in Resources */,
|
53CE5AFB1F2A8BEB00D8A656 /* TextFieldViewController.storyboard in Resources */,
|
||||||
53B791DC1F85505A00AB2FA6 /* Localizable.strings in Resources */,
|
53B791DC1F85505A00AB2FA6 /* Localizable.strings in Resources */,
|
||||||
|
|
@ -415,9 +541,12 @@
|
||||||
538B36F71F2A8E8A002AE100 /* TextViewController.storyboard in Resources */,
|
538B36F71F2A8E8A002AE100 /* TextViewController.storyboard in Resources */,
|
||||||
539C6BAF1F27F4980006C5A9 /* LaunchScreen.storyboard in Resources */,
|
539C6BAF1F27F4980006C5A9 /* LaunchScreen.storyboard in Resources */,
|
||||||
5312D0F222848B0200048DE2 /* Credits.rtf in Resources */,
|
5312D0F222848B0200048DE2 /* Credits.rtf in Resources */,
|
||||||
|
53D054A526790B6E00CD8B1A /* SymbolViewController.storyboard in Resources */,
|
||||||
539029FF1F2A53AD009775E3 /* AlertControllerViewController.storyboard in Resources */,
|
539029FF1F2A53AD009775E3 /* AlertControllerViewController.storyboard in Resources */,
|
||||||
53CE5AF51F2A8BB000D8A656 /* StepperViewController.storyboard in Resources */,
|
53CE5AF51F2A8BB000D8A656 /* StepperViewController.storyboard in Resources */,
|
||||||
|
531AD245265E8B8700113EC6 /* VisualEffectViewController.storyboard in Resources */,
|
||||||
53CE5AF81F2A8BD000D8A656 /* SwitchViewController.storyboard in Resources */,
|
53CE5AF81F2A8BD000D8A656 /* SwitchViewController.storyboard in Resources */,
|
||||||
|
53A2264B26C1AE7000C0EF3F /* Localizable.stringsdict in Resources */,
|
||||||
5340A1B62496CF64004F3666 /* DefaultToolbarViewController.storyboard in Resources */,
|
5340A1B62496CF64004F3666 /* DefaultToolbarViewController.storyboard in Resources */,
|
||||||
53CE5ADE1F2A8A3D00D8A656 /* ImageViewController.storyboard in Resources */,
|
53CE5ADE1F2A8A3D00D8A656 /* ImageViewController.storyboard in Resources */,
|
||||||
);
|
);
|
||||||
|
|
@ -437,6 +566,8 @@
|
||||||
2200544218BC54F5002A6E8B /* SegmentedControlViewController.swift in Sources */,
|
2200544218BC54F5002A6E8B /* SegmentedControlViewController.swift in Sources */,
|
||||||
2200544A18BC54F5002A6E8B /* WebViewController.swift in Sources */,
|
2200544A18BC54F5002A6E8B /* WebViewController.swift in Sources */,
|
||||||
2200542018BC54E8002A6E8B /* AppDelegate.swift in Sources */,
|
2200542018BC54E8002A6E8B /* AppDelegate.swift in Sources */,
|
||||||
|
531AD242265E8B1200113EC6 /* VisualEffectViewController.swift in Sources */,
|
||||||
|
53CB2C62266003B200155325 /* MenuButtonViewController.swift in Sources */,
|
||||||
5340A1B92496D670004F3666 /* PickerViewController.swift in Sources */,
|
5340A1B92496D670004F3666 /* PickerViewController.swift in Sources */,
|
||||||
53A266B92491ED77008EADBB /* FontPickerViewController.swift in Sources */,
|
53A266B92491ED77008EADBB /* FontPickerViewController.swift in Sources */,
|
||||||
2200541F18BC54E8002A6E8B /* AlertControllerViewController.swift in Sources */,
|
2200541F18BC54E8002A6E8B /* AlertControllerViewController.swift in Sources */,
|
||||||
|
|
@ -445,16 +576,21 @@
|
||||||
2200541E18BC54E8002A6E8B /* ActivityIndicatorViewController.swift in Sources */,
|
2200541E18BC54E8002A6E8B /* ActivityIndicatorViewController.swift in Sources */,
|
||||||
2200544618BC54F5002A6E8B /* SwitchViewController.swift in Sources */,
|
2200544618BC54F5002A6E8B /* SwitchViewController.swift in Sources */,
|
||||||
B50F41081B1D284700E5147D /* StackViewController.swift in Sources */,
|
B50F41081B1D284700E5147D /* StackViewController.swift in Sources */,
|
||||||
|
530A4AB626AF352B00C0C649 /* BaseTableViewController.swift in Sources */,
|
||||||
535D32B224970EF10011E153 /* SceneDelegate.swift in Sources */,
|
535D32B224970EF10011E153 /* SceneDelegate.swift in Sources */,
|
||||||
|
53F57011265761D500458712 /* CaseElement.swift in Sources */,
|
||||||
2200544118BC54F5002A6E8B /* ProgressViewController.swift in Sources */,
|
2200544118BC54F5002A6E8B /* ProgressViewController.swift in Sources */,
|
||||||
2200544718BC54F5002A6E8B /* TextFieldViewController.swift in Sources */,
|
2200544718BC54F5002A6E8B /* TextFieldViewController.swift in Sources */,
|
||||||
2200544818BC54F5002A6E8B /* TextViewController.swift in Sources */,
|
2200544818BC54F5002A6E8B /* TextViewController.swift in Sources */,
|
||||||
|
5387556B2660933A0041A1B4 /* PointerInteractionButtonViewController.swift in Sources */,
|
||||||
2200542B18BC54EC002A6E8B /* DefaultSearchBarViewController.swift in Sources */,
|
2200542B18BC54EC002A6E8B /* DefaultSearchBarViewController.swift in Sources */,
|
||||||
2200544518BC54F5002A6E8B /* StepperViewController.swift in Sources */,
|
2200544518BC54F5002A6E8B /* StepperViewController.swift in Sources */,
|
||||||
|
53D054A726790B7D00CD8B1A /* SymbolViewController.swift in Sources */,
|
||||||
53A266B62491ED77008EADBB /* CustomPageControlViewController.swift in Sources */,
|
53A266B62491ED77008EADBB /* CustomPageControlViewController.swift in Sources */,
|
||||||
53A266B82491ED77008EADBB /* ColorPickerViewController.swift in Sources */,
|
53A266B82491ED77008EADBB /* ColorPickerViewController.swift in Sources */,
|
||||||
2200542818BC54EC002A6E8B /* CustomSearchBarViewController.swift in Sources */,
|
2200542818BC54EC002A6E8B /* CustomSearchBarViewController.swift in Sources */,
|
||||||
53A266B52491ED77008EADBB /* ImagePickerViewController.swift in Sources */,
|
53A266B52491ED77008EADBB /* ImagePickerViewController.swift in Sources */,
|
||||||
|
53CB2C59265FFE9900155325 /* ButtonViewController+Configs.swift in Sources */,
|
||||||
2200542918BC54EC002A6E8B /* CustomToolbarViewController.swift in Sources */,
|
2200542918BC54EC002A6E8B /* CustomToolbarViewController.swift in Sources */,
|
||||||
2200542A18BC54EC002A6E8B /* DatePickerController.swift in Sources */,
|
2200542A18BC54EC002A6E8B /* DatePickerController.swift in Sources */,
|
||||||
2200542718BC54EC002A6E8B /* ButtonViewController.swift in Sources */,
|
2200542718BC54EC002A6E8B /* ButtonViewController.swift in Sources */,
|
||||||
|
|
@ -480,6 +616,14 @@
|
||||||
name = Credits.rtf;
|
name = Credits.rtf;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
531AD243265E8B8700113EC6 /* VisualEffectViewController.storyboard */ = {
|
||||||
|
isa = PBXVariantGroup;
|
||||||
|
children = (
|
||||||
|
531AD244265E8B8700113EC6 /* Base */,
|
||||||
|
);
|
||||||
|
name = VisualEffectViewController.storyboard;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
5340A1B02496CF64004F3666 /* DefaultToolbarViewController.storyboard */ = {
|
5340A1B02496CF64004F3666 /* DefaultToolbarViewController.storyboard */ = {
|
||||||
isa = PBXVariantGroup;
|
isa = PBXVariantGroup;
|
||||||
children = (
|
children = (
|
||||||
|
|
@ -536,6 +680,14 @@
|
||||||
name = CustomPageControlViewController.storyboard;
|
name = CustomPageControlViewController.storyboard;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
5387556F266095990041A1B4 /* PointerInteractionButtonViewController.storyboard */ = {
|
||||||
|
isa = PBXVariantGroup;
|
||||||
|
children = (
|
||||||
|
53875570266095990041A1B4 /* Base */,
|
||||||
|
);
|
||||||
|
name = PointerInteractionButtonViewController.storyboard;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
538B36F21F2A8D97002AE100 /* DatePickerController.storyboard */ = {
|
538B36F21F2A8D97002AE100 /* DatePickerController.storyboard */ = {
|
||||||
isa = PBXVariantGroup;
|
isa = PBXVariantGroup;
|
||||||
children = (
|
children = (
|
||||||
|
|
@ -584,6 +736,14 @@
|
||||||
name = WebViewController.storyboard;
|
name = WebViewController.storyboard;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
53A2264926C1A70800C0EF3F /* Localizable.stringsdict */ = {
|
||||||
|
isa = PBXVariantGroup;
|
||||||
|
children = (
|
||||||
|
53A2264A26C1A70800C0EF3F /* Base */,
|
||||||
|
);
|
||||||
|
name = Localizable.stringsdict;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
53A266BA2491ED9E008EADBB /* ImagePickerViewController.storyboard */ = {
|
53A266BA2491ED9E008EADBB /* ImagePickerViewController.storyboard */ = {
|
||||||
isa = PBXVariantGroup;
|
isa = PBXVariantGroup;
|
||||||
children = (
|
children = (
|
||||||
|
|
@ -632,6 +792,14 @@
|
||||||
name = Localizable.strings;
|
name = Localizable.strings;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
53CB2C5E266003A800155325 /* MenuButtonViewController.storyboard */ = {
|
||||||
|
isa = PBXVariantGroup;
|
||||||
|
children = (
|
||||||
|
53CB2C5F266003A800155325 /* Base */,
|
||||||
|
);
|
||||||
|
name = MenuButtonViewController.storyboard;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
53CE5AD61F2A89E500D8A656 /* ButtonViewController.storyboard */ = {
|
53CE5AD61F2A89E500D8A656 /* ButtonViewController.storyboard */ = {
|
||||||
isa = PBXVariantGroup;
|
isa = PBXVariantGroup;
|
||||||
children = (
|
children = (
|
||||||
|
|
@ -712,6 +880,14 @@
|
||||||
name = TextFieldViewController.storyboard;
|
name = TextFieldViewController.storyboard;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
53D054A326790B6E00CD8B1A /* SymbolViewController.storyboard */ = {
|
||||||
|
isa = PBXVariantGroup;
|
||||||
|
children = (
|
||||||
|
53D054A426790B6E00CD8B1A /* Base */,
|
||||||
|
);
|
||||||
|
name = SymbolViewController.storyboard;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXVariantGroup section */
|
/* End PBXVariantGroup section */
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
|
|
@ -831,9 +1007,9 @@
|
||||||
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
|
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
INFOPLIST_FILE = "$(SRCROOT)/UIKitCatalog/UIKitCatalog-Info.plist";
|
INFOPLIST_FILE = "$(SRCROOT)/UIKitCatalog/UIKitCatalog-Info.plist";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
|
||||||
MARKETING_VERSION = 16;
|
MARKETING_VERSION = 17;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "com.example.apple-samplecode.${PRODUCT_NAME:rfc1034identifier}${SAMPLE_CODE_DISAMBIGUATOR}";
|
PRODUCT_BUNDLE_IDENTIFIER = "com.example.apple-samplecode.${PRODUCT_NAME:rfc1034identifier}${SAMPLE_CODE_DISAMBIGUATOR}";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
|
@ -854,9 +1030,9 @@
|
||||||
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
|
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
INFOPLIST_FILE = "$(SRCROOT)/UIKitCatalog/UIKitCatalog-Info.plist";
|
INFOPLIST_FILE = "$(SRCROOT)/UIKitCatalog/UIKitCatalog-Info.plist";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
|
||||||
MARKETING_VERSION = 16;
|
MARKETING_VERSION = 17;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "com.example.apple-samplecode.${PRODUCT_NAME:rfc1034identifier}${SAMPLE_CODE_DISAMBIGUATOR}";
|
PRODUCT_BUNDLE_IDENTIFIER = "com.example.apple-samplecode.${PRODUCT_NAME:rfc1034identifier}${SAMPLE_CODE_DISAMBIGUATOR}";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
|
|
||||||
|
|
@ -7,78 +7,75 @@ A view controller that demonstrates how to use `UIActivityIndicatorView`.
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
class ActivityIndicatorViewController: UITableViewController {
|
class ActivityIndicatorViewController: BaseTableViewController {
|
||||||
// MARK: - Properties
|
|
||||||
|
|
||||||
@IBOutlet weak var defaultSmallActivityIndicatorView: UIActivityIndicatorView!
|
// Cell identifier for each activity indicator table view cell.
|
||||||
@IBOutlet weak var defaultLargeActivityIndicatorView: UIActivityIndicatorView!
|
enum ActivityIndicatorKind: String, CaseIterable {
|
||||||
|
case mediumIndicator
|
||||||
@IBOutlet weak var tintedSmallActivityIndicatorView: UIActivityIndicatorView!
|
case largeIndicator
|
||||||
@IBOutlet weak var tintedLargeActivityIndicatorView: UIActivityIndicatorView!
|
case mediumTintedIndicator
|
||||||
|
case largeTintedIndicator
|
||||||
// MARK: - View Life Cycle
|
}
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
configureDefaultActivityIndicatorView()
|
testCells.append(contentsOf: [
|
||||||
configureTintedActivityIndicatorView()
|
CaseElement(title: NSLocalizedString("MediumIndicatorTitle", comment: ""),
|
||||||
|
cellID: ActivityIndicatorKind.mediumIndicator.rawValue,
|
||||||
|
configHandler: configureMediumActivityIndicatorView),
|
||||||
|
CaseElement(title: NSLocalizedString("LargeIndicatorTitle", comment: ""),
|
||||||
|
cellID: ActivityIndicatorKind.largeIndicator.rawValue,
|
||||||
|
configHandler: configureLargeActivityIndicatorView)
|
||||||
|
])
|
||||||
|
|
||||||
// When the activity is done, be sure to use UIActivityIndicatorView.stopAnimating().
|
if traitCollection.userInterfaceIdiom != .mac {
|
||||||
|
// Tinted activity indicators available only on iOS.
|
||||||
|
testCells.append(contentsOf: [
|
||||||
|
CaseElement(title: NSLocalizedString("MediumTintedIndicatorTitle", comment: ""),
|
||||||
|
cellID: ActivityIndicatorKind.mediumTintedIndicator.rawValue,
|
||||||
|
configHandler: configureMediumTintedActivityIndicatorView),
|
||||||
|
CaseElement(title: NSLocalizedString("LargeTintedIndicatorTitle", comment: ""),
|
||||||
|
cellID: ActivityIndicatorKind.largeTintedIndicator.rawValue,
|
||||||
|
configHandler: configureLargeTintedActivityIndicatorView)
|
||||||
|
])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Configuration
|
// MARK: - Configuration
|
||||||
|
|
||||||
func configureDefaultActivityIndicatorView() {
|
func configureMediumActivityIndicatorView(_ activityIndicator: UIActivityIndicatorView) {
|
||||||
defaultSmallActivityIndicatorView.style = UIActivityIndicatorView.Style.medium
|
activityIndicator.style = UIActivityIndicatorView.Style.medium
|
||||||
defaultLargeActivityIndicatorView.style = UIActivityIndicatorView.Style.large
|
activityIndicator.hidesWhenStopped = true
|
||||||
|
|
||||||
defaultSmallActivityIndicatorView.startAnimating()
|
activityIndicator.startAnimating()
|
||||||
defaultLargeActivityIndicatorView.startAnimating()
|
// When the activity is done, be sure to use UIActivityIndicatorView.stopAnimating().
|
||||||
|
|
||||||
defaultSmallActivityIndicatorView.hidesWhenStopped = true
|
|
||||||
defaultLargeActivityIndicatorView.hidesWhenStopped = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureTintedActivityIndicatorView() {
|
func configureLargeActivityIndicatorView(_ activityIndicator: UIActivityIndicatorView) {
|
||||||
tintedSmallActivityIndicatorView.style = UIActivityIndicatorView.Style.medium
|
activityIndicator.style = UIActivityIndicatorView.Style.large
|
||||||
tintedLargeActivityIndicatorView.style = UIActivityIndicatorView.Style.large
|
activityIndicator.hidesWhenStopped = true
|
||||||
|
|
||||||
tintedSmallActivityIndicatorView.color = UIColor.systemPurple
|
activityIndicator.startAnimating()
|
||||||
tintedLargeActivityIndicatorView.color = UIColor.systemPurple
|
// When the activity is done, be sure to use UIActivityIndicatorView.stopAnimating().
|
||||||
|
|
||||||
tintedSmallActivityIndicatorView.startAnimating()
|
|
||||||
tintedLargeActivityIndicatorView.startAnimating()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - UITableViewDataSource
|
func configureMediumTintedActivityIndicatorView(_ activityIndicator: UIActivityIndicatorView) {
|
||||||
|
activityIndicator.style = UIActivityIndicatorView.Style.medium
|
||||||
|
activityIndicator.hidesWhenStopped = true
|
||||||
|
activityIndicator.color = UIColor.systemPurple
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
|
activityIndicator.startAnimating()
|
||||||
#if targetEnvironment(macCatalyst)
|
// When the activity is done, be sure to use UIActivityIndicatorView.stopAnimating().
|
||||||
// Don't show tinted activitiy indicator for macOS, it does not exist.
|
|
||||||
if section == 1 {
|
|
||||||
return ""
|
|
||||||
} else {
|
|
||||||
return super.tableView(tableView, titleForHeaderInSection: section)
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return super.tableView(tableView, titleForHeaderInSection: section)
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - UITableViewDelegate
|
func configureLargeTintedActivityIndicatorView(_ activityIndicator: UIActivityIndicatorView) {
|
||||||
|
activityIndicator.style = UIActivityIndicatorView.Style.large
|
||||||
|
activityIndicator.hidesWhenStopped = true
|
||||||
|
activityIndicator.color = UIColor.systemPurple
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView,
|
activityIndicator.startAnimating()
|
||||||
heightForRowAt indexPath: IndexPath) -> CGFloat {
|
// When the activity is done, be sure to use UIActivityIndicatorView.stopAnimating().
|
||||||
#if targetEnvironment(macCatalyst)
|
|
||||||
// Don't show tinted activity indicator for macOS, it does not exist.
|
|
||||||
if indexPath.section == 1 {
|
|
||||||
return 0
|
|
||||||
} else {
|
|
||||||
return super.tableView(tableView, heightForRowAt: indexPath)
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return super.tableView(tableView, heightForRowAt: indexPath)
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,21 +32,21 @@ class AlertControllerViewController: UITableViewController {
|
||||||
case howOtherActionSheet
|
case howOtherActionSheet
|
||||||
}
|
}
|
||||||
|
|
||||||
private var textDidChangeObserver: NSObjectProtocol!
|
private var textDidChangeObserver: Any? = nil
|
||||||
|
|
||||||
// MARK: - UIAlertControllerStyleAlert Style Alerts
|
// MARK: - UIAlertControllerStyleAlert Style Alerts
|
||||||
|
|
||||||
/// Show an alert with an "OK" button.
|
/// Show an alert with an "OK" button.
|
||||||
func showSimpleAlert() {
|
func showSimpleAlert() {
|
||||||
let title = NSLocalizedString("A Short Title is Best", comment: "")
|
let title = NSLocalizedString("A Short Title is Best", comment: "")
|
||||||
let message = NSLocalizedString("A message should be a short, complete sentence.", comment: "")
|
let message = NSLocalizedString("A message needs to be a short, complete sentence.", comment: "")
|
||||||
let cancelButtonTitle = NSLocalizedString("OK", comment: "")
|
let cancelButtonTitle = NSLocalizedString("OK", comment: "")
|
||||||
|
|
||||||
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
|
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
|
||||||
|
|
||||||
// Create the action.
|
// Create the action.
|
||||||
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
|
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
|
||||||
print("The simple alert's cancel action occurred.")
|
Swift.debugPrint("The simple alert's cancel action occurred.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the action.
|
// Add the action.
|
||||||
|
|
@ -58,7 +58,7 @@ class AlertControllerViewController: UITableViewController {
|
||||||
/// Show an alert with an "OK" and "Cancel" button.
|
/// Show an alert with an "OK" and "Cancel" button.
|
||||||
func showOkayCancelAlert() {
|
func showOkayCancelAlert() {
|
||||||
let title = NSLocalizedString("A Short Title is Best", comment: "")
|
let title = NSLocalizedString("A Short Title is Best", comment: "")
|
||||||
let message = NSLocalizedString("A message should be a short, complete sentence.", comment: "")
|
let message = NSLocalizedString("A message needs to be a short, complete sentence.", comment: "")
|
||||||
let cancelButtonTitle = NSLocalizedString("Cancel", comment: "")
|
let cancelButtonTitle = NSLocalizedString("Cancel", comment: "")
|
||||||
let otherButtonTitle = NSLocalizedString("OK", comment: "")
|
let otherButtonTitle = NSLocalizedString("OK", comment: "")
|
||||||
|
|
||||||
|
|
@ -66,11 +66,11 @@ class AlertControllerViewController: UITableViewController {
|
||||||
|
|
||||||
// Create the actions.
|
// Create the actions.
|
||||||
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
|
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
|
||||||
print("The \"OK/Cancel\" alert's cancel action occurred.")
|
Swift.debugPrint("The \"OK/Cancel\" alert's cancel action occurred.")
|
||||||
}
|
}
|
||||||
|
|
||||||
let otherAction = UIAlertAction(title: otherButtonTitle, style: .default) { _ in
|
let otherAction = UIAlertAction(title: otherButtonTitle, style: .default) { _ in
|
||||||
print("The \"OK/Cancel\" alert's other action occurred.")
|
Swift.debugPrint("The \"OK/Cancel\" alert's other action occurred.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the actions.
|
// Add the actions.
|
||||||
|
|
@ -83,7 +83,7 @@ class AlertControllerViewController: UITableViewController {
|
||||||
/// Show an alert with two custom buttons.
|
/// Show an alert with two custom buttons.
|
||||||
func showOtherAlert() {
|
func showOtherAlert() {
|
||||||
let title = NSLocalizedString("A Short Title is Best", comment: "")
|
let title = NSLocalizedString("A Short Title is Best", comment: "")
|
||||||
let message = NSLocalizedString("A message should be a short, complete sentence.", comment: "")
|
let message = NSLocalizedString("A message needs to be a short, complete sentence.", comment: "")
|
||||||
let cancelButtonTitle = NSLocalizedString("Cancel", comment: "")
|
let cancelButtonTitle = NSLocalizedString("Cancel", comment: "")
|
||||||
let otherButtonTitleOne = NSLocalizedString("Choice One", comment: "")
|
let otherButtonTitleOne = NSLocalizedString("Choice One", comment: "")
|
||||||
let otherButtonTitleTwo = NSLocalizedString("Choice Two", comment: "")
|
let otherButtonTitleTwo = NSLocalizedString("Choice Two", comment: "")
|
||||||
|
|
@ -92,15 +92,15 @@ class AlertControllerViewController: UITableViewController {
|
||||||
|
|
||||||
// Create the actions.
|
// Create the actions.
|
||||||
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
|
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
|
||||||
print("The \"Other\" alert's cancel action occurred.")
|
Swift.debugPrint("The \"Other\" alert's cancel action occurred.")
|
||||||
}
|
}
|
||||||
|
|
||||||
let otherButtonOneAction = UIAlertAction(title: otherButtonTitleOne, style: .default) { _ in
|
let otherButtonOneAction = UIAlertAction(title: otherButtonTitleOne, style: .default) { _ in
|
||||||
print("The \"Other\" alert's other button one action occurred.")
|
Swift.debugPrint("The \"Other\" alert's other button one action occurred.")
|
||||||
}
|
}
|
||||||
|
|
||||||
let otherButtonTwoAction = UIAlertAction(title: otherButtonTitleTwo, style: .default) { _ in
|
let otherButtonTwoAction = UIAlertAction(title: otherButtonTitleTwo, style: .default) { _ in
|
||||||
print("The \"Other\" alert's other button two action occurred.")
|
Swift.debugPrint("The \"Other\" alert's other button two action occurred.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the actions.
|
// Add the actions.
|
||||||
|
|
@ -114,7 +114,7 @@ class AlertControllerViewController: UITableViewController {
|
||||||
/// Show a text entry alert with two custom buttons.
|
/// Show a text entry alert with two custom buttons.
|
||||||
func showTextEntryAlert() {
|
func showTextEntryAlert() {
|
||||||
let title = NSLocalizedString("A Short Title is Best", comment: "")
|
let title = NSLocalizedString("A Short Title is Best", comment: "")
|
||||||
let message = NSLocalizedString("A message should be a short, complete sentence.", comment: "")
|
let message = NSLocalizedString("A message needs to be a short, complete sentence.", comment: "")
|
||||||
|
|
||||||
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
|
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
|
||||||
|
|
||||||
|
|
@ -126,12 +126,12 @@ class AlertControllerViewController: UITableViewController {
|
||||||
// Create the actions.
|
// Create the actions.
|
||||||
let cancelButtonTitle = NSLocalizedString("Cancel", comment: "")
|
let cancelButtonTitle = NSLocalizedString("Cancel", comment: "")
|
||||||
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
|
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
|
||||||
print("The \"Text Entry\" alert's cancel action occurred.")
|
Swift.debugPrint("The \"Text Entry\" alert's cancel action occurred.")
|
||||||
}
|
}
|
||||||
|
|
||||||
let otherButtonTitle = NSLocalizedString("OK", comment: "")
|
let otherButtonTitle = NSLocalizedString("OK", comment: "")
|
||||||
let otherAction = UIAlertAction(title: otherButtonTitle, style: .default) { _ in
|
let otherAction = UIAlertAction(title: otherButtonTitle, style: .default) { _ in
|
||||||
print("The \"Text Entry\" alert's other action occurred.")
|
Swift.debugPrint("The \"Text Entry\" alert's other action occurred.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the actions.
|
// Add the actions.
|
||||||
|
|
@ -144,7 +144,7 @@ class AlertControllerViewController: UITableViewController {
|
||||||
/// Show a secure text entry alert with two custom buttons.
|
/// Show a secure text entry alert with two custom buttons.
|
||||||
func showSecureTextEntryAlert() {
|
func showSecureTextEntryAlert() {
|
||||||
let title = NSLocalizedString("A Short Title is Best", comment: "")
|
let title = NSLocalizedString("A Short Title is Best", comment: "")
|
||||||
let message = NSLocalizedString("A message should be a short, complete sentence.", comment: "")
|
let message = NSLocalizedString("A message needs to be a short, complete sentence.", comment: "")
|
||||||
let cancelButtonTitle = NSLocalizedString("Cancel", comment: "")
|
let cancelButtonTitle = NSLocalizedString("Cancel", comment: "")
|
||||||
let otherButtonTitle = NSLocalizedString("OK", comment: "")
|
let otherButtonTitle = NSLocalizedString("OK", comment: "")
|
||||||
|
|
||||||
|
|
@ -152,34 +152,40 @@ class AlertControllerViewController: UITableViewController {
|
||||||
|
|
||||||
// Add the text field for the secure text entry.
|
// Add the text field for the secure text entry.
|
||||||
alertController.addTextField { textField in
|
alertController.addTextField { textField in
|
||||||
/** Listen for changes to the text field's text so that we can toggle the current
|
if let observer = self.textDidChangeObserver {
|
||||||
|
NotificationCenter.default.removeObserver(observer)
|
||||||
|
}
|
||||||
|
/** Listen for changes to the text field's text so that we can toggle the current
|
||||||
action's enabled property based on whether the user has entered a sufficiently
|
action's enabled property based on whether the user has entered a sufficiently
|
||||||
secure entry.
|
secure entry.
|
||||||
*/
|
*/
|
||||||
self.textDidChangeObserver = NotificationCenter.default.addObserver(
|
self.textDidChangeObserver =
|
||||||
forName: UITextField.textDidChangeNotification,
|
NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification,
|
||||||
object: textField,
|
object: textField,
|
||||||
queue: OperationQueue.main) { (notification) in
|
queue: OperationQueue.main,
|
||||||
if let textField = notification.object as? UITextField {
|
using: { (notification) in
|
||||||
// Enforce a minimum length of >= 5 characters for secure text alerts.
|
if let textField = notification.object as? UITextField {
|
||||||
if let text = textField.text {
|
// Enforce a minimum length of >= 5 characters for secure text alerts.
|
||||||
self.secureTextAlertAction!.isEnabled = text.count >= 5
|
if let alertAction = self.secureTextAlertAction {
|
||||||
} else {
|
if let text = textField.text {
|
||||||
self.secureTextAlertAction!.isEnabled = false
|
alertAction.isEnabled = text.count >= 5
|
||||||
}
|
} else {
|
||||||
}
|
alertAction.isEnabled = false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
textField.isSecureTextEntry = true
|
textField.isSecureTextEntry = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the actions.
|
// Create the actions.
|
||||||
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
|
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
|
||||||
print("The \"Secure Text Entry\" alert's cancel action occurred.")
|
Swift.debugPrint("The \"Secure Text Entry\" alert's cancel action occurred.")
|
||||||
}
|
}
|
||||||
|
|
||||||
let otherAction = UIAlertAction(title: otherButtonTitle, style: .default) { _ in
|
let otherAction = UIAlertAction(title: otherButtonTitle, style: .default) { _ in
|
||||||
print("The \"Secure Text Entry\" alert's other action occurred.")
|
Swift.debugPrint("The \"Secure Text Entry\" alert's other action occurred.")
|
||||||
}
|
}
|
||||||
|
|
||||||
/** The text field initially has no text in the text field, so we'll disable it for now.
|
/** The text field initially has no text in the text field, so we'll disable it for now.
|
||||||
|
|
@ -203,7 +209,7 @@ class AlertControllerViewController: UITableViewController {
|
||||||
|
|
||||||
// Show a dialog with an "OK" and "Cancel" button.
|
// Show a dialog with an "OK" and "Cancel" button.
|
||||||
func showOkayCancelActionSheet(_ selectedIndexPath: IndexPath) {
|
func showOkayCancelActionSheet(_ selectedIndexPath: IndexPath) {
|
||||||
let message = NSLocalizedString("A message should be a short, complete sentence.", comment: "")
|
let message = NSLocalizedString("A message needs to be a short, complete sentence.", comment: "")
|
||||||
let cancelButtonTitle = NSLocalizedString("Cancel", comment: "")
|
let cancelButtonTitle = NSLocalizedString("Cancel", comment: "")
|
||||||
let destructiveButtonTitle = NSLocalizedString("Confirm", comment: "")
|
let destructiveButtonTitle = NSLocalizedString("Confirm", comment: "")
|
||||||
|
|
||||||
|
|
@ -211,11 +217,11 @@ class AlertControllerViewController: UITableViewController {
|
||||||
|
|
||||||
// Create the actions.
|
// Create the actions.
|
||||||
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
|
let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .cancel) { _ in
|
||||||
print("The \"OK/Cancel\" alert action sheet's cancel action occurred.")
|
Swift.debugPrint("The \"OK/Cancel\" alert action sheet's cancel action occurred.")
|
||||||
}
|
}
|
||||||
|
|
||||||
let destructiveAction = UIAlertAction(title: destructiveButtonTitle, style: .default) { _ in
|
let destructiveAction = UIAlertAction(title: destructiveButtonTitle, style: .default) { _ in
|
||||||
print("The \"Confirm\" alert action sheet's destructive action occurred.")
|
Swift.debugPrint("The \"Confirm\" alert action sheet's destructive action occurred.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the actions.
|
// Add the actions.
|
||||||
|
|
@ -238,7 +244,7 @@ class AlertControllerViewController: UITableViewController {
|
||||||
|
|
||||||
// Show a dialog with two custom buttons.
|
// Show a dialog with two custom buttons.
|
||||||
func showOtherActionSheet(_ selectedIndexPath: IndexPath) {
|
func showOtherActionSheet(_ selectedIndexPath: IndexPath) {
|
||||||
let message = NSLocalizedString("A message should be a short, complete sentence.", comment: "")
|
let message = NSLocalizedString("A message needs to be a short, complete sentence.", comment: "")
|
||||||
let destructiveButtonTitle = NSLocalizedString("Destructive Choice", comment: "")
|
let destructiveButtonTitle = NSLocalizedString("Destructive Choice", comment: "")
|
||||||
let otherButtonTitle = NSLocalizedString("Safe Choice", comment: "")
|
let otherButtonTitle = NSLocalizedString("Safe Choice", comment: "")
|
||||||
|
|
||||||
|
|
@ -246,10 +252,10 @@ class AlertControllerViewController: UITableViewController {
|
||||||
|
|
||||||
// Create the actions.
|
// Create the actions.
|
||||||
let destructiveAction = UIAlertAction(title: destructiveButtonTitle, style: .destructive) { _ in
|
let destructiveAction = UIAlertAction(title: destructiveButtonTitle, style: .destructive) { _ in
|
||||||
print("The \"Other\" alert action sheet's destructive action occurred.")
|
Swift.debugPrint("The \"Other\" alert action sheet's destructive action occurred.")
|
||||||
}
|
}
|
||||||
let otherAction = UIAlertAction(title: otherButtonTitle, style: .default) { _ in
|
let otherAction = UIAlertAction(title: otherButtonTitle, style: .default) { _ in
|
||||||
print("The \"Other\" alert action sheet's other action occurred.")
|
Swift.debugPrint("The \"Other\" alert action sheet's other action occurred.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the actions.
|
// Add the actions.
|
||||||
|
|
@ -275,6 +281,7 @@ class AlertControllerViewController: UITableViewController {
|
||||||
// MARK: - UITableViewDelegate
|
// MARK: - UITableViewDelegate
|
||||||
|
|
||||||
extension AlertControllerViewController {
|
extension AlertControllerViewController {
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||||
switch indexPath.section {
|
switch indexPath.section {
|
||||||
case StyleSections.alertStyleSection.rawValue:
|
case StyleSections.alertStyleSection.rawValue:
|
||||||
|
|
|
||||||
|
|
@ -15,4 +15,3 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 2 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 2 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
|
|
@ -1,23 +1,23 @@
|
||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "stepper_and_segment_segment_divider_1x.png",
|
"filename" : "stepper_and_segment_segment_divider_1x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
"scale" : "1x"
|
"scale" : "1x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "stepper_and_segment_segment_divider_2x.png",
|
"filename" : "stepper_and_segment_segment_divider_2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "stepper_and_segment_divider_3x.png",
|
"filename" : "stepper_and_segment_divider_3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
"scale" : "3x"
|
"scale" : "3x"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info" : {
|
"info" : {
|
||||||
"version" : 1,
|
"author" : "xcode",
|
||||||
"author" : "xcode"
|
"version" : 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 931 B After Width: | Height: | Size: 931 B |
|
Before Width: | Height: | Size: 931 B After Width: | Height: | Size: 931 B |
|
|
@ -1,23 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "decrement_1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "decrement_2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "stepper_decrement_3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
|
@ -1,23 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "increment_1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "increment_2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "stepper_increment_3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 3 KiB |
|
|
@ -1,23 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "x_icon_1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "x_icon_2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "x_icon_3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
|
@ -1,8 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14800.2" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="YvC-vN-mSd">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19115.3" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="YvC-vN-mSd">
|
||||||
<device id="retina4_7" orientation="portrait"/>
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14758.1"/>
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19107.5"/>
|
||||||
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
|
|
@ -10,105 +12,104 @@
|
||||||
<scene sceneID="umG-hc-QKi">
|
<scene sceneID="umG-hc-QKi">
|
||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="YvC-vN-mSd" customClass="ActivityIndicatorViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
<tableViewController id="YvC-vN-mSd" customClass="ActivityIndicatorViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="Udh-X7-hOc">
|
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="none" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="Udh-X7-hOc">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
<sections>
|
<prototypes>
|
||||||
<tableViewSection headerTitle="Default" id="9eg-PX-Muo">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="mediumIndicator" id="tgP-Bv-OZJ">
|
||||||
<cells>
|
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" rowHeight="58" id="yn2-Ta-5b4">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="55.5" width="375" height="58"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="tgP-Bv-OZJ" id="t4n-Fp-hZf">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="yn2-Ta-5b4" id="wPg-rJ-XdR">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="58"/>
|
<subviews>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" style="medium" translatesAutoresizingMaskIntoConstraints="NO" id="BhE-e0-XEQ">
|
||||||
<subviews>
|
<rect key="frame" x="177.5" y="12" width="20" height="20"/>
|
||||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="CZW-TS-wTd">
|
</activityIndicatorView>
|
||||||
<rect key="frame" x="146.5" y="10.5" width="82" height="37"/>
|
</subviews>
|
||||||
<subviews>
|
<constraints>
|
||||||
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="751" verticalHuggingPriority="750" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="5Na-2m-UBr">
|
<constraint firstItem="BhE-e0-XEQ" firstAttribute="centerY" secondItem="t4n-Fp-hZf" secondAttribute="centerY" id="l0f-Zv-mkO"/>
|
||||||
<rect key="frame" x="8" y="8" width="20" height="21"/>
|
<constraint firstItem="BhE-e0-XEQ" firstAttribute="centerX" secondItem="t4n-Fp-hZf" secondAttribute="centerX" id="pYa-yf-RPH"/>
|
||||||
</activityIndicatorView>
|
</constraints>
|
||||||
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="M5t-YG-hcB">
|
</tableViewCellContentView>
|
||||||
<rect key="frame" x="36" y="0.0" width="37" height="37"/>
|
</tableViewCell>
|
||||||
</activityIndicatorView>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="largeTintedIndicator" id="XTJ-Tf-hFJ">
|
||||||
</subviews>
|
<rect key="frame" x="0.0" y="99.5" width="375" height="44"/>
|
||||||
<constraints>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="M5t-YG-hcB" secondAttribute="trailing" constant="9" id="1bF-2T-IsT"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="XTJ-Tf-hFJ" id="XdV-an-jUP">
|
||||||
<constraint firstItem="M5t-YG-hcB" firstAttribute="centerY" secondItem="CZW-TS-wTd" secondAttribute="centerY" id="A4N-by-OTy"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<constraint firstItem="5Na-2m-UBr" firstAttribute="leading" secondItem="CZW-TS-wTd" secondAttribute="leading" constant="8" id="FBn-Ws-tsw"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<constraint firstItem="5Na-2m-UBr" firstAttribute="top" secondItem="CZW-TS-wTd" secondAttribute="topMargin" id="MvP-me-LhS"/>
|
<subviews>
|
||||||
<constraint firstAttribute="trailing" secondItem="5Na-2m-UBr" secondAttribute="trailing" constant="54" id="U69-I5-xXs"/>
|
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" style="large" translatesAutoresizingMaskIntoConstraints="NO" id="F4W-ha-d4W">
|
||||||
<constraint firstItem="M5t-YG-hcB" firstAttribute="leading" secondItem="5Na-2m-UBr" secondAttribute="trailing" constant="8" id="WAa-aQ-QNn"/>
|
<rect key="frame" x="168" y="-41" width="39" height="126"/>
|
||||||
<constraint firstItem="5Na-2m-UBr" firstAttribute="centerY" secondItem="CZW-TS-wTd" secondAttribute="centerY" id="YzJ-Gf-v77"/>
|
|
||||||
</constraints>
|
|
||||||
</view>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="CZW-TS-wTd" firstAttribute="centerY" secondItem="wPg-rJ-XdR" secondAttribute="centerY" id="Cy2-2r-1JH"/>
|
<constraint firstAttribute="width" constant="39" id="U31-3L-4Cp"/>
|
||||||
<constraint firstItem="CZW-TS-wTd" firstAttribute="top" secondItem="wPg-rJ-XdR" secondAttribute="topMargin" constant="-0.5" id="XUu-jo-iSH"/>
|
|
||||||
<constraint firstItem="CZW-TS-wTd" firstAttribute="centerX" secondItem="wPg-rJ-XdR" secondAttribute="centerX" id="ysP-dk-etz"/>
|
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
</activityIndicatorView>
|
||||||
</tableViewCell>
|
</subviews>
|
||||||
</cells>
|
<constraints>
|
||||||
</tableViewSection>
|
<constraint firstItem="F4W-ha-d4W" firstAttribute="centerY" secondItem="XdV-an-jUP" secondAttribute="centerY" id="9O7-It-vd3"/>
|
||||||
<tableViewSection headerTitle="Tinted" id="fUA-1K-3Rv">
|
<constraint firstItem="F4W-ha-d4W" firstAttribute="centerX" secondItem="XdV-an-jUP" secondAttribute="centerX" id="QdK-5H-ZrI"/>
|
||||||
<cells>
|
<constraint firstItem="F4W-ha-d4W" firstAttribute="top" secondItem="XdV-an-jUP" secondAttribute="topMargin" constant="-52" id="ThX-1U-KdZ"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" rowHeight="58" id="z0B-YV-ic1">
|
</constraints>
|
||||||
<rect key="frame" x="0.0" y="161.5" width="375" height="58"/>
|
</tableViewCellContentView>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</tableViewCell>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="z0B-YV-ic1" id="stF-iz-x9q">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="mediumTintedIndicator" id="V1a-px-nGs">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="58"/>
|
<rect key="frame" x="0.0" y="143.5" width="375" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="V1a-px-nGs" id="EiR-Xd-gjh">
|
||||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jfs-lj-Sfc">
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<rect key="frame" x="146" y="10.5" width="83" height="37"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="751" verticalHuggingPriority="750" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="wIr-u3-n9x">
|
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" style="medium" translatesAutoresizingMaskIntoConstraints="NO" id="jSR-AA-dfM">
|
||||||
<rect key="frame" x="9" y="8.5" width="20" height="20"/>
|
<rect key="frame" x="177.5" y="12" width="20" height="20"/>
|
||||||
</activityIndicatorView>
|
</activityIndicatorView>
|
||||||
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="3sQ-iE-m13">
|
</subviews>
|
||||||
<rect key="frame" x="37" y="0.0" width="37" height="37"/>
|
<constraints>
|
||||||
</activityIndicatorView>
|
<constraint firstItem="jSR-AA-dfM" firstAttribute="centerX" secondItem="EiR-Xd-gjh" secondAttribute="centerX" id="PJF-Ll-EfR"/>
|
||||||
</subviews>
|
<constraint firstItem="jSR-AA-dfM" firstAttribute="centerY" secondItem="EiR-Xd-gjh" secondAttribute="centerY" id="bzY-9h-zub"/>
|
||||||
<constraints>
|
</constraints>
|
||||||
<constraint firstItem="wIr-u3-n9x" firstAttribute="leading" secondItem="jfs-lj-Sfc" secondAttribute="leading" constant="9" id="2mc-QB-RED"/>
|
</tableViewCellContentView>
|
||||||
<constraint firstItem="wIr-u3-n9x" firstAttribute="centerY" secondItem="jfs-lj-Sfc" secondAttribute="centerY" id="5Qz-DP-S4N"/>
|
</tableViewCell>
|
||||||
<constraint firstAttribute="trailing" secondItem="wIr-u3-n9x" secondAttribute="trailing" constant="54" id="MTT-x5-NMH"/>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="largeIndicator" id="grT-ev-Cdb">
|
||||||
<constraint firstItem="3sQ-iE-m13" firstAttribute="leading" secondItem="jfs-lj-Sfc" secondAttribute="leading" constant="37" id="UeD-iL-B9a"/>
|
<rect key="frame" x="0.0" y="187.5" width="375" height="44"/>
|
||||||
<constraint firstItem="3sQ-iE-m13" firstAttribute="leading" secondItem="wIr-u3-n9x" secondAttribute="trailing" constant="8" id="Utt-C4-s05"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<constraint firstItem="3sQ-iE-m13" firstAttribute="centerY" secondItem="jfs-lj-Sfc" secondAttribute="centerY" id="r6x-Qx-NhW"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="grT-ev-Cdb" id="vHi-Pt-8IC">
|
||||||
</constraints>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
</view>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</subviews>
|
<subviews>
|
||||||
|
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" style="large" translatesAutoresizingMaskIntoConstraints="NO" id="R5k-I2-cs0">
|
||||||
|
<rect key="frame" x="168" y="-41" width="39" height="126"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="jfs-lj-Sfc" firstAttribute="centerX" secondItem="stF-iz-x9q" secondAttribute="centerX" id="56m-vE-nN6"/>
|
<constraint firstAttribute="width" constant="39" id="YCs-2l-mC1"/>
|
||||||
<constraint firstItem="jfs-lj-Sfc" firstAttribute="top" secondItem="stF-iz-x9q" secondAttribute="topMargin" constant="-0.5" id="KKl-gs-zOA"/>
|
|
||||||
<constraint firstItem="jfs-lj-Sfc" firstAttribute="centerY" secondItem="stF-iz-x9q" secondAttribute="centerY" id="hO9-Dt-132"/>
|
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
</activityIndicatorView>
|
||||||
</tableViewCell>
|
</subviews>
|
||||||
</cells>
|
<constraints>
|
||||||
</tableViewSection>
|
<constraint firstItem="R5k-I2-cs0" firstAttribute="top" secondItem="vHi-Pt-8IC" secondAttribute="topMargin" constant="-52" id="DA1-Oi-JYV"/>
|
||||||
</sections>
|
<constraint firstItem="R5k-I2-cs0" firstAttribute="centerY" secondItem="vHi-Pt-8IC" secondAttribute="centerY" id="FbR-nl-pCD"/>
|
||||||
|
<constraint firstItem="R5k-I2-cs0" firstAttribute="centerX" secondItem="vHi-Pt-8IC" secondAttribute="centerX" id="aaz-PN-Eme"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
</prototypes>
|
||||||
|
<sections/>
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="dataSource" destination="YvC-vN-mSd" id="teo-Yh-WfL"/>
|
<outlet property="dataSource" destination="YvC-vN-mSd" id="teo-Yh-WfL"/>
|
||||||
<outlet property="delegate" destination="YvC-vN-mSd" id="s5w-Zv-MyP"/>
|
<outlet property="delegate" destination="YvC-vN-mSd" id="s5w-Zv-MyP"/>
|
||||||
</connections>
|
</connections>
|
||||||
</tableView>
|
</tableView>
|
||||||
<navigationItem key="navigationItem" title="Activity Indicators" id="Cch-q9-uGA"/>
|
<navigationItem key="navigationItem" title="Activity Indicators" id="Cch-q9-uGA"/>
|
||||||
<connections>
|
|
||||||
<outlet property="defaultLargeActivityIndicatorView" destination="M5t-YG-hcB" id="2zA-DO-R8r"/>
|
|
||||||
<outlet property="defaultSmallActivityIndicatorView" destination="5Na-2m-UBr" id="AS0-YP-dxQ"/>
|
|
||||||
<outlet property="tintedLargeActivityIndicatorView" destination="3sQ-iE-m13" id="uJU-XN-Y7A"/>
|
|
||||||
<outlet property="tintedSmallActivityIndicatorView" destination="wIr-u3-n9x" id="zgT-Ua-dnv"/>
|
|
||||||
</connections>
|
|
||||||
</tableViewController>
|
</tableViewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="dqV-LB-3XC" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="dqV-LB-3XC" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="-3991.1999999999998" y="2371.6641679160421"/>
|
<point key="canvasLocation" x="-3991.1999999999998" y="2371.6641679160421"/>
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
|
<resources>
|
||||||
|
<systemColor name="systemBackgroundColor">
|
||||||
|
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</systemColor>
|
||||||
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17132" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="gl0-hM-EWg">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19150" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="gl0-hM-EWg">
|
||||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17105"/>
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19134"/>
|
||||||
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
|
|
@ -10,184 +12,427 @@
|
||||||
<scene sceneID="q2O-rM-1tM">
|
<scene sceneID="q2O-rM-1tM">
|
||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="gl0-hM-EWg" customClass="ButtonViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
<tableViewController id="gl0-hM-EWg" customClass="ButtonViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="gDs-OX-aHt">
|
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="none" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="gDs-OX-aHt">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
<sections>
|
<prototypes>
|
||||||
<tableViewSection headerTitle="System (Text)" id="ZP1-Vp-Dmj">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonSystemAddContact" id="Hc9-ap-n8A">
|
||||||
<cells>
|
<rect key="frame" x="0.0" y="49.5" width="375" height="44"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="kEp-Mb-jNt">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Hc9-ap-n8A" id="b9N-g9-uSb">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="kEp-Mb-jNt" id="4pA-My-XiJ">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<subviews>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="contactAdd" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="uCl-YR-FNB">
|
||||||
<subviews>
|
<rect key="frame" x="177.5" y="12" width="20" height="20"/>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="4Kt-uW-BR1">
|
</button>
|
||||||
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
</subviews>
|
||||||
<state key="normal" title="Button"/>
|
<constraints>
|
||||||
</button>
|
<constraint firstAttribute="centerY" secondItem="uCl-YR-FNB" secondAttribute="centerY" id="HMu-7o-czy"/>
|
||||||
</subviews>
|
<constraint firstAttribute="centerX" secondItem="uCl-YR-FNB" secondAttribute="centerX" id="jfo-SY-wKL"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonDetailDisclosure" id="1gE-3k-T9Z">
|
||||||
|
<rect key="frame" x="0.0" y="93.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="1gE-3k-T9Z" id="FrP-gA-38P">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="detailDisclosure" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Glo-Os-pmP">
|
||||||
|
<rect key="frame" x="177.5" y="12" width="20" height="20"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="Glo-Os-pmP" secondAttribute="centerY" id="RmA-0a-mJT"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="Glo-Os-pmP" secondAttribute="centerX" id="nSB-wM-z33"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonStyleGray" id="3Ax-m0-9Oh">
|
||||||
|
<rect key="frame" x="0.0" y="137.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="3Ax-m0-9Oh" id="OOg-qg-ztS">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="n1x-US-Vob">
|
||||||
|
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" title="Button"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="n1x-US-Vob" secondAttribute="centerY" id="WT1-zg-S1R"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="n1x-US-Vob" secondAttribute="centerX" id="tmz-rn-WTa"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonUpdateActivityHandler" id="9Q3-nJ-bZ5">
|
||||||
|
<rect key="frame" x="0.0" y="181.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="9Q3-nJ-bZ5" id="e9s-It-bBS">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="10" selected="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="6GG-7E-4Uz">
|
||||||
|
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" title="Button"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="6GG-7E-4Uz" firstAttribute="centerY" secondItem="e9s-It-bBS" secondAttribute="centerY" id="Vue-pK-cjw"/>
|
||||||
|
<constraint firstItem="6GG-7E-4Uz" firstAttribute="centerX" secondItem="e9s-It-bBS" secondAttribute="centerX" id="coC-Jl-slg"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonAttrText" id="evM-yg-9Yo">
|
||||||
|
<rect key="frame" x="0.0" y="225.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="evM-yg-9Yo" id="94W-qU-eV7">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="BNE-O0-EhQ">
|
||||||
|
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
||||||
|
<state key="normal" title="Button"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="BNE-O0-EhQ" secondAttribute="centerY" id="Bf5-x7-mKz"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="BNE-O0-EhQ" secondAttribute="centerX" id="qZ7-dH-0MF"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonSymbol" id="glf-vk-VYT">
|
||||||
|
<rect key="frame" x="0.0" y="269.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="glf-vk-VYT" id="kQH-TG-R1o">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Uv9-5g-MMh">
|
||||||
|
<rect key="frame" x="172.5" y="7" width="30" height="30"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="Uv9-5g-MMh" secondAttribute="centerY" id="Hbu-T9-3d7"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="Uv9-5g-MMh" secondAttribute="centerX" id="S3Y-fM-MYy"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="addToCartButton" rowHeight="61" id="hjm-If-If6">
|
||||||
|
<rect key="frame" x="0.0" y="313.5" width="375" height="61"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="hjm-If-If6" id="Ss5-YW-ScX">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="61"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hGl-J1-14i">
|
||||||
|
<rect key="frame" x="102.5" y="7.5" width="170" height="46"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="centerY" secondItem="4Kt-uW-BR1" secondAttribute="centerY" id="OGG-gW-auW"/>
|
<constraint firstAttribute="width" constant="170" id="2Gt-Eb-4ZX"/>
|
||||||
<constraint firstAttribute="centerX" secondItem="4Kt-uW-BR1" secondAttribute="centerX" id="d8D-yc-Qoo"/>
|
<constraint firstAttribute="height" constant="46" id="qmV-Ea-cyH"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
</tableViewCell>
|
</button>
|
||||||
</cells>
|
</subviews>
|
||||||
</tableViewSection>
|
<constraints>
|
||||||
<tableViewSection headerTitle="System (Contact Add)" id="yhv-dT-Yah">
|
<constraint firstItem="hGl-J1-14i" firstAttribute="centerY" secondItem="Ss5-YW-ScX" secondAttribute="centerY" id="XHl-jr-hmI"/>
|
||||||
<cells>
|
<constraint firstItem="hGl-J1-14i" firstAttribute="centerX" secondItem="Ss5-YW-ScX" secondAttribute="centerX" id="pbE-Fi-hVr"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="h90-Oi-fmq">
|
</constraints>
|
||||||
<rect key="frame" x="0.0" y="147.5" width="375" height="44"/>
|
</tableViewCellContentView>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</tableViewCell>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="h90-Oi-fmq" id="zIs-mq-UBK">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonMultiTitle" id="mIg-gn-9wM">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<rect key="frame" x="0.0" y="374.5" width="375" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="mIg-gn-9wM" id="zbg-lQ-aNN">
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="contactAdd" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Kaz-JT-zT4">
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<rect key="frame" x="175" y="10" width="25" height="24"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</button>
|
<subviews>
|
||||||
</subviews>
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0g2-vt-Q3D">
|
||||||
|
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" title="Button"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="0g2-vt-Q3D" firstAttribute="centerY" secondItem="zbg-lQ-aNN" secondAttribute="centerY" id="6xl-GW-Sg1"/>
|
||||||
|
<constraint firstItem="0g2-vt-Q3D" firstAttribute="centerX" secondItem="zbg-lQ-aNN" secondAttribute="centerX" id="a17-mH-qB4"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonSystem" id="udF-ec-G1b">
|
||||||
|
<rect key="frame" x="0.0" y="418.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="udF-ec-G1b" id="Qvd-3e-cWf">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="cta-fX-In8">
|
||||||
|
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
||||||
|
<state key="normal" title="Button"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="cta-fX-In8" secondAttribute="centerY" id="Aqi-j4-5c8"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="cta-fX-In8" secondAttribute="centerX" id="BIA-cd-R7c"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonTitleColor" id="Fyu-fK-gQ6">
|
||||||
|
<rect key="frame" x="0.0" y="462.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Fyu-fK-gQ6" id="bxc-Th-ECF">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="SG9-lq-h4c">
|
||||||
|
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
||||||
|
<state key="normal" title="Button"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="SG9-lq-h4c" secondAttribute="centerY" id="uu1-5r-io5"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="SG9-lq-h4c" secondAttribute="centerX" id="vcd-kS-xnl"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonUpdateHandler" id="iiH-wp-Mec">
|
||||||
|
<rect key="frame" x="0.0" y="506.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="iiH-wp-Mec" id="cBZ-DP-SQ5">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="10" selected="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="AGF-DC-j4O">
|
||||||
|
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" title="Button"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="AGF-DC-j4O" firstAttribute="centerX" secondItem="cBZ-DP-SQ5" secondAttribute="centerX" id="fUm-0E-Vpj"/>
|
||||||
|
<constraint firstItem="AGF-DC-j4O" firstAttribute="centerY" secondItem="cBZ-DP-SQ5" secondAttribute="centerY" id="lRU-EM-elF"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonToggle" id="B0b-CB-gDT">
|
||||||
|
<rect key="frame" x="0.0" y="550.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="B0b-CB-gDT" id="bEk-py-CdA">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="8bp-hm-SGp">
|
||||||
|
<rect key="frame" x="164" y="7" width="47" height="30"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" title="Toggle"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="8bp-hm-SGp" firstAttribute="centerY" secondItem="bEk-py-CdA" secondAttribute="centerY" id="JiW-Y6-fkN"/>
|
||||||
|
<constraint firstItem="8bp-hm-SGp" firstAttribute="centerX" secondItem="bEk-py-CdA" secondAttribute="centerX" id="pcA-he-Seb"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonImageUpdateHandler" id="46M-T7-Oy3">
|
||||||
|
<rect key="frame" x="0.0" y="594.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="46M-T7-Oy3" id="U4f-oa-jHI">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FMl-bN-Rmn">
|
||||||
|
<rect key="frame" x="164" y="7" width="47" height="30"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" title="Toggle"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="FMl-bN-Rmn" firstAttribute="centerY" secondItem="U4f-oa-jHI" secondAttribute="centerY" id="5je-2D-3Xu"/>
|
||||||
|
<constraint firstItem="FMl-bN-Rmn" firstAttribute="centerX" secondItem="U4f-oa-jHI" secondAttribute="centerX" id="tIt-yz-D7j"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonTextSymbol" id="YHo-tf-ujm">
|
||||||
|
<rect key="frame" x="0.0" y="638.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="YHo-tf-ujm" id="PW5-BM-zHa">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="LSV-c2-qif">
|
||||||
|
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
||||||
|
<state key="normal" title="Button"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="LSV-c2-qif" secondAttribute="centerY" id="755-gU-ITh"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="LSV-c2-qif" secondAttribute="centerX" id="UMP-wV-Nfg"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonSymbolText" id="Swz-Wm-Uje" userLabel="buttonSymbolText">
|
||||||
|
<rect key="frame" x="0.0" y="682.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Swz-Wm-Uje" id="07H-tv-wPH">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="XQY-49-CgB">
|
||||||
|
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
||||||
|
<state key="normal" title="Button"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="XQY-49-CgB" secondAttribute="centerX" id="8L1-II-o1H"/>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="XQY-49-CgB" secondAttribute="centerY" id="ubG-it-P9J"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonBackground" id="eUl-MC-eCP">
|
||||||
|
<rect key="frame" x="0.0" y="726.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="eUl-MC-eCP" id="OEk-Cd-u2y">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Vm1-an-lht">
|
||||||
|
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" title="Button"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="Vm1-an-lht" firstAttribute="centerX" secondItem="OEk-Cd-u2y" secondAttribute="centerX" id="KFZ-Bs-Bo8"/>
|
||||||
|
<constraint firstItem="Vm1-an-lht" firstAttribute="centerY" secondItem="OEk-Cd-u2y" secondAttribute="centerY" id="nAv-UD-aUy"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonClose" id="y0n-GV-c2A">
|
||||||
|
<rect key="frame" x="0.0" y="770.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="y0n-GV-c2A" id="fIA-5C-eqH">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="close" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="O6l-mq-E45">
|
||||||
|
<rect key="frame" x="172.5" y="7" width="30" height="30"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="centerX" secondItem="Kaz-JT-zT4" secondAttribute="centerX" id="NLz-rT-HFS"/>
|
<constraint firstAttribute="width" constant="30" id="tte-Nq-wRc"/>
|
||||||
<constraint firstAttribute="centerY" secondItem="Kaz-JT-zT4" secondAttribute="centerY" id="ijD-77-x7g"/>
|
<constraint firstAttribute="height" constant="30" id="xb7-U5-TUD"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
</tableViewCell>
|
</button>
|
||||||
</cells>
|
</subviews>
|
||||||
</tableViewSection>
|
<constraints>
|
||||||
<tableViewSection headerTitle="System (Detail Disclosure)" id="Uaa-gd-ORk">
|
<constraint firstAttribute="centerX" secondItem="O6l-mq-E45" secondAttribute="centerX" id="QXl-p2-0Fb"/>
|
||||||
<cells>
|
<constraint firstAttribute="centerY" secondItem="O6l-mq-E45" secondAttribute="centerY" id="aDg-eV-F5N"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="Zoj-H2-9xS">
|
</constraints>
|
||||||
<rect key="frame" x="0.0" y="239.5" width="375" height="44"/>
|
</tableViewCellContentView>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</tableViewCell>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Zoj-H2-9xS" id="kOh-TM-Vhn">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonLargeSymbol" id="apZ-sG-DvC">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<rect key="frame" x="0.0" y="814.5" width="375" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="apZ-sG-DvC" id="5Kr-vf-LZQ">
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="detailDisclosure" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="1kk-qb-b6p">
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<rect key="frame" x="175" y="10" width="25" height="24"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</button>
|
<subviews>
|
||||||
</subviews>
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="vvm-ds-MdT">
|
||||||
|
<rect key="frame" x="172.5" y="7" width="30" height="30"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="vvm-ds-MdT" secondAttribute="centerX" id="DfF-1y-bgf"/>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="vvm-ds-MdT" secondAttribute="centerY" id="KOh-Hz-ZwM"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonStyleTinted" id="H4z-4N-xoc">
|
||||||
|
<rect key="frame" x="0.0" y="858.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="H4z-4N-xoc" id="2dD-bd-cHm">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="shq-FQ-9Zh">
|
||||||
|
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
||||||
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
|
<state key="normal" title="Button"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="shq-FQ-9Zh" secondAttribute="centerY" id="ZYG-xE-ZE2"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="shq-FQ-9Zh" secondAttribute="centerX" id="zJC-IO-ElU"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonStyleFilled" id="ORZ-cZ-J2f">
|
||||||
|
<rect key="frame" x="0.0" y="902.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ORZ-cZ-J2f" id="2vQ-e3-R0m">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Pf2-03-Ttu">
|
||||||
|
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="centerX" secondItem="1kk-qb-b6p" secondAttribute="centerX" id="6JK-8x-4Wp"/>
|
<constraint firstAttribute="height" constant="30" id="1FC-9e-5z4"/>
|
||||||
<constraint firstAttribute="centerY" secondItem="1kk-qb-b6p" secondAttribute="centerY" id="frb-Yq-Tu9"/>
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="46" id="xlx-v7-ukl"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
</tableViewCell>
|
<state key="normal" title="Button"/>
|
||||||
</cells>
|
</button>
|
||||||
</tableViewSection>
|
</subviews>
|
||||||
<tableViewSection headerTitle="Image" id="g6U-rt-rxY">
|
<constraints>
|
||||||
<cells>
|
<constraint firstAttribute="centerY" secondItem="Pf2-03-Ttu" secondAttribute="centerY" id="FvB-vF-OAd"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="FHo-QU-Dbd">
|
<constraint firstAttribute="centerX" secondItem="Pf2-03-Ttu" secondAttribute="centerX" id="fpy-D4-Rpb"/>
|
||||||
<rect key="frame" x="0.0" y="331.5" width="375" height="44"/>
|
</constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</tableViewCellContentView>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="FHo-QU-Dbd" id="kI0-Vx-CmV">
|
</tableViewCell>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonImage" id="fAD-Wv-wU1">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="0.0" y="946.5" width="375" height="44"/>
|
||||||
<subviews>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="W4I-NX-srt">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="fAD-Wv-wU1" id="Jyv-wE-NZ7">
|
||||||
<rect key="frame" x="172.5" y="5" width="30" height="34"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
</button>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</subviews>
|
<subviews>
|
||||||
<constraints>
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="c3R-k9-JaH">
|
||||||
<constraint firstItem="W4I-NX-srt" firstAttribute="centerY" secondItem="kI0-Vx-CmV" secondAttribute="centerY" id="3JW-rC-ZTg"/>
|
<rect key="frame" x="172.5" y="5" width="30" height="34"/>
|
||||||
<constraint firstItem="W4I-NX-srt" firstAttribute="centerX" secondItem="kI0-Vx-CmV" secondAttribute="centerX" id="UlE-gj-Jmh"/>
|
</button>
|
||||||
</constraints>
|
</subviews>
|
||||||
</tableViewCellContentView>
|
<constraints>
|
||||||
</tableViewCell>
|
<constraint firstItem="c3R-k9-JaH" firstAttribute="centerX" secondItem="Jyv-wE-NZ7" secondAttribute="centerX" id="S8V-2j-3R4"/>
|
||||||
</cells>
|
<constraint firstItem="c3R-k9-JaH" firstAttribute="centerY" secondItem="Jyv-wE-NZ7" secondAttribute="centerY" id="qAd-0h-4Xg"/>
|
||||||
</tableViewSection>
|
</constraints>
|
||||||
<tableViewSection headerTitle="Attributed Text" id="Orn-0a-yT5">
|
</tableViewCellContentView>
|
||||||
<cells>
|
</tableViewCell>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="aNB-XX-idG">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonCornerStyle" id="r1g-kE-qzu">
|
||||||
<rect key="frame" x="0.0" y="423.5" width="375" height="44"/>
|
<rect key="frame" x="0.0" y="990.5" width="375" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="aNB-XX-idG" id="zVr-S5-LW6">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="r1g-kE-qzu" id="sHD-bp-X5L">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ynp-Un-3Nj">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="akL-cx-LFf">
|
||||||
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
||||||
<state key="normal" title="Button"/>
|
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
||||||
</button>
|
<state key="normal" title="Button"/>
|
||||||
</subviews>
|
</button>
|
||||||
<constraints>
|
</subviews>
|
||||||
<constraint firstAttribute="centerY" secondItem="ynp-Un-3Nj" secondAttribute="centerY" id="eg6-fR-ae7"/>
|
<constraints>
|
||||||
<constraint firstAttribute="centerX" secondItem="ynp-Un-3Nj" secondAttribute="centerX" id="irC-vH-juQ"/>
|
<constraint firstItem="akL-cx-LFf" firstAttribute="centerX" secondItem="sHD-bp-X5L" secondAttribute="centerX" id="K8n-kN-9cY"/>
|
||||||
</constraints>
|
<constraint firstItem="akL-cx-LFf" firstAttribute="centerY" secondItem="sHD-bp-X5L" secondAttribute="centerY" id="MfJ-hf-qWO"/>
|
||||||
</tableViewCellContentView>
|
</constraints>
|
||||||
</tableViewCell>
|
</tableViewCellContentView>
|
||||||
</cells>
|
</tableViewCell>
|
||||||
</tableViewSection>
|
</prototypes>
|
||||||
<tableViewSection headerTitle="System (Symbol)" id="YPO-DM-d7b">
|
<sections/>
|
||||||
<cells>
|
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="nch-0K-etg">
|
|
||||||
<rect key="frame" x="0.0" y="515.5" width="375" height="44"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="nch-0K-etg" id="9tf-qq-iAy">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
<subviews>
|
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="QwT-La-9Hy">
|
|
||||||
<rect key="frame" x="172.5" y="7" width="30" height="30"/>
|
|
||||||
</button>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="centerY" secondItem="QwT-La-9Hy" secondAttribute="centerY" id="ZXe-oo-R9a"/>
|
|
||||||
<constraint firstAttribute="centerX" secondItem="QwT-La-9Hy" secondAttribute="centerX" id="iTr-X3-rKh"/>
|
|
||||||
</constraints>
|
|
||||||
</tableViewCellContentView>
|
|
||||||
</tableViewCell>
|
|
||||||
</cells>
|
|
||||||
</tableViewSection>
|
|
||||||
<tableViewSection headerTitle="System (Text + Symbol)" id="Foz-RV-Pf7">
|
|
||||||
<cells>
|
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="efR-L3-lDw">
|
|
||||||
<rect key="frame" x="0.0" y="607.5" width="375" height="44"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="efR-L3-lDw" id="ZyN-Rl-rCp">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
<subviews>
|
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="oaQ-1y-atp">
|
|
||||||
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
|
||||||
<state key="normal" title="Button"/>
|
|
||||||
</button>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="centerY" secondItem="oaQ-1y-atp" secondAttribute="centerY" id="mYE-T6-yLW"/>
|
|
||||||
<constraint firstAttribute="centerX" secondItem="oaQ-1y-atp" secondAttribute="centerX" id="qKh-qB-Zu9"/>
|
|
||||||
</constraints>
|
|
||||||
</tableViewCellContentView>
|
|
||||||
</tableViewCell>
|
|
||||||
</cells>
|
|
||||||
</tableViewSection>
|
|
||||||
<tableViewSection headerTitle="System (Menu)" id="JI3-Nv-lhU" userLabel="System (Menu)">
|
|
||||||
<cells>
|
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="5do-Y4-XZ3">
|
|
||||||
<rect key="frame" x="0.0" y="699.5" width="375" height="44"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="5do-Y4-XZ3" id="SkS-Fh-7aO">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
<subviews>
|
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="e8l-iZ-Xgp">
|
|
||||||
<rect key="frame" x="164.5" y="7" width="46" height="30"/>
|
|
||||||
<state key="normal" title="Button"/>
|
|
||||||
</button>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="centerY" secondItem="e8l-iZ-Xgp" secondAttribute="centerY" id="TJT-8l-A9J"/>
|
|
||||||
<constraint firstAttribute="centerX" secondItem="e8l-iZ-Xgp" secondAttribute="centerX" id="j0q-Fg-J0m"/>
|
|
||||||
</constraints>
|
|
||||||
</tableViewCellContentView>
|
|
||||||
</tableViewCell>
|
|
||||||
</cells>
|
|
||||||
</tableViewSection>
|
|
||||||
</sections>
|
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="dataSource" destination="gl0-hM-EWg" id="CGJ-ZK-3Nr"/>
|
<outlet property="dataSource" destination="gl0-hM-EWg" id="CGJ-ZK-3Nr"/>
|
||||||
<outlet property="delegate" destination="gl0-hM-EWg" id="fqM-wz-bSp"/>
|
<outlet property="delegate" destination="gl0-hM-EWg" id="fqM-wz-bSp"/>
|
||||||
|
|
@ -195,16 +440,6 @@
|
||||||
</tableView>
|
</tableView>
|
||||||
<navigationItem key="navigationItem" title="Buttons" id="NGY-Dv-sY9"/>
|
<navigationItem key="navigationItem" title="Buttons" id="NGY-Dv-sY9"/>
|
||||||
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
||||||
<connections>
|
|
||||||
<outlet property="attributedTextButton" destination="ynp-Un-3Nj" id="GnF-wA-dTM"/>
|
|
||||||
<outlet property="imageButton" destination="W4I-NX-srt" id="4p1-oE-iSs"/>
|
|
||||||
<outlet property="menuButton" destination="e8l-iZ-Xgp" id="QPX-YE-FIT"/>
|
|
||||||
<outlet property="symbolButton" destination="QwT-La-9Hy" id="sIN-Di-Y0D"/>
|
|
||||||
<outlet property="symbolTextButton" destination="oaQ-1y-atp" id="Xem-ED-whh"/>
|
|
||||||
<outlet property="systemContactAddButton" destination="Kaz-JT-zT4" id="U38-FM-tgn"/>
|
|
||||||
<outlet property="systemDetailDisclosureButton" destination="1kk-qb-b6p" id="hCA-Ru-6aE"/>
|
|
||||||
<outlet property="systemTextButton" destination="4Kt-uW-BR1" id="BdS-qx-wTr"/>
|
|
||||||
</connections>
|
|
||||||
</tableViewController>
|
</tableViewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="w5U-DZ-TWT" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="w5U-DZ-TWT" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
|
|
@ -212,8 +447,8 @@
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
<resources>
|
<resources>
|
||||||
<systemColor name="groupTableViewBackgroundColor">
|
<systemColor name="systemBackgroundColor">
|
||||||
<color red="0.94901960784313721" green="0.94901960784313721" blue="0.96862745098039216" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
</systemColor>
|
</systemColor>
|
||||||
</resources>
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
{\rtf1\ansi\ansicpg1252\cocoartf2513
|
{\rtf1\ansi\ansicpg1252\cocoartf2617
|
||||||
\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fnil\fcharset0 LucidaGrande;}
|
\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fnil\fcharset0 LucidaGrande;}
|
||||||
{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
|
{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
|
||||||
{\*\expandedcolortbl;;\cssrgb\c0\c0\c0\cname textColor;}
|
{\*\expandedcolortbl;;\cssrgb\c0\c0\c0\cname textColor;}
|
||||||
\vieww9000\viewh8400\viewkind0
|
\vieww9000\viewh8400\viewkind0
|
||||||
\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\qc\partightenfactor0
|
\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\qc\partightenfactor0
|
||||||
|
|
||||||
\f0\fs20 \cf2 Demonstrates how to use UIKit's views, controls and pickers.\
|
\f0\fs20 \cf2 Demonstrates how to use {\field{\*\fldinst{HYPERLINK "https://developer.apple.com/documentation/uikit"}}{\fldrslt UIKit}}\
|
||||||
|
views, controls and pickers.\
|
||||||
}
|
}
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14810.12" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="XCI-A9-c2M">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19115.3" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="XCI-A9-c2M">
|
||||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14766.15"/>
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19107.5"/>
|
||||||
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
|
|
@ -13,7 +15,7 @@
|
||||||
<imageView key="view" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" id="InE-1J-uPb">
|
<imageView key="view" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" id="InE-1J-uPb">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
<toolbarItems/>
|
<toolbarItems/>
|
||||||
<navigationItem key="navigationItem" title="Image View" id="1uT-59-ex0"/>
|
<navigationItem key="navigationItem" title="Image View" id="1uT-59-ex0"/>
|
||||||
|
|
@ -25,4 +27,9 @@
|
||||||
<point key="canvasLocation" x="-684" y="3368"/>
|
<point key="canvasLocation" x="-684" y="3368"/>
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
|
<resources>
|
||||||
|
<systemColor name="systemBackgroundColor">
|
||||||
|
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</systemColor>
|
||||||
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
||||||
|
|
@ -5,5 +5,5 @@ Abstract:
|
||||||
Localized versions of Info.plist keys.
|
Localized versions of Info.plist keys.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
CFBundleGetInfoString = "v16.0, Copyright 2008-2020, Apple Inc.";
|
CFBundleGetInfoString = "v16.0, Copyright 2008-2021, Apple Inc.";
|
||||||
NSHumanReadableCopyright = "Copyright © 2008-2020, Apple Inc.";
|
NSHumanReadableCopyright = "Copyright © 2008-2021, Apple Inc.";
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,11 @@ Strings used across the application via the NSLocalizedString API.
|
||||||
"Destructive Choice" = "Destructive Choice";
|
"Destructive Choice" = "Destructive Choice";
|
||||||
"Safe Choice" = "Safe Choice";
|
"Safe Choice" = "Safe Choice";
|
||||||
"A Short Title Is Best" = "A Short Title Is Best";
|
"A Short Title Is Best" = "A Short Title Is Best";
|
||||||
"A message should be a short, complete sentence." = "A message should be a short, complete sentence.";
|
"A message needs to be a short, complete sentence." = "A message needs to be a short, complete sentence.";
|
||||||
"Choice One" = "Choice One";
|
"Choice One" = "Choice One";
|
||||||
"Choice Two" = "Choice Two";
|
"Choice Two" = "Choice Two";
|
||||||
"Button" = "Button";
|
"Button" = "Button";
|
||||||
|
"Pressed" = "Pressed";
|
||||||
"X Button" = "X Button";
|
"X Button" = "X Button";
|
||||||
"Image" = "Image";
|
"Image" = "Image";
|
||||||
"bold" = "bold";
|
"bold" = "bold";
|
||||||
|
|
@ -26,7 +27,7 @@ Strings used across the application via the NSLocalizedString API.
|
||||||
"Red color component value" = "Red color component value";
|
"Red color component value" = "Red color component value";
|
||||||
"Green color component value" = "Green color component value";
|
"Green color component value" = "Green color component value";
|
||||||
"Blue color component value" = "Blue color component value";
|
"Blue color component value" = "Blue color component value";
|
||||||
"Animated images" = "Animated images";
|
"Animated" = "A slide show of images";
|
||||||
|
|
||||||
"Airplane" = "Airplane";
|
"Airplane" = "Airplane";
|
||||||
"Gift" = "Gift";
|
"Gift" = "Gift";
|
||||||
|
|
@ -35,6 +36,8 @@ Strings used across the application via the NSLocalizedString API.
|
||||||
"An error occurred:" = "An error occurred:";
|
"An error occurred:" = "An error occurred:";
|
||||||
|
|
||||||
"ButtonsTitle" = "Buttons";
|
"ButtonsTitle" = "Buttons";
|
||||||
|
"MenuButtonsTitle" = "Menu Buttons";
|
||||||
|
"PointerInteractionButtonsTitle" = "Pointer Interaction";
|
||||||
"PageControlTitle" = "Page Controls";
|
"PageControlTitle" = "Page Controls";
|
||||||
"SearchBarsTitle" = "Search Bars";
|
"SearchBarsTitle" = "Search Bars";
|
||||||
"SegmentedControlsTitle" = "Segmented Controls";
|
"SegmentedControlsTitle" = "Segmented Controls";
|
||||||
|
|
@ -45,11 +48,16 @@ Strings used across the application via the NSLocalizedString API.
|
||||||
|
|
||||||
"ActivityIndicatorsTitle" = "Activity Indicators";
|
"ActivityIndicatorsTitle" = "Activity Indicators";
|
||||||
"AlertControllersTitle" = "Alert Controllers";
|
"AlertControllersTitle" = "Alert Controllers";
|
||||||
|
|
||||||
|
"ImagesTitle" = "Image Views";
|
||||||
"ImageViewTitle" = "Image View";
|
"ImageViewTitle" = "Image View";
|
||||||
|
"SymbolsTitle" = "SF Symbol";
|
||||||
|
|
||||||
"ProgressViewsTitle" = "Progress Views";
|
"ProgressViewsTitle" = "Progress Views";
|
||||||
"StackViewsTitle" = "Stack Views";
|
"StackViewsTitle" = "Stack Views";
|
||||||
"TextViewTitle" = "Text View";
|
"TextViewTitle" = "Text View";
|
||||||
"ToolbarsTitle" = "Toolbars";
|
"ToolbarsTitle" = "Toolbars";
|
||||||
|
"VisualEffectTitle" = "Visual Effect";
|
||||||
"WebViewTitle" = "Web View";
|
"WebViewTitle" = "Web View";
|
||||||
|
|
||||||
"DatePickerTitle" = "Date Picker";
|
"DatePickerTitle" = "Date Picker";
|
||||||
|
|
@ -79,3 +87,87 @@ Strings used across the application via the NSLocalizedString API.
|
||||||
|
|
||||||
"SwitchTitle" = "Title";
|
"SwitchTitle" = "Title";
|
||||||
|
|
||||||
|
"DefaultSwitchTitle" = "Default";
|
||||||
|
"CheckboxSwitchTitle" = "Checkbox";
|
||||||
|
"TintedSwitchTitle" = "Tinted";
|
||||||
|
|
||||||
|
"ImageToolTipTitle" = "This is a list of flower photos obtained from the sample's asset library.";
|
||||||
|
"GrayStyleButtonToolTipTitle" = "This is a gray-style system button.";
|
||||||
|
"TintedStyleButtonToolTipTitle" = "This is a tinted-style system button.";
|
||||||
|
"FilledStyleButtonToolTipTitle" = "This is a filled-style system button.";
|
||||||
|
"CapsuleStyleButtonToolTipTitle" = "This is a capsule-style system button.";
|
||||||
|
"CartFilledButtonToolTipTitle" = "Button cart is filled";
|
||||||
|
"CartEmptyButtonToolTipTitle" = "Button cart is empty";
|
||||||
|
"XButtonToolTipTitle" = "X Button";
|
||||||
|
"PersonButtonToolTipTitle" = "Person Button";
|
||||||
|
"VisualEffectToolTipTitle" = "This demonstrates how to use a UIVisualEffectView on top of an UIImageView and underneath a UITextView.";
|
||||||
|
|
||||||
|
"VisualEffectTextContent" = "This is a UITextView with text content placed inside a UIVisualEffectView. This is a UITextView with text content placed inside a UIVisualEffectView. This is a UITextView with text content placed inside a UIVisualEffectView.";
|
||||||
|
|
||||||
|
"DefaultTitle" = "Default";
|
||||||
|
"DetailDisclosureTitle" = "Detail Disclosure";
|
||||||
|
"AddContactTitle" = "Add Contact";
|
||||||
|
"CloseTitle" = "Close";
|
||||||
|
"GrayTitle" = "Gray";
|
||||||
|
"TintedTitle" = "Tinted";
|
||||||
|
"FilledTitle" = "Filled";
|
||||||
|
"CornerStyleTitle" = "Corner Style";
|
||||||
|
"ToggleTitle" = "Toggle";
|
||||||
|
"ButtonColorTitle" = "Colored Title";
|
||||||
|
|
||||||
|
"ImageTitle" = "Image";
|
||||||
|
"AttributedStringTitle" = "Attributed String";
|
||||||
|
"SymbolTitle" = "Symbol";
|
||||||
|
|
||||||
|
"LargeSymbolTitle" = "Large Symbol";
|
||||||
|
"SymbolStringTitle" = "Symbol + String";
|
||||||
|
"StringSymbolTitle" = "String + Symbol";
|
||||||
|
"MultiTitleTitle" = "Multi-Title";
|
||||||
|
"BackgroundTitle" = "Background";
|
||||||
|
|
||||||
|
"UpdateActivityHandlerTitle" = "Update Activity Handler";
|
||||||
|
"UpdateHandlerTitle" = "Update Handler";
|
||||||
|
"UpdateImageHandlerTitle" = "Update Handler (Button Image)";
|
||||||
|
|
||||||
|
"AddToCartTitle" = "Add to Cart";
|
||||||
|
|
||||||
|
"DropDownTitle" = "Drop Down";
|
||||||
|
"DropDownProgTitle" = "Drop Down Programmatic";
|
||||||
|
"DropDownMultiActionTitle" = "Drop Down Multi-Action";
|
||||||
|
"DropDownButtonSubMenuTitle" = "Drop Down Submenu";
|
||||||
|
"PopupSelection" = "Popup Selection";
|
||||||
|
"PopupMenuTitle" = "Popup Menu";
|
||||||
|
|
||||||
|
"CustomSegmentsTitle" = "Custom Segments";
|
||||||
|
"CustomBackgroundTitle" = "Custom Background";
|
||||||
|
"ActionBasedTitle" = "Action Based";
|
||||||
|
|
||||||
|
"CustomTitle" = "Custom";
|
||||||
|
"MinMaxImagesTitle" = "Min and Max Images";
|
||||||
|
|
||||||
|
"DefaultStepperTitle" = "Default Stepper";
|
||||||
|
"TintedStepperTitle" = "Tinted Stepper";
|
||||||
|
"CustomStepperTitle" = "Custom Stepper";
|
||||||
|
|
||||||
|
"PlainSymbolTitle" = "Default";
|
||||||
|
"TintedSymbolTitle" = "Tinted";
|
||||||
|
"LargeSymbolTitle" = "Large";
|
||||||
|
"HierarchicalSymbolTitle" = "Hierarchical Color";
|
||||||
|
"PaletteSymbolTitle" = "Palette Color";
|
||||||
|
"PreferringMultiColorSymbolTitle" = "Preferring Multi-Color";
|
||||||
|
|
||||||
|
"DefaultTextFieldTitle" = "Default";
|
||||||
|
"TintedTextFieldTitle" = "Tinted";
|
||||||
|
"SecuretTextFieldTitle" = "Secure";
|
||||||
|
"SpecificKeyboardTextFieldTitle" = "Specific Keyboard";
|
||||||
|
"CustomTextFieldTitle" = "Custom";
|
||||||
|
"SearchTextFieldTitle" = "Search";
|
||||||
|
|
||||||
|
"MediumIndicatorTitle" = "Medium";
|
||||||
|
"LargeIndicatorTitle" = "Large";
|
||||||
|
"MediumTintedIndicatorTitle" = "Medium Tinted";
|
||||||
|
"LargeTintedIndicatorTitle" = "Large Tinted";
|
||||||
|
|
||||||
|
"ProgressDefaultTitle" = "Default";
|
||||||
|
"ProgressBarTitle" = "Bar";
|
||||||
|
"ProgressTintedTitle" = "Tinted";
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17132" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Q5k-7y-PTc">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Q5k-7y-PTc">
|
||||||
<device id="retina6_1" orientation="portrait" appearance="light"/>
|
<device id="retina6_1" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17105"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17703"/>
|
||||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||||
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
|
@ -33,7 +33,7 @@
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="UIKitCatalog" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="m5D-3A-LEm">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="UIKitCatalog" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="m5D-3A-LEm">
|
||||||
<rect key="frame" x="135.5" y="459" width="143" height="32"/>
|
<rect key="frame" x="136" y="459" width="142" height="32"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="26"/>
|
<fontDescription key="fontDescription" type="system" pointSize="26"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
|
|
@ -86,7 +86,7 @@
|
||||||
<!--Split View Controller-->
|
<!--Split View Controller-->
|
||||||
<scene sceneID="Gcq-1L-4zA">
|
<scene sceneID="Gcq-1L-4zA">
|
||||||
<objects>
|
<objects>
|
||||||
<splitViewController storyboardIdentifier="SplitViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="Q5k-7y-PTc" sceneMemberID="viewController">
|
<splitViewController storyboardIdentifier="SplitViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" allowDoubleColumnStyle="YES" id="Q5k-7y-PTc" sceneMemberID="viewController">
|
||||||
<connections>
|
<connections>
|
||||||
<segue destination="EaT-6K-bcl" kind="relationship" relationship="masterViewController" id="oIB-IV-bsO"/>
|
<segue destination="EaT-6K-bcl" kind="relationship" relationship="masterViewController" id="oIB-IV-bsO"/>
|
||||||
<segue destination="TZt-fA-39O" kind="relationship" relationship="detailViewController" id="mju-NL-Hfj"/>
|
<segue destination="TZt-fA-39O" kind="relationship" relationship="detailViewController" id="mju-NL-Hfj"/>
|
||||||
|
|
|
||||||
112
UIKitCatalog/Base.lproj/MenuButtonViewController.storyboard
Executable file
|
|
@ -0,0 +1,112 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19115.3" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="gl0-hM-EWg">
|
||||||
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19107.5"/>
|
||||||
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<scenes>
|
||||||
|
<!--Menu Buttons-->
|
||||||
|
<scene sceneID="q2O-rM-1tM">
|
||||||
|
<objects>
|
||||||
|
<tableViewController id="gl0-hM-EWg" customClass="MenuButtonViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
|
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="none" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="gDs-OX-aHt">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
|
<prototypes>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonMenuProgrammatic" id="tN7-4A-EJH">
|
||||||
|
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="tN7-4A-EJH" id="yGc-Mk-Twi">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="QZo-rY-vLM">
|
||||||
|
<rect key="frame" x="149" y="7" width="77" height="30"/>
|
||||||
|
<state key="normal" title="Drop Down"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="QZo-rY-vLM" secondAttribute="centerY" id="MId-Gu-fRO"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="QZo-rY-vLM" secondAttribute="centerX" id="QM1-sK-LxP"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonMenuMultiAction" id="Cw4-YD-BX7">
|
||||||
|
<rect key="frame" x="0.0" y="99.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Cw4-YD-BX7" id="3at-s1-SCP">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Wka-9Z-mxt">
|
||||||
|
<rect key="frame" x="149" y="7" width="77" height="30"/>
|
||||||
|
<state key="normal" title="Drop Down"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="Wka-9Z-mxt" secondAttribute="centerY" id="0kE-RS-bqR"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="Wka-9Z-mxt" secondAttribute="centerX" id="uvJ-vH-8Sb"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonSubMenu" id="CVF-id-q0u" userLabel="buttonSubMenu">
|
||||||
|
<rect key="frame" x="0.0" y="143.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="CVF-id-q0u" id="NLf-69-z9K">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="aE4-WC-Vzw">
|
||||||
|
<rect key="frame" x="114.5" y="7" width="146" height="30"/>
|
||||||
|
<state key="normal" title="Drop Down Submenu"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="aE4-WC-Vzw" secondAttribute="centerY" id="ZRN-Hh-arg"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="aE4-WC-Vzw" secondAttribute="centerX" id="kV7-PG-ktm"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonMenuSelection" id="YJK-57-pcc" userLabel="buttonMenuSelection">
|
||||||
|
<rect key="frame" x="0.0" y="187.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="YJK-57-pcc" id="K6l-99-WRN">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FVf-eR-tCD">
|
||||||
|
<rect key="frame" x="149" y="7" width="77" height="30"/>
|
||||||
|
<state key="normal" title="Drop Down"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="FVf-eR-tCD" secondAttribute="centerY" id="9tB-zR-p5q"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="FVf-eR-tCD" secondAttribute="centerX" id="eaW-aJ-i3A"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
</prototypes>
|
||||||
|
<sections/>
|
||||||
|
<connections>
|
||||||
|
<outlet property="dataSource" destination="gl0-hM-EWg" id="CGJ-ZK-3Nr"/>
|
||||||
|
<outlet property="delegate" destination="gl0-hM-EWg" id="fqM-wz-bSp"/>
|
||||||
|
</connections>
|
||||||
|
</tableView>
|
||||||
|
<navigationItem key="navigationItem" title="Menu Buttons" id="NGY-Dv-sY9"/>
|
||||||
|
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
||||||
|
</tableViewController>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="w5U-DZ-TWT" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
|
</objects>
|
||||||
|
<point key="canvasLocation" x="-2594.4000000000001" y="3367.4662668665669"/>
|
||||||
|
</scene>
|
||||||
|
</scenes>
|
||||||
|
<resources>
|
||||||
|
<systemColor name="systemBackgroundColor">
|
||||||
|
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</systemColor>
|
||||||
|
</resources>
|
||||||
|
</document>
|
||||||
165
UIKitCatalog/Base.lproj/PointerInteractionButtonViewController.storyboard
Executable file
|
|
@ -0,0 +1,165 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19115.3" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="gl0-hM-EWg">
|
||||||
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19107.5"/>
|
||||||
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
|
<capability name="UIMenu" message="Requires Xcode 11 or later." minToolsVersion="11.0" requiredIntegratedClassName="UICommandDiff"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<scenes>
|
||||||
|
<!--Pointer Interaction Buttons-->
|
||||||
|
<scene sceneID="q2O-rM-1tM">
|
||||||
|
<objects>
|
||||||
|
<tableViewController id="gl0-hM-EWg" customClass="PointerInteractionButtonViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
|
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="none" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="gDs-OX-aHt">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
|
<prototypes>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonCustom" id="KOM-J3-5Ux">
|
||||||
|
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KOM-J3-5Ux" id="u18-q2-hnF">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" tag="5" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="IId-SH-Rqm">
|
||||||
|
<rect key="frame" x="123.5" y="7" width="128" height="30"/>
|
||||||
|
<color key="backgroundColor" systemColor="systemYellowColor"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="128" id="J1K-wu-P8L"/>
|
||||||
|
</constraints>
|
||||||
|
<state key="normal" title="Custom"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="IId-SH-Rqm" secondAttribute="centerY" id="IK3-dx-vXu"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="IId-SH-Rqm" secondAttribute="centerX" id="f7i-So-Kyq"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonHighlight" id="ORa-iG-qeh">
|
||||||
|
<rect key="frame" x="0.0" y="99.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ORa-iG-qeh" id="avE-6x-iRU">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" tag="2" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="8fo-ul-JWM">
|
||||||
|
<rect key="frame" x="123.5" y="7" width="128" height="30"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="128" id="n3U-8w-Zoz"/>
|
||||||
|
</constraints>
|
||||||
|
<state key="normal" title="Highlight"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="8fo-ul-JWM" secondAttribute="centerY" id="WTf-Fw-uNH"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="8fo-ul-JWM" secondAttribute="centerX" id="iGp-Rn-AUA"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonPointer" id="c6X-TL-Sjt">
|
||||||
|
<rect key="frame" x="0.0" y="143.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="c6X-TL-Sjt" id="IY7-D9-hze">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" tag="1" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="TIQ-pG-2ex">
|
||||||
|
<rect key="frame" x="123.5" y="7" width="128" height="30"/>
|
||||||
|
<color key="backgroundColor" systemColor="systemGray5Color"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="128" id="w4A-Zd-v8j"/>
|
||||||
|
</constraints>
|
||||||
|
<menu key="menu" title="Sub Menu" id="AF4-PH-xKY">
|
||||||
|
<children>
|
||||||
|
<command title="Item 1" id="YCh-i1-IYN"/>
|
||||||
|
<command title="Item 2" id="B4C-4W-Nwi"/>
|
||||||
|
</children>
|
||||||
|
</menu>
|
||||||
|
<state key="normal" title="Automatic"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="TIQ-pG-2ex" secondAttribute="centerY" id="Dp9-cf-jqY"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="TIQ-pG-2ex" secondAttribute="centerX" id="zIL-SV-vhT"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonHover" id="9QG-Ha-ThK">
|
||||||
|
<rect key="frame" x="0.0" y="187.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="9QG-Ha-ThK" id="PDE-Dl-GIA">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" tag="4" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="HcB-Pc-F7S">
|
||||||
|
<rect key="frame" x="123.5" y="7" width="128" height="30"/>
|
||||||
|
<color key="backgroundColor" systemColor="systemGray5Color"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="128" id="8RS-Xt-TgA"/>
|
||||||
|
</constraints>
|
||||||
|
<state key="normal" title="Hover"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="HcB-Pc-F7S" secondAttribute="centerX" id="FlI-zr-0md"/>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="HcB-Pc-F7S" secondAttribute="centerY" id="wh7-pC-kEM"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="buttonLift" id="tWT-F9-hmA">
|
||||||
|
<rect key="frame" x="0.0" y="231.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="tWT-F9-hmA" id="7RG-VE-xq6">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<button opaque="NO" tag="3" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3iy-NN-Rbl">
|
||||||
|
<rect key="frame" x="123.5" y="7" width="128" height="30"/>
|
||||||
|
<color key="backgroundColor" systemColor="systemTealColor"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="128" id="LaE-N4-VI9"/>
|
||||||
|
</constraints>
|
||||||
|
<state key="normal" title="Lift"/>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="3iy-NN-Rbl" secondAttribute="centerX" id="7Np-zC-KJ9"/>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="3iy-NN-Rbl" secondAttribute="centerY" id="NJ5-fD-Uqb"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
</prototypes>
|
||||||
|
<sections/>
|
||||||
|
<connections>
|
||||||
|
<outlet property="dataSource" destination="gl0-hM-EWg" id="CGJ-ZK-3Nr"/>
|
||||||
|
<outlet property="delegate" destination="gl0-hM-EWg" id="fqM-wz-bSp"/>
|
||||||
|
</connections>
|
||||||
|
</tableView>
|
||||||
|
<navigationItem key="navigationItem" title="Pointer Interaction Buttons" id="NGY-Dv-sY9"/>
|
||||||
|
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
||||||
|
</tableViewController>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="w5U-DZ-TWT" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
|
</objects>
|
||||||
|
<point key="canvasLocation" x="-2594.4000000000001" y="3367.4662668665669"/>
|
||||||
|
</scene>
|
||||||
|
</scenes>
|
||||||
|
<resources>
|
||||||
|
<systemColor name="systemBackgroundColor">
|
||||||
|
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</systemColor>
|
||||||
|
<systemColor name="systemGray5Color">
|
||||||
|
<color red="0.89803921568627454" green="0.89803921568627454" blue="0.91764705882352937" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
</systemColor>
|
||||||
|
<systemColor name="systemTealColor">
|
||||||
|
<color red="0.18823529411764706" green="0.69019607843137254" blue="0.7803921568627451" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
</systemColor>
|
||||||
|
<systemColor name="systemYellowColor">
|
||||||
|
<color red="1" green="0.80000000000000004" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
</systemColor>
|
||||||
|
</resources>
|
||||||
|
</document>
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14800.2" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="aY0-FD-8DD">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19142.2" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="aY0-FD-8DD">
|
||||||
<device id="retina4_7" orientation="portrait"/>
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14758.1"/>
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19142.2"/>
|
||||||
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
|
|
@ -10,83 +12,70 @@
|
||||||
<scene sceneID="lvJ-t8-0eN">
|
<scene sceneID="lvJ-t8-0eN">
|
||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="aY0-FD-8DD" customClass="ProgressViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
<tableViewController id="aY0-FD-8DD" customClass="ProgressViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="vxe-YC-yBi">
|
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="none" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="vxe-YC-yBi">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
<sections>
|
<prototypes>
|
||||||
<tableViewSection headerTitle="Default" id="eUe-E8-yfw">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="defaultProgress" id="gZ9-C2-XdN">
|
||||||
<cells>
|
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="kmi-xt-LTG">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="gZ9-C2-XdN" id="fhg-U3-KZB">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="kmi-xt-LTG" id="FJn-D1-Mek">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<subviews>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<progressView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="750" progress="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="eIy-Ue-ZBA">
|
||||||
<subviews>
|
<rect key="frame" x="20" y="20" width="335" height="4"/>
|
||||||
<progressView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="750" progress="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="ei4-Kf-1yF">
|
</progressView>
|
||||||
<rect key="frame" x="20" y="21" width="335" height="2"/>
|
</subviews>
|
||||||
</progressView>
|
<constraints>
|
||||||
</subviews>
|
<constraint firstItem="eIy-Ue-ZBA" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="fhg-U3-KZB" secondAttribute="leading" constant="20" id="Ith-L4-qfp"/>
|
||||||
<constraints>
|
<constraint firstAttribute="centerY" secondItem="eIy-Ue-ZBA" secondAttribute="centerY" id="bLG-zR-ePh"/>
|
||||||
<constraint firstAttribute="centerY" secondItem="ei4-Kf-1yF" secondAttribute="centerY" id="19T-l6-w2Z"/>
|
<constraint firstAttribute="trailing" secondItem="eIy-Ue-ZBA" secondAttribute="trailing" constant="20" symbolic="YES" id="cL7-M5-TNk"/>
|
||||||
<constraint firstItem="ei4-Kf-1yF" firstAttribute="leading" secondItem="FJn-D1-Mek" secondAttribute="leading" constant="20" symbolic="YES" id="996-hT-SEd"/>
|
<constraint firstItem="eIy-Ue-ZBA" firstAttribute="leading" secondItem="fhg-U3-KZB" secondAttribute="leading" constant="20" symbolic="YES" id="o18-yA-e9B"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="ei4-Kf-1yF" secondAttribute="trailing" constant="20" symbolic="YES" id="X0O-1q-n6K"/>
|
</constraints>
|
||||||
<constraint firstItem="ei4-Kf-1yF" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="FJn-D1-Mek" secondAttribute="leading" constant="20" id="yYu-XW-UDu"/>
|
</tableViewCellContentView>
|
||||||
</constraints>
|
</tableViewCell>
|
||||||
</tableViewCellContentView>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="tintedProgress" id="WZI-Lb-kJo">
|
||||||
</tableViewCell>
|
<rect key="frame" x="0.0" y="99.5" width="375" height="44"/>
|
||||||
</cells>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</tableViewSection>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="WZI-Lb-kJo" id="JBn-at-HLV">
|
||||||
<tableViewSection headerTitle="Bar" id="bKC-KS-IHM">
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<cells>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="8gd-go-6HH">
|
<subviews>
|
||||||
<rect key="frame" x="0.0" y="147.5" width="375" height="44"/>
|
<progressView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="750" progress="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="UFT-Mw-MF0">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="20" y="20" width="335" height="4"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="8gd-go-6HH" id="s1D-qX-CZU">
|
</progressView>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
</subviews>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<constraints>
|
||||||
<subviews>
|
<constraint firstAttribute="centerY" secondItem="UFT-Mw-MF0" secondAttribute="centerY" id="84a-pU-Eji"/>
|
||||||
<progressView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="750" progressViewStyle="bar" progress="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="zOW-ND-gMa">
|
<constraint firstItem="UFT-Mw-MF0" firstAttribute="leading" secondItem="JBn-at-HLV" secondAttribute="leading" constant="20" symbolic="YES" id="b9I-EP-hey"/>
|
||||||
<rect key="frame" x="20" y="21.5" width="340" height="2.5"/>
|
<constraint firstAttribute="trailing" secondItem="UFT-Mw-MF0" secondAttribute="trailing" constant="20" symbolic="YES" id="tsd-kx-Egt"/>
|
||||||
</progressView>
|
<constraint firstItem="UFT-Mw-MF0" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="JBn-at-HLV" secondAttribute="leading" constant="20" id="tt1-l0-uol"/>
|
||||||
</subviews>
|
</constraints>
|
||||||
<constraints>
|
</tableViewCellContentView>
|
||||||
<constraint firstAttribute="centerX" secondItem="zOW-ND-gMa" secondAttribute="centerX" constant="-2.5" id="0Kg-bD-Z29"/>
|
</tableViewCell>
|
||||||
<constraint firstAttribute="centerY" secondItem="zOW-ND-gMa" secondAttribute="centerY" id="0eX-Wt-3bc"/>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="barProgress" id="TXY-8P-Jnj">
|
||||||
<constraint firstItem="zOW-ND-gMa" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="s1D-qX-CZU" secondAttribute="leading" constant="20" id="ABx-O0-dxH"/>
|
<rect key="frame" x="0.0" y="143.5" width="375" height="44"/>
|
||||||
<constraint firstItem="zOW-ND-gMa" firstAttribute="leading" secondItem="s1D-qX-CZU" secondAttribute="leading" constant="20" id="KQ9-r2-iz2"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="zOW-ND-gMa" secondAttribute="trailing" constant="15" id="an4-J8-8Nv"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="TXY-8P-Jnj" id="9B5-NG-dki">
|
||||||
</constraints>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
</tableViewCellContentView>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</tableViewCell>
|
<subviews>
|
||||||
</cells>
|
<progressView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="750" progress="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="Aka-xI-d0T">
|
||||||
</tableViewSection>
|
<rect key="frame" x="20" y="20" width="335" height="4"/>
|
||||||
<tableViewSection headerTitle="Tinted" id="xT2-F1-qKq">
|
</progressView>
|
||||||
<cells>
|
</subviews>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="e4s-Qv-cWn">
|
<constraints>
|
||||||
<rect key="frame" x="0.0" y="239.5" width="375" height="44"/>
|
<constraint firstAttribute="trailing" secondItem="Aka-xI-d0T" secondAttribute="trailing" constant="20" symbolic="YES" id="Avw-uQ-Z4Z"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<constraint firstAttribute="centerY" secondItem="Aka-xI-d0T" secondAttribute="centerY" id="ETS-ik-ury"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="e4s-Qv-cWn" id="U7H-qE-1Eb">
|
<constraint firstItem="Aka-xI-d0T" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="9B5-NG-dki" secondAttribute="leading" constant="20" id="Zgu-pu-dJo"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<constraint firstItem="Aka-xI-d0T" firstAttribute="leading" secondItem="9B5-NG-dki" secondAttribute="leading" constant="20" symbolic="YES" id="hBM-gp-9o5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</constraints>
|
||||||
<subviews>
|
</tableViewCellContentView>
|
||||||
<progressView opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="750" progress="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="hce-gL-kyl">
|
</tableViewCell>
|
||||||
<rect key="frame" x="20" y="21" width="340" height="2"/>
|
</prototypes>
|
||||||
</progressView>
|
<sections/>
|
||||||
</subviews>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="centerY" secondItem="hce-gL-kyl" secondAttribute="centerY" id="28r-KD-u2o"/>
|
|
||||||
<constraint firstAttribute="centerX" secondItem="hce-gL-kyl" secondAttribute="centerX" constant="-2.5" id="2Gr-hq-nSj"/>
|
|
||||||
<constraint firstItem="hce-gL-kyl" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="U7H-qE-1Eb" secondAttribute="leading" constant="20" id="J3i-VD-vWd"/>
|
|
||||||
<constraint firstItem="hce-gL-kyl" firstAttribute="leading" secondItem="U7H-qE-1Eb" secondAttribute="leading" constant="20" id="csz-HT-u0D"/>
|
|
||||||
<constraint firstAttribute="trailing" secondItem="hce-gL-kyl" secondAttribute="trailing" constant="15" id="lA4-cN-FV2"/>
|
|
||||||
</constraints>
|
|
||||||
</tableViewCellContentView>
|
|
||||||
</tableViewCell>
|
|
||||||
</cells>
|
|
||||||
</tableViewSection>
|
|
||||||
</sections>
|
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="dataSource" destination="aY0-FD-8DD" id="fzw-Hl-Whn"/>
|
<outlet property="dataSource" destination="aY0-FD-8DD" id="fzw-Hl-Whn"/>
|
||||||
<outlet property="delegate" destination="aY0-FD-8DD" id="1bx-jV-2bJ"/>
|
<outlet property="delegate" destination="aY0-FD-8DD" id="1bx-jV-2bJ"/>
|
||||||
|
|
@ -94,18 +83,15 @@
|
||||||
</tableView>
|
</tableView>
|
||||||
<navigationItem key="navigationItem" title="Progress Views" id="msy-b9-rro"/>
|
<navigationItem key="navigationItem" title="Progress Views" id="msy-b9-rro"/>
|
||||||
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
||||||
<connections>
|
|
||||||
<outlet property="barStyleProgressView" destination="zOW-ND-gMa" id="oBr-1m-HjU"/>
|
|
||||||
<outlet property="defaultStyleProgressView" destination="ei4-Kf-1yF" id="7lo-ee-pgZ"/>
|
|
||||||
<outlet property="tintedProgressView" destination="hce-gL-kyl" id="6l7-NC-hb8"/>
|
|
||||||
<outletCollection property="progressViews" destination="ei4-Kf-1yF" collectionClass="NSMutableArray" id="vi4-76-kJ6"/>
|
|
||||||
<outletCollection property="progressViews" destination="hce-gL-kyl" collectionClass="NSMutableArray" id="kR6-BL-IOR"/>
|
|
||||||
<outletCollection property="progressViews" destination="zOW-ND-gMa" collectionClass="NSMutableArray" id="gh3-jC-y2q"/>
|
|
||||||
</connections>
|
|
||||||
</tableViewController>
|
</tableViewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="Xdv-yA-Pae" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="Xdv-yA-Pae" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="2227" y="3368"/>
|
<point key="canvasLocation" x="2227" y="3368"/>
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
|
<resources>
|
||||||
|
<systemColor name="systemBackgroundColor">
|
||||||
|
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</systemColor>
|
||||||
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17132" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Eil-ie-nN6">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19142.2" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Eil-ie-nN6">
|
||||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17105"/>
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19129"/>
|
||||||
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
|
|
@ -10,157 +12,134 @@
|
||||||
<scene sceneID="0RQ-gw-hMl">
|
<scene sceneID="0RQ-gw-hMl">
|
||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="Eil-ie-nN6" customClass="SegmentedControlViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
<tableViewController id="Eil-ie-nN6" customClass="SegmentedControlViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="fLQ-5f-tUh">
|
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="none" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="fLQ-5f-tUh">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
<sections>
|
<prototypes>
|
||||||
<tableViewSection headerTitle="Default" id="HCa-pZ-1xG">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="segmentDefault" rowHeight="44" id="ua8-m3-vHa">
|
||||||
<cells>
|
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" rowHeight="90" id="8Eu-YT-DXB">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="55.5" width="375" height="90"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ua8-m3-vHa" id="8hH-e2-azy">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="8Eu-YT-DXB" id="M3h-lr-LNM">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="90"/>
|
<subviews>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" translatesAutoresizingMaskIntoConstraints="NO" id="ZfH-o2-nhO">
|
||||||
<subviews>
|
<rect key="frame" x="47.5" y="6.5" width="280" height="32"/>
|
||||||
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" translatesAutoresizingMaskIntoConstraints="NO" id="D6r-9d-m6L">
|
|
||||||
<rect key="frame" x="47.5" y="29.5" width="280" height="32"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="280" id="CNa-r6-Q9z"/>
|
|
||||||
</constraints>
|
|
||||||
<segments>
|
|
||||||
<segment title="Check"/>
|
|
||||||
<segment title="Search"/>
|
|
||||||
<segment title="Tools"/>
|
|
||||||
</segments>
|
|
||||||
</segmentedControl>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="centerY" secondItem="D6r-9d-m6L" secondAttribute="centerY" id="F5L-Sh-NBp"/>
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="280" id="6eM-gf-9p1"/>
|
||||||
<constraint firstAttribute="centerX" secondItem="D6r-9d-m6L" secondAttribute="centerX" id="jd1-hl-wfu"/>
|
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
<segments>
|
||||||
</tableViewCell>
|
<segment title="Check"/>
|
||||||
</cells>
|
<segment title="Search"/>
|
||||||
</tableViewSection>
|
<segment title="Tools"/>
|
||||||
<tableViewSection headerTitle="Tinted" id="ylt-Fk-XEE">
|
</segments>
|
||||||
<cells>
|
</segmentedControl>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" rowHeight="90" id="3qp-zK-6mx">
|
</subviews>
|
||||||
<rect key="frame" x="0.0" y="193.5" width="375" height="90"/>
|
<constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<constraint firstAttribute="centerX" secondItem="ZfH-o2-nhO" secondAttribute="centerX" id="K8k-EN-ood"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="3qp-zK-6mx" id="us5-tQ-6Iq">
|
<constraint firstAttribute="centerY" secondItem="ZfH-o2-nhO" secondAttribute="centerY" id="QNh-1O-Ngx"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="90"/>
|
</constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</tableViewCellContentView>
|
||||||
<subviews>
|
</tableViewCell>
|
||||||
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" translatesAutoresizingMaskIntoConstraints="NO" id="A3j-iT-hVF">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="segmentTinted" rowHeight="44" id="L13-wH-2Nw">
|
||||||
<rect key="frame" x="47.5" y="29.5" width="280" height="32"/>
|
<rect key="frame" x="0.0" y="99.5" width="375" height="44"/>
|
||||||
<constraints>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="280" id="dyr-wx-mz3"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="L13-wH-2Nw" id="y5b-ZB-fSO">
|
||||||
</constraints>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<segments>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<segment title="Check"/>
|
<subviews>
|
||||||
<segment title="Search"/>
|
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" translatesAutoresizingMaskIntoConstraints="NO" id="xZu-NZ-cjd">
|
||||||
<segment title="Tools"/>
|
<rect key="frame" x="47.5" y="6.5" width="280" height="32"/>
|
||||||
</segments>
|
|
||||||
</segmentedControl>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="centerX" secondItem="A3j-iT-hVF" secondAttribute="centerX" id="cFX-g4-9b4"/>
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="280" id="n63-l5-FqI"/>
|
||||||
<constraint firstAttribute="centerY" secondItem="A3j-iT-hVF" secondAttribute="centerY" id="cQt-wG-S25"/>
|
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
<segments>
|
||||||
</tableViewCell>
|
<segment title="Check"/>
|
||||||
</cells>
|
<segment title="Search"/>
|
||||||
</tableViewSection>
|
<segment title="Tools"/>
|
||||||
<tableViewSection headerTitle="Custom Segments" id="LBr-nb-ZpU">
|
</segments>
|
||||||
<cells>
|
</segmentedControl>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" rowHeight="90" id="p73-fd-Xoq">
|
</subviews>
|
||||||
<rect key="frame" x="0.0" y="331.5" width="375" height="90"/>
|
<constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<constraint firstAttribute="centerX" secondItem="xZu-NZ-cjd" secondAttribute="centerX" id="qE9-z2-g59"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="p73-fd-Xoq" id="u8q-LS-Y7d">
|
<constraint firstAttribute="centerY" secondItem="xZu-NZ-cjd" secondAttribute="centerY" id="wnA-gu-UaY"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="90"/>
|
</constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</tableViewCellContentView>
|
||||||
<subviews>
|
</tableViewCell>
|
||||||
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" translatesAutoresizingMaskIntoConstraints="NO" id="dj6-Ch-8fj">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="segmentCustom" rowHeight="44" id="DRT-w6-Ine">
|
||||||
<rect key="frame" x="47.5" y="29.5" width="280" height="32"/>
|
<rect key="frame" x="0.0" y="143.5" width="375" height="44"/>
|
||||||
<constraints>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="280" id="8Kf-xD-h9j"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="DRT-w6-Ine" id="3h8-3a-85w">
|
||||||
</constraints>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<segments>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<segment title="Check"/>
|
<subviews>
|
||||||
<segment title="Search"/>
|
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" translatesAutoresizingMaskIntoConstraints="NO" id="mjY-Og-9lN">
|
||||||
<segment title="Tools"/>
|
<rect key="frame" x="47.5" y="6.5" width="280" height="32"/>
|
||||||
</segments>
|
|
||||||
</segmentedControl>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="centerY" secondItem="dj6-Ch-8fj" secondAttribute="centerY" id="bwP-Bm-Qqs"/>
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="280" id="9Dn-He-XOc"/>
|
||||||
<constraint firstAttribute="centerX" secondItem="dj6-Ch-8fj" secondAttribute="centerX" id="mrF-qX-KeJ"/>
|
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
<segments>
|
||||||
</tableViewCell>
|
<segment title="Check"/>
|
||||||
</cells>
|
<segment title="Search"/>
|
||||||
</tableViewSection>
|
<segment title="Tools"/>
|
||||||
<tableViewSection headerTitle="Custom Background" id="Flv-0Z-gFn">
|
</segments>
|
||||||
<cells>
|
</segmentedControl>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" rowHeight="90" id="hTb-Lv-lzA">
|
</subviews>
|
||||||
<rect key="frame" x="0.0" y="469.5" width="375" height="90"/>
|
<constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<constraint firstAttribute="centerX" secondItem="mjY-Og-9lN" secondAttribute="centerX" id="0dd-W2-Ji0"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="hTb-Lv-lzA" id="HNU-4g-he5">
|
<constraint firstAttribute="centerY" secondItem="mjY-Og-9lN" secondAttribute="centerY" id="plu-4X-0jG"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="90"/>
|
</constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</tableViewCellContentView>
|
||||||
<subviews>
|
</tableViewCell>
|
||||||
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" translatesAutoresizingMaskIntoConstraints="NO" id="hvO-gV-AgD">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="segmentCustomBackground" rowHeight="44" id="YdW-SD-1fw">
|
||||||
<rect key="frame" x="47.5" y="29.5" width="280" height="32"/>
|
<rect key="frame" x="0.0" y="187.5" width="375" height="44"/>
|
||||||
<constraints>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="280" id="UfD-W5-wci"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="YdW-SD-1fw" id="519-i4-oo7">
|
||||||
</constraints>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<segments>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<segment title="Check"/>
|
<subviews>
|
||||||
<segment title="Search"/>
|
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="I0A-3T-9iW">
|
||||||
<segment title="Tools"/>
|
<rect key="frame" x="47.5" y="6" width="280" height="32"/>
|
||||||
</segments>
|
|
||||||
</segmentedControl>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="centerX" secondItem="hvO-gV-AgD" secondAttribute="centerX" id="II8-1E-IK9"/>
|
<constraint firstAttribute="width" constant="280" id="PKS-2f-rd2"/>
|
||||||
<constraint firstAttribute="centerY" secondItem="hvO-gV-AgD" secondAttribute="centerY" id="uYn-sl-Vgy"/>
|
<constraint firstAttribute="height" constant="32" id="al3-Kn-h6a"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
</view>
|
||||||
</tableViewCell>
|
</subviews>
|
||||||
</cells>
|
<constraints>
|
||||||
</tableViewSection>
|
<constraint firstItem="I0A-3T-9iW" firstAttribute="centerY" secondItem="519-i4-oo7" secondAttribute="centerY" id="Mvg-ei-MNT"/>
|
||||||
<tableViewSection headerTitle="Action Based" id="Fzq-2p-q17" userLabel="Action Based">
|
<constraint firstItem="I0A-3T-9iW" firstAttribute="centerX" secondItem="519-i4-oo7" secondAttribute="centerX" id="pSh-c7-iFc"/>
|
||||||
<cells>
|
</constraints>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" rowHeight="90" id="Qhn-Ee-iAM">
|
</tableViewCellContentView>
|
||||||
<rect key="frame" x="0.0" y="607.5" width="375" height="90"/>
|
</tableViewCell>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="segmentAction" rowHeight="44" id="1C5-bq-H2S">
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Qhn-Ee-iAM" id="xrQ-Qv-rX1">
|
<rect key="frame" x="0.0" y="231.5" width="375" height="44"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="90"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="1C5-bq-H2S" id="krO-6p-ntS">
|
||||||
<subviews>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" translatesAutoresizingMaskIntoConstraints="NO" id="eAh-Vg-WL1">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="47.5" y="29.5" width="280" height="32"/>
|
<subviews>
|
||||||
<constraints>
|
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" translatesAutoresizingMaskIntoConstraints="NO" id="z5O-ti-8hN">
|
||||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="280" id="xCf-yM-ojH"/>
|
<rect key="frame" x="47.5" y="6.5" width="280" height="32"/>
|
||||||
</constraints>
|
|
||||||
<segments>
|
|
||||||
<segment title="Check"/>
|
|
||||||
<segment title="Search"/>
|
|
||||||
<segment title="Tools"/>
|
|
||||||
</segments>
|
|
||||||
</segmentedControl>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="centerY" secondItem="eAh-Vg-WL1" secondAttribute="centerY" id="ltZ-wg-zzb"/>
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="280" id="qW9-Oi-u5j"/>
|
||||||
<constraint firstAttribute="centerX" secondItem="eAh-Vg-WL1" secondAttribute="centerX" id="zms-vM-SuU"/>
|
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
<segments>
|
||||||
</tableViewCell>
|
<segment title="Check"/>
|
||||||
</cells>
|
<segment title="Search"/>
|
||||||
</tableViewSection>
|
<segment title="Tools"/>
|
||||||
</sections>
|
</segments>
|
||||||
|
</segmentedControl>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="z5O-ti-8hN" secondAttribute="centerX" id="3mQ-ZK-WaU"/>
|
||||||
|
<constraint firstAttribute="centerY" secondItem="z5O-ti-8hN" secondAttribute="centerY" id="qvD-lM-SNb"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
</prototypes>
|
||||||
|
<sections/>
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="dataSource" destination="Eil-ie-nN6" id="WXj-aR-Xkb"/>
|
<outlet property="dataSource" destination="Eil-ie-nN6" id="WXj-aR-Xkb"/>
|
||||||
<outlet property="delegate" destination="Eil-ie-nN6" id="SfZ-zb-fim"/>
|
<outlet property="delegate" destination="Eil-ie-nN6" id="SfZ-zb-fim"/>
|
||||||
|
|
@ -168,22 +147,15 @@
|
||||||
</tableView>
|
</tableView>
|
||||||
<navigationItem key="navigationItem" title="Segmented Controls" id="LSm-7X-Qet"/>
|
<navigationItem key="navigationItem" title="Segmented Controls" id="LSm-7X-Qet"/>
|
||||||
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
||||||
<connections>
|
|
||||||
<outlet property="actionBasedSegmentedControl" destination="eAh-Vg-WL1" id="3si-ha-nhl"/>
|
|
||||||
<outlet property="customBackgroundSegmentedControl" destination="hvO-gV-AgD" id="1sh-L5-n7s"/>
|
|
||||||
<outlet property="customSegmentsSegmentedControl" destination="dj6-Ch-8fj" id="GcL-9F-uX5"/>
|
|
||||||
<outlet property="defaultSegmentedControl" destination="D6r-9d-m6L" id="cpp-0k-vqT"/>
|
|
||||||
<outlet property="tintedSegmentedControl" destination="A3j-iT-hVF" id="Iky-aQ-Wek"/>
|
|
||||||
</connections>
|
|
||||||
</tableViewController>
|
</tableViewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="cdC-yR-iYh" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="cdC-yR-iYh" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="3278" y="3368"/>
|
<point key="canvasLocation" x="3277.5999999999999" y="3367.4662668665669"/>
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
<resources>
|
<resources>
|
||||||
<systemColor name="groupTableViewBackgroundColor">
|
<systemColor name="systemBackgroundColor">
|
||||||
<color red="0.94901960784313721" green="0.94901960784313721" blue="0.96862745098039216" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
</systemColor>
|
</systemColor>
|
||||||
</resources>
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14810.11" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="laz-6N-ZhE">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19142.2" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="laz-6N-ZhE">
|
||||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14766.13"/>
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19129"/>
|
||||||
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
|
|
@ -10,104 +12,89 @@
|
||||||
<scene sceneID="AcL-XD-MBK">
|
<scene sceneID="AcL-XD-MBK">
|
||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="laz-6N-ZhE" customClass="SliderViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
<tableViewController id="laz-6N-ZhE" customClass="SliderViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="8xG-xW-Mvc">
|
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="none" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="8xG-xW-Mvc">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
<sections>
|
<prototypes>
|
||||||
<tableViewSection headerTitle="Default" id="GM5-I7-cLR">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="sliderDefault" id="4zC-vI-0NC">
|
||||||
<cells>
|
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="3ns-I6-0FN">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="4zC-vI-0NC" id="VfF-ru-LCc">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="3ns-I6-0FN" id="1JS-69-7PP">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<subviews>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="lhN-5T-HKR">
|
||||||
<subviews>
|
<rect key="frame" x="18" y="7.5" width="339" height="31"/>
|
||||||
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="r7t-o7-uUH">
|
</slider>
|
||||||
<rect key="frame" x="18" y="7.5" width="339" height="31"/>
|
</subviews>
|
||||||
</slider>
|
<constraints>
|
||||||
</subviews>
|
<constraint firstAttribute="centerY" secondItem="lhN-5T-HKR" secondAttribute="centerY" constant="-0.5" id="Ez3-DH-Gk6"/>
|
||||||
<constraints>
|
<constraint firstAttribute="centerX" secondItem="lhN-5T-HKR" secondAttribute="centerX" id="I1F-g6-cdT"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="r7t-o7-uUH" secondAttribute="trailing" constant="20" symbolic="YES" id="5xm-6E-4qS"/>
|
<constraint firstItem="lhN-5T-HKR" firstAttribute="leading" secondItem="VfF-ru-LCc" secondAttribute="leading" constant="20" symbolic="YES" id="QnE-iU-5Qj"/>
|
||||||
<constraint firstItem="r7t-o7-uUH" firstAttribute="leading" secondItem="1JS-69-7PP" secondAttribute="leading" constant="20" symbolic="YES" id="NmN-hs-RWT"/>
|
<constraint firstAttribute="trailing" secondItem="lhN-5T-HKR" secondAttribute="trailing" constant="20" symbolic="YES" id="eOh-IC-63m"/>
|
||||||
<constraint firstAttribute="centerY" secondItem="r7t-o7-uUH" secondAttribute="centerY" constant="-0.5" id="R3V-br-G65"/>
|
</constraints>
|
||||||
<constraint firstAttribute="centerX" secondItem="r7t-o7-uUH" secondAttribute="centerX" id="yqs-XK-usC"/>
|
</tableViewCellContentView>
|
||||||
</constraints>
|
</tableViewCell>
|
||||||
</tableViewCellContentView>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="sliderTinted" id="XKm-vp-Z4e">
|
||||||
</tableViewCell>
|
<rect key="frame" x="0.0" y="99.5" width="375" height="44"/>
|
||||||
</cells>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</tableViewSection>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="XKm-vp-Z4e" id="gcy-A0-hCb">
|
||||||
<tableViewSection headerTitle="Tinted" id="qhz-Ob-BuS">
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<cells>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="XBb-zZ-6xb">
|
<subviews>
|
||||||
<rect key="frame" x="0.0" y="147.5" width="375" height="44"/>
|
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="y6j-bZ-afc">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="18" y="7.5" width="339" height="31"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="XBb-zZ-6xb" id="9s3-6s-kVp">
|
</slider>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
</subviews>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<constraints>
|
||||||
<subviews>
|
<constraint firstItem="y6j-bZ-afc" firstAttribute="leading" secondItem="gcy-A0-hCb" secondAttribute="leading" constant="20" symbolic="YES" id="EKx-YK-Wfi"/>
|
||||||
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="CGL-pk-k1S">
|
<constraint firstAttribute="centerX" secondItem="y6j-bZ-afc" secondAttribute="centerX" id="YBj-dW-I4S"/>
|
||||||
<rect key="frame" x="18" y="7.5" width="339" height="31"/>
|
<constraint firstAttribute="trailing" secondItem="y6j-bZ-afc" secondAttribute="trailing" constant="20" symbolic="YES" id="iyB-ii-Udq"/>
|
||||||
</slider>
|
<constraint firstAttribute="centerY" secondItem="y6j-bZ-afc" secondAttribute="centerY" constant="-0.5" id="vGL-LN-ENO"/>
|
||||||
</subviews>
|
</constraints>
|
||||||
<constraints>
|
</tableViewCellContentView>
|
||||||
<constraint firstItem="CGL-pk-k1S" firstAttribute="leading" secondItem="9s3-6s-kVp" secondAttribute="leading" constant="20" symbolic="YES" id="4Sf-rO-Ows"/>
|
</tableViewCell>
|
||||||
<constraint firstAttribute="trailing" secondItem="CGL-pk-k1S" secondAttribute="trailing" constant="20" symbolic="YES" id="Fny-EL-oV9"/>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="sliderCustom" id="p07-nL-MO3">
|
||||||
<constraint firstAttribute="centerY" secondItem="CGL-pk-k1S" secondAttribute="centerY" constant="-0.5" id="GdE-Cc-rqX"/>
|
<rect key="frame" x="0.0" y="143.5" width="375" height="44"/>
|
||||||
<constraint firstAttribute="centerX" secondItem="CGL-pk-k1S" secondAttribute="centerX" id="IDq-gh-x3U"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</constraints>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="p07-nL-MO3" id="aH9-0B-8vB">
|
||||||
</tableViewCellContentView>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
</tableViewCell>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</cells>
|
<subviews>
|
||||||
</tableViewSection>
|
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="SmN-ak-G2E">
|
||||||
<tableViewSection headerTitle="Custom" id="61k-iV-riT">
|
<rect key="frame" x="18" y="7.5" width="339" height="31"/>
|
||||||
<cells>
|
</slider>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="4OB-jL-pxb">
|
</subviews>
|
||||||
<rect key="frame" x="0.0" y="239.5" width="375" height="44"/>
|
<constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<constraint firstItem="SmN-ak-G2E" firstAttribute="leading" secondItem="aH9-0B-8vB" secondAttribute="leading" constant="20" symbolic="YES" id="95t-uw-zP7"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="4OB-jL-pxb" id="2gM-p3-Tof">
|
<constraint firstAttribute="trailing" secondItem="SmN-ak-G2E" secondAttribute="trailing" constant="20" symbolic="YES" id="MoB-jI-3Gh"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<constraint firstAttribute="centerX" secondItem="SmN-ak-G2E" secondAttribute="centerX" id="XHr-Na-NXh"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<constraint firstAttribute="centerY" secondItem="SmN-ak-G2E" secondAttribute="centerY" constant="-0.5" id="hgn-jI-PGt"/>
|
||||||
<subviews>
|
</constraints>
|
||||||
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="fUs-ee-MUt">
|
</tableViewCellContentView>
|
||||||
<rect key="frame" x="18" y="7.5" width="339" height="31"/>
|
</tableViewCell>
|
||||||
</slider>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="sliderMaxMinImage" id="47D-pV-Eeq">
|
||||||
</subviews>
|
<rect key="frame" x="0.0" y="187.5" width="375" height="44"/>
|
||||||
<constraints>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<constraint firstAttribute="centerX" secondItem="fUs-ee-MUt" secondAttribute="centerX" id="8x6-Jh-hRJ"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="47D-pV-Eeq" id="xpQ-Bb-Ent">
|
||||||
<constraint firstAttribute="centerY" secondItem="fUs-ee-MUt" secondAttribute="centerY" constant="-0.5" id="AWY-BZ-4kq"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<constraint firstItem="fUs-ee-MUt" firstAttribute="leading" secondItem="2gM-p3-Tof" secondAttribute="leading" constant="20" symbolic="YES" id="KkC-zZ-qqD"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="fUs-ee-MUt" secondAttribute="trailing" constant="20" symbolic="YES" id="vOg-DS-jcR"/>
|
<subviews>
|
||||||
</constraints>
|
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="MiC-8a-nwg">
|
||||||
</tableViewCellContentView>
|
<rect key="frame" x="18" y="7.5" width="339" height="31"/>
|
||||||
</tableViewCell>
|
</slider>
|
||||||
</cells>
|
</subviews>
|
||||||
</tableViewSection>
|
<constraints>
|
||||||
<tableViewSection headerTitle="Min and Max Images" id="7KF-l2-cgG">
|
<constraint firstAttribute="centerX" secondItem="MiC-8a-nwg" secondAttribute="centerX" id="9Qo-ZL-aKD"/>
|
||||||
<cells>
|
<constraint firstItem="MiC-8a-nwg" firstAttribute="leading" secondItem="xpQ-Bb-Ent" secondAttribute="leading" constant="20" symbolic="YES" id="E6F-Xk-RK4"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="IaF-oq-cUi">
|
<constraint firstAttribute="centerY" secondItem="MiC-8a-nwg" secondAttribute="centerY" constant="-0.5" id="ntR-r4-03e"/>
|
||||||
<rect key="frame" x="0.0" y="331.5" width="375" height="44"/>
|
<constraint firstAttribute="trailing" secondItem="MiC-8a-nwg" secondAttribute="trailing" constant="20" symbolic="YES" id="rOg-5K-S3g"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</constraints>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="IaF-oq-cUi" id="pZM-D2-qX5">
|
</tableViewCellContentView>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
</tableViewCell>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</prototypes>
|
||||||
<subviews>
|
<sections/>
|
||||||
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="IZf-0b-G8r">
|
|
||||||
<rect key="frame" x="18" y="7.5" width="339" height="31"/>
|
|
||||||
</slider>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstItem="IZf-0b-G8r" firstAttribute="leading" secondItem="pZM-D2-qX5" secondAttribute="leading" constant="20" symbolic="YES" id="SI4-TD-KwJ"/>
|
|
||||||
<constraint firstAttribute="trailing" secondItem="IZf-0b-G8r" secondAttribute="trailing" constant="20" symbolic="YES" id="Zwp-BQ-N1k"/>
|
|
||||||
<constraint firstAttribute="centerX" secondItem="IZf-0b-G8r" secondAttribute="centerX" id="k1b-Im-KuU"/>
|
|
||||||
<constraint firstAttribute="centerY" secondItem="IZf-0b-G8r" secondAttribute="centerY" constant="-0.5" id="peG-9p-9Ls"/>
|
|
||||||
</constraints>
|
|
||||||
</tableViewCellContentView>
|
|
||||||
</tableViewCell>
|
|
||||||
</cells>
|
|
||||||
</tableViewSection>
|
|
||||||
</sections>
|
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="dataSource" destination="laz-6N-ZhE" id="J0B-Vs-5pv"/>
|
<outlet property="dataSource" destination="laz-6N-ZhE" id="J0B-Vs-5pv"/>
|
||||||
<outlet property="delegate" destination="laz-6N-ZhE" id="IsZ-mN-lte"/>
|
<outlet property="delegate" destination="laz-6N-ZhE" id="IsZ-mN-lte"/>
|
||||||
|
|
@ -115,16 +102,15 @@
|
||||||
</tableView>
|
</tableView>
|
||||||
<navigationItem key="navigationItem" title="Sliders" id="Lp8-FI-W8w"/>
|
<navigationItem key="navigationItem" title="Sliders" id="Lp8-FI-W8w"/>
|
||||||
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
||||||
<connections>
|
|
||||||
<outlet property="customSlider" destination="fUs-ee-MUt" id="aKh-90-kmA"/>
|
|
||||||
<outlet property="defaultSlider" destination="r7t-o7-uUH" id="BWI-BT-mpD"/>
|
|
||||||
<outlet property="minMaxImageSlider" destination="IZf-0b-G8r" id="he9-y7-sZ0"/>
|
|
||||||
<outlet property="tintedSlider" destination="CGL-pk-k1S" id="3OT-8C-M2N"/>
|
|
||||||
</connections>
|
|
||||||
</tableViewController>
|
</tableViewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="vWL-oj-RdA" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="vWL-oj-RdA" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="4225" y="3368"/>
|
<point key="canvasLocation" x="4225" y="3368"/>
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
|
<resources>
|
||||||
|
<systemColor name="systemBackgroundColor">
|
||||||
|
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</systemColor>
|
||||||
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14800.2" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Ob2-pp-aCj">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19142.2" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Ob2-pp-aCj">
|
||||||
<device id="retina4_7" orientation="portrait"/>
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14758.1"/>
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19142.2"/>
|
||||||
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
|
|
@ -10,102 +12,79 @@
|
||||||
<scene sceneID="xBH-7V-3ks">
|
<scene sceneID="xBH-7V-3ks">
|
||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="Ob2-pp-aCj" customClass="StepperViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
<tableViewController id="Ob2-pp-aCj" customClass="StepperViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="aQ3-9F-Tmi">
|
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="none" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="aQ3-9F-Tmi">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
<sections>
|
<prototypes>
|
||||||
<tableViewSection headerTitle="Default" id="oCN-zS-UpR">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="defaultStepper" id="txD-Kd-WKO">
|
||||||
<cells>
|
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="MFv-3k-2QS">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="txD-Kd-WKO" id="9Ly-79-FgI">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="MFv-3k-2QS" id="muw-kh-U1w">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<subviews>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="10" translatesAutoresizingMaskIntoConstraints="NO" id="Rwt-E0-Les">
|
||||||
<subviews>
|
<rect key="frame" x="140.5" y="6" width="94" height="32"/>
|
||||||
<stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="10" translatesAutoresizingMaskIntoConstraints="NO" id="LyL-x2-2Vc">
|
</stepper>
|
||||||
<rect key="frame" x="140.5" y="8" width="94" height="28"/>
|
</subviews>
|
||||||
</stepper>
|
<constraints>
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="o6t-lj-Q9C">
|
<constraint firstItem="Rwt-E0-Les" firstAttribute="centerX" secondItem="9Ly-79-FgI" secondAttribute="centerX" id="Djd-St-gHh"/>
|
||||||
<rect key="frame" x="258" y="11" width="97" height="20.5"/>
|
<constraint firstItem="Rwt-E0-Les" firstAttribute="centerY" secondItem="9Ly-79-FgI" secondAttribute="centerY" id="dUb-YS-6Nn"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
</constraints>
|
||||||
<nil key="textColor"/>
|
<variation key="heightClass=regular-userInterfaceIdiom=mac-widthClass=compact">
|
||||||
<nil key="highlightedColor"/>
|
<mask key="subviews">
|
||||||
</label>
|
<exclude reference="Rwt-E0-Les"/>
|
||||||
</subviews>
|
</mask>
|
||||||
<constraints>
|
</variation>
|
||||||
<constraint firstAttribute="centerX" secondItem="o6t-lj-Q9C" secondAttribute="centerX" constant="-119" id="QhV-qd-xEq"/>
|
</tableViewCellContentView>
|
||||||
<constraint firstAttribute="centerX" secondItem="LyL-x2-2Vc" secondAttribute="centerX" id="VAc-35-bll"/>
|
</tableViewCell>
|
||||||
<constraint firstAttribute="centerY" secondItem="LyL-x2-2Vc" secondAttribute="centerY" id="ZHH-kz-KM2"/>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="tintedStepper" id="6oV-1N-Grs">
|
||||||
<constraint firstItem="o6t-lj-Q9C" firstAttribute="centerY" secondItem="LyL-x2-2Vc" secondAttribute="centerY" constant="-1" id="lSF-EQ-HKT"/>
|
<rect key="frame" x="0.0" y="99.5" width="375" height="44"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="o6t-lj-Q9C" secondAttribute="trailing" constant="20" id="w6F-cj-8Pt"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</constraints>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="6oV-1N-Grs" id="vMM-mh-15P">
|
||||||
</tableViewCellContentView>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
</tableViewCell>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</cells>
|
<subviews>
|
||||||
</tableViewSection>
|
<stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="10" translatesAutoresizingMaskIntoConstraints="NO" id="m2X-w6-RUU">
|
||||||
<tableViewSection headerTitle="Tinted" id="yPy-xd-oxi">
|
<rect key="frame" x="140.5" y="6" width="94" height="32"/>
|
||||||
<cells>
|
</stepper>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="Zsy-ff-fyO">
|
</subviews>
|
||||||
<rect key="frame" x="0.0" y="147.5" width="375" height="44"/>
|
<constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<constraint firstItem="m2X-w6-RUU" firstAttribute="centerX" secondItem="vMM-mh-15P" secondAttribute="centerX" id="M8s-QM-GS7"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Zsy-ff-fyO" id="BCh-iQ-hHA">
|
<constraint firstItem="m2X-w6-RUU" firstAttribute="centerY" secondItem="vMM-mh-15P" secondAttribute="centerY" id="e8j-CB-x6c"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
</constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<variation key="heightClass=regular-userInterfaceIdiom=mac-widthClass=compact">
|
||||||
<subviews>
|
<mask key="subviews">
|
||||||
<stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="10" translatesAutoresizingMaskIntoConstraints="NO" id="bdI-D2-Wgr">
|
<exclude reference="m2X-w6-RUU"/>
|
||||||
<rect key="frame" x="140.5" y="8" width="94" height="28"/>
|
</mask>
|
||||||
</stepper>
|
</variation>
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Pgb-CR-d8e">
|
</tableViewCellContentView>
|
||||||
<rect key="frame" x="258" y="11" width="97" height="20.5"/>
|
</tableViewCell>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="customStepper" id="6QE-YR-v8B">
|
||||||
<nil key="textColor"/>
|
<rect key="frame" x="0.0" y="143.5" width="375" height="44"/>
|
||||||
<nil key="highlightedColor"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</label>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="6QE-YR-v8B" id="20r-KY-uNw">
|
||||||
</subviews>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<constraints>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<constraint firstAttribute="centerX" secondItem="bdI-D2-Wgr" secondAttribute="centerX" id="DUv-r4-TzY"/>
|
<subviews>
|
||||||
<constraint firstAttribute="centerX" secondItem="Pgb-CR-d8e" secondAttribute="centerX" constant="-119" id="T4v-0F-qDJ"/>
|
<stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="10" translatesAutoresizingMaskIntoConstraints="NO" id="xNt-Bk-wo8">
|
||||||
<constraint firstAttribute="trailing" secondItem="Pgb-CR-d8e" secondAttribute="trailing" constant="20" id="XdG-uJ-9Pj"/>
|
<rect key="frame" x="140.5" y="6" width="94" height="32"/>
|
||||||
<constraint firstItem="Pgb-CR-d8e" firstAttribute="centerY" secondItem="bdI-D2-Wgr" secondAttribute="centerY" constant="-1" id="dYM-Dd-lDV"/>
|
</stepper>
|
||||||
<constraint firstAttribute="centerY" secondItem="bdI-D2-Wgr" secondAttribute="centerY" id="z6P-Oz-SjP"/>
|
</subviews>
|
||||||
</constraints>
|
<constraints>
|
||||||
</tableViewCellContentView>
|
<constraint firstItem="xNt-Bk-wo8" firstAttribute="centerX" secondItem="20r-KY-uNw" secondAttribute="centerX" id="pTg-IT-vAf"/>
|
||||||
</tableViewCell>
|
<constraint firstItem="xNt-Bk-wo8" firstAttribute="centerY" secondItem="20r-KY-uNw" secondAttribute="centerY" id="zBQ-l9-vjB"/>
|
||||||
</cells>
|
</constraints>
|
||||||
</tableViewSection>
|
<variation key="heightClass=regular-userInterfaceIdiom=mac-widthClass=compact">
|
||||||
<tableViewSection headerTitle="Custom" id="v11-6g-9XU">
|
<mask key="subviews">
|
||||||
<cells>
|
<exclude reference="xNt-Bk-wo8"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="G5u-Bn-eCH">
|
</mask>
|
||||||
<rect key="frame" x="0.0" y="239.5" width="375" height="44"/>
|
</variation>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</tableViewCellContentView>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="G5u-Bn-eCH" id="mOU-DX-EXS">
|
</tableViewCell>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
</prototypes>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<sections/>
|
||||||
<subviews>
|
|
||||||
<stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="10" translatesAutoresizingMaskIntoConstraints="NO" id="Adb-NR-4zI">
|
|
||||||
<rect key="frame" x="140.5" y="8" width="94" height="28"/>
|
|
||||||
</stepper>
|
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qU1-em-e89">
|
|
||||||
<rect key="frame" x="258" y="11" width="97" height="20.5"/>
|
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
|
||||||
<nil key="textColor"/>
|
|
||||||
<nil key="highlightedColor"/>
|
|
||||||
</label>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstItem="qU1-em-e89" firstAttribute="centerY" secondItem="Adb-NR-4zI" secondAttribute="centerY" constant="-1" id="27a-pw-Fpq"/>
|
|
||||||
<constraint firstAttribute="centerY" secondItem="Adb-NR-4zI" secondAttribute="centerY" id="9hz-A5-Oeh"/>
|
|
||||||
<constraint firstAttribute="centerX" secondItem="Adb-NR-4zI" secondAttribute="centerX" id="GFy-2t-Isp"/>
|
|
||||||
<constraint firstAttribute="centerX" secondItem="qU1-em-e89" secondAttribute="centerX" constant="-119" id="Uqv-Mu-8Ea"/>
|
|
||||||
<constraint firstAttribute="trailing" secondItem="qU1-em-e89" secondAttribute="trailing" constant="20" id="xDv-ev-FUu"/>
|
|
||||||
</constraints>
|
|
||||||
</tableViewCellContentView>
|
|
||||||
</tableViewCell>
|
|
||||||
</cells>
|
|
||||||
</tableViewSection>
|
|
||||||
</sections>
|
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="dataSource" destination="Ob2-pp-aCj" id="VqG-Vh-qI4"/>
|
<outlet property="dataSource" destination="Ob2-pp-aCj" id="VqG-Vh-qI4"/>
|
||||||
<outlet property="delegate" destination="Ob2-pp-aCj" id="DfP-FZ-0PN"/>
|
<outlet property="delegate" destination="Ob2-pp-aCj" id="DfP-FZ-0PN"/>
|
||||||
|
|
@ -113,18 +92,15 @@
|
||||||
</tableView>
|
</tableView>
|
||||||
<navigationItem key="navigationItem" title="Steppers" id="T8O-Ms-7gi"/>
|
<navigationItem key="navigationItem" title="Steppers" id="T8O-Ms-7gi"/>
|
||||||
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
||||||
<connections>
|
|
||||||
<outlet property="customStepper" destination="Adb-NR-4zI" id="qMi-we-RaN"/>
|
|
||||||
<outlet property="customStepperLabel" destination="qU1-em-e89" id="Amb-dh-MZW"/>
|
|
||||||
<outlet property="defaultStepper" destination="LyL-x2-2Vc" id="A3V-Ae-qLa"/>
|
|
||||||
<outlet property="defaultStepperLabel" destination="o6t-lj-Q9C" id="otm-OH-9e4"/>
|
|
||||||
<outlet property="tintedStepper" destination="bdI-D2-Wgr" id="YTt-vZ-uGz"/>
|
|
||||||
<outlet property="tintedStepperLabel" destination="Pgb-CR-d8e" id="CTl-hM-tLv"/>
|
|
||||||
</connections>
|
|
||||||
</tableViewController>
|
</tableViewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="zYk-TL-2Rd" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="zYk-TL-2Rd" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="5177" y="3368"/>
|
<point key="canvasLocation" x="5177" y="3368"/>
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
|
<resources>
|
||||||
|
<systemColor name="systemBackgroundColor">
|
||||||
|
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</systemColor>
|
||||||
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="zcI-oN-J3j">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19142.2" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="zcI-oN-J3j">
|
||||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17502"/>
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19142.2"/>
|
||||||
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
|
|
@ -10,75 +12,64 @@
|
||||||
<scene sceneID="yZh-jH-dTD">
|
<scene sceneID="yZh-jH-dTD">
|
||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="zcI-oN-J3j" customClass="SwitchViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
<tableViewController id="zcI-oN-J3j" customClass="SwitchViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="4ER-nG-feZ">
|
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="none" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="4ER-nG-feZ">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
<sections>
|
<prototypes>
|
||||||
<tableViewSection headerTitle="Default" id="A1X-FU-XOh">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="defaultSwitch" id="f2V-rX-9gQ">
|
||||||
<cells>
|
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="kaW-Np-hDH">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="f2V-rX-9gQ" id="l7D-vo-3Fg">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="kaW-Np-hDH" id="q8w-Lw-NG5">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<subviews>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="oo0-hx-cfB">
|
||||||
<subviews>
|
<rect key="frame" x="163.5" y="6.5" width="51" height="31"/>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="juD-bH-XxM">
|
</switch>
|
||||||
<rect key="frame" x="163.5" y="6.5" width="51" height="31"/>
|
</subviews>
|
||||||
</switch>
|
<constraints>
|
||||||
</subviews>
|
<constraint firstAttribute="centerY" secondItem="oo0-hx-cfB" secondAttribute="centerY" id="CPt-vs-doH"/>
|
||||||
<constraints>
|
<constraint firstAttribute="centerX" secondItem="oo0-hx-cfB" secondAttribute="centerX" constant="-0.5" id="lMy-9T-OsY"/>
|
||||||
<constraint firstAttribute="centerX" secondItem="juD-bH-XxM" secondAttribute="centerX" constant="-0.5" id="VUp-yh-G33"/>
|
</constraints>
|
||||||
<constraint firstAttribute="centerY" secondItem="juD-bH-XxM" secondAttribute="centerY" id="w2H-h5-KEL"/>
|
</tableViewCellContentView>
|
||||||
</constraints>
|
</tableViewCell>
|
||||||
</tableViewCellContentView>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="checkBoxSwitch" id="ZtK-qD-aK7">
|
||||||
</tableViewCell>
|
<rect key="frame" x="0.0" y="99.5" width="375" height="44"/>
|
||||||
</cells>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</tableViewSection>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ZtK-qD-aK7" id="ftX-7w-r3T">
|
||||||
<tableViewSection headerTitle="Checkbox" id="8tR-h3-BYV" userLabel="Checkbox">
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<cells>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="OTP-c3-orK">
|
<subviews>
|
||||||
<rect key="frame" x="0.0" y="147.5" width="375" height="44"/>
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="nGn-0f-X18">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="163.5" y="6.5" width="51" height="31"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="OTP-c3-orK" id="vdP-Xc-eFr">
|
</switch>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
</subviews>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<constraints>
|
||||||
<subviews>
|
<constraint firstAttribute="centerY" secondItem="nGn-0f-X18" secondAttribute="centerY" id="r0z-Bb-coX"/>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="vfi-lH-jjc">
|
<constraint firstAttribute="centerX" secondItem="nGn-0f-X18" secondAttribute="centerX" constant="-0.5" id="zqt-MS-Iwh"/>
|
||||||
<rect key="frame" x="163.5" y="6.5" width="51" height="31"/>
|
</constraints>
|
||||||
</switch>
|
</tableViewCellContentView>
|
||||||
</subviews>
|
</tableViewCell>
|
||||||
<constraints>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="tintedSwitch" id="N1l-BI-0av">
|
||||||
<constraint firstAttribute="centerY" secondItem="vfi-lH-jjc" secondAttribute="centerY" id="6Nc-5B-mw0"/>
|
<rect key="frame" x="0.0" y="143.5" width="375" height="44"/>
|
||||||
<constraint firstAttribute="centerX" secondItem="vfi-lH-jjc" secondAttribute="centerX" constant="-0.5" id="Myr-tg-Jpi"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</constraints>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="N1l-BI-0av" id="Baf-ca-NGq">
|
||||||
</tableViewCellContentView>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
</tableViewCell>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</cells>
|
<subviews>
|
||||||
</tableViewSection>
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xbi-bh-Kv0">
|
||||||
<tableViewSection headerTitle="Tinted" id="CBk-hR-hJd">
|
<rect key="frame" x="163.5" y="6.5" width="51" height="31"/>
|
||||||
<cells>
|
</switch>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="yon-1U-p9a">
|
</subviews>
|
||||||
<rect key="frame" x="0.0" y="239.5" width="375" height="44"/>
|
<constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<constraint firstAttribute="centerY" secondItem="xbi-bh-Kv0" secondAttribute="centerY" id="12i-3X-9m6"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="yon-1U-p9a" id="wAh-qG-cWE">
|
<constraint firstAttribute="centerX" secondItem="xbi-bh-Kv0" secondAttribute="centerX" constant="-0.5" id="5W1-M2-T2f"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
</constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</tableViewCellContentView>
|
||||||
<subviews>
|
</tableViewCell>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="w5d-qp-nmC">
|
</prototypes>
|
||||||
<rect key="frame" x="163.5" y="6.5" width="51" height="31"/>
|
<sections/>
|
||||||
</switch>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="centerX" secondItem="w5d-qp-nmC" secondAttribute="centerX" constant="-0.5" id="adx-9y-wdr"/>
|
|
||||||
<constraint firstAttribute="centerY" secondItem="w5d-qp-nmC" secondAttribute="centerY" id="iOC-j0-dgx"/>
|
|
||||||
</constraints>
|
|
||||||
</tableViewCellContentView>
|
|
||||||
</tableViewCell>
|
|
||||||
</cells>
|
|
||||||
</tableViewSection>
|
|
||||||
</sections>
|
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="dataSource" destination="zcI-oN-J3j" id="bGx-5d-egx"/>
|
<outlet property="dataSource" destination="zcI-oN-J3j" id="bGx-5d-egx"/>
|
||||||
<outlet property="delegate" destination="zcI-oN-J3j" id="GLB-HP-UiY"/>
|
<outlet property="delegate" destination="zcI-oN-J3j" id="GLB-HP-UiY"/>
|
||||||
|
|
@ -86,11 +77,6 @@
|
||||||
</tableView>
|
</tableView>
|
||||||
<navigationItem key="navigationItem" title="Switches" id="E77-79-RWj"/>
|
<navigationItem key="navigationItem" title="Switches" id="E77-79-RWj"/>
|
||||||
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
||||||
<connections>
|
|
||||||
<outlet property="checkBoxSwitch" destination="vfi-lH-jjc" id="QYU-aB-c9V"/>
|
|
||||||
<outlet property="defaultSwitch" destination="juD-bH-XxM" id="U7B-Ar-wQR"/>
|
|
||||||
<outlet property="tintedSwitch" destination="w5d-qp-nmC" id="8p2-vj-WvA"/>
|
|
||||||
</connections>
|
|
||||||
</tableViewController>
|
</tableViewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="mEp-eH-gRH" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="mEp-eH-gRH" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
|
|
@ -98,8 +84,8 @@
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
<resources>
|
<resources>
|
||||||
<systemColor name="groupTableViewBackgroundColor">
|
<systemColor name="systemBackgroundColor">
|
||||||
<color red="0.94901960784313721" green="0.94901960784313721" blue="0.96862745098039216" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
</systemColor>
|
</systemColor>
|
||||||
</resources>
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
||||||
166
UIKitCatalog/Base.lproj/SymbolViewController.storyboard
Executable file
|
|
@ -0,0 +1,166 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19158" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Ob2-pp-aCj">
|
||||||
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19158"/>
|
||||||
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<scenes>
|
||||||
|
<!--SF Symbols-->
|
||||||
|
<scene sceneID="xBH-7V-3ks">
|
||||||
|
<objects>
|
||||||
|
<tableViewController id="Ob2-pp-aCj" customClass="SymbolViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
|
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="none" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="aQ3-9F-Tmi">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
|
<prototypes>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="tintedSymbol" id="pVy-wA-LGh">
|
||||||
|
<rect key="frame" x="0.0" y="49.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="pVy-wA-LGh" id="Bra-pA-ifB">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Ycd-EG-6Qx">
|
||||||
|
<rect key="frame" x="167.5" y="2" width="40" height="40"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="40" id="5Dk-Ul-mqL"/>
|
||||||
|
<constraint firstAttribute="height" constant="40" id="xOg-9x-1fX"/>
|
||||||
|
</constraints>
|
||||||
|
</imageView>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="Ycd-EG-6Qx" firstAttribute="centerY" secondItem="Bra-pA-ifB" secondAttribute="centerY" id="D64-wD-E8M"/>
|
||||||
|
<constraint firstItem="Ycd-EG-6Qx" firstAttribute="centerX" secondItem="Bra-pA-ifB" secondAttribute="centerX" id="L6C-0R-o16"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="preferringMultiColorSymbol" id="mn5-em-euI">
|
||||||
|
<rect key="frame" x="0.0" y="93.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="mn5-em-euI" id="jfd-AB-91o">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="9BN-CJ-ydA">
|
||||||
|
<rect key="frame" x="167.5" y="2" width="40" height="40"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="height" constant="40" id="7Rc-ot-zfb"/>
|
||||||
|
<constraint firstAttribute="width" constant="40" id="Y3r-DQ-mue"/>
|
||||||
|
</constraints>
|
||||||
|
</imageView>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="9BN-CJ-ydA" firstAttribute="centerX" secondItem="jfd-AB-91o" secondAttribute="centerX" id="XEw-ob-DxO"/>
|
||||||
|
<constraint firstItem="9BN-CJ-ydA" firstAttribute="centerY" secondItem="jfd-AB-91o" secondAttribute="centerY" id="ZmR-w2-01z"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="largeSizeSymbol" rowHeight="87" id="b8L-NP-7ig">
|
||||||
|
<rect key="frame" x="0.0" y="137.5" width="375" height="87"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="b8L-NP-7ig" id="jxN-AA-sF8">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="87"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="l7n-W1-B5F">
|
||||||
|
<rect key="frame" x="146.5" y="0.0" width="82" height="87"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="height" constant="87" id="1gl-G4-uFA"/>
|
||||||
|
<constraint firstAttribute="width" constant="82" id="9Js-Pr-0VY"/>
|
||||||
|
</constraints>
|
||||||
|
</imageView>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="l7n-W1-B5F" firstAttribute="centerX" secondItem="jxN-AA-sF8" secondAttribute="centerX" id="K0e-mN-a6z"/>
|
||||||
|
<constraint firstItem="l7n-W1-B5F" firstAttribute="centerY" secondItem="jxN-AA-sF8" secondAttribute="centerY" id="XFU-nr-Zsg"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="paletteColorsSymbol" id="Lc6-Yf-pbx">
|
||||||
|
<rect key="frame" x="0.0" y="224.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Lc6-Yf-pbx" id="jHG-40-zKP">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="qfQ-PP-XIX">
|
||||||
|
<rect key="frame" x="167.5" y="2" width="40" height="40"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="height" constant="40" id="BD3-xX-g1U"/>
|
||||||
|
<constraint firstAttribute="width" constant="40" id="bvT-GT-GE5"/>
|
||||||
|
</constraints>
|
||||||
|
</imageView>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="qfQ-PP-XIX" firstAttribute="centerY" secondItem="jHG-40-zKP" secondAttribute="centerY" id="Nsc-ga-mot"/>
|
||||||
|
<constraint firstItem="qfQ-PP-XIX" firstAttribute="centerX" secondItem="jHG-40-zKP" secondAttribute="centerX" id="x1c-o2-9hg"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="plainSymbol" id="X5R-ZG-sGl">
|
||||||
|
<rect key="frame" x="0.0" y="268.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="X5R-ZG-sGl" id="HYL-4M-XUi">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="oRB-W1-zx1">
|
||||||
|
<rect key="frame" x="167.5" y="2" width="40" height="40"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="height" constant="40" id="oBK-EI-1lY"/>
|
||||||
|
<constraint firstAttribute="width" constant="40" id="zCT-dt-i5N"/>
|
||||||
|
</constraints>
|
||||||
|
</imageView>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="oRB-W1-zx1" firstAttribute="centerX" secondItem="HYL-4M-XUi" secondAttribute="centerX" id="VdQ-ME-0pr"/>
|
||||||
|
<constraint firstItem="oRB-W1-zx1" firstAttribute="centerY" secondItem="HYL-4M-XUi" secondAttribute="centerY" id="nhd-Yl-GRn"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="hierarchicalColorSymbol" id="4Qm-cv-5Zj">
|
||||||
|
<rect key="frame" x="0.0" y="312.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="4Qm-cv-5Zj" id="a2f-Kd-Lhe">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="syU-Qn-r3j">
|
||||||
|
<rect key="frame" x="167.5" y="2" width="40" height="40"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="40" id="cvd-lE-fE7"/>
|
||||||
|
<constraint firstAttribute="height" constant="40" id="n1h-7v-SdN"/>
|
||||||
|
</constraints>
|
||||||
|
</imageView>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="syU-Qn-r3j" firstAttribute="centerX" secondItem="a2f-Kd-Lhe" secondAttribute="centerX" id="9Fv-Xy-fgd"/>
|
||||||
|
<constraint firstItem="syU-Qn-r3j" firstAttribute="centerY" secondItem="a2f-Kd-Lhe" secondAttribute="centerY" id="hdv-YK-jtt"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
</prototypes>
|
||||||
|
<sections/>
|
||||||
|
<connections>
|
||||||
|
<outlet property="dataSource" destination="Ob2-pp-aCj" id="VqG-Vh-qI4"/>
|
||||||
|
<outlet property="delegate" destination="Ob2-pp-aCj" id="DfP-FZ-0PN"/>
|
||||||
|
</connections>
|
||||||
|
</tableView>
|
||||||
|
<navigationItem key="navigationItem" title="SF Symbols" id="T8O-Ms-7gi"/>
|
||||||
|
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
||||||
|
</tableViewController>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="zYk-TL-2Rd" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
|
</objects>
|
||||||
|
<point key="canvasLocation" x="5177" y="3368"/>
|
||||||
|
</scene>
|
||||||
|
</scenes>
|
||||||
|
<resources>
|
||||||
|
<systemColor name="systemBackgroundColor">
|
||||||
|
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</systemColor>
|
||||||
|
</resources>
|
||||||
|
</document>
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14810.12" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="DSJ-7r-oCY">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19142.2" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="DSJ-7r-oCY">
|
||||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14766.15"/>
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19142.2"/>
|
||||||
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
|
|
@ -10,180 +12,144 @@
|
||||||
<scene sceneID="LZ1-eW-n5K">
|
<scene sceneID="LZ1-eW-n5K">
|
||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="DSJ-7r-oCY" customClass="TextFieldViewController" customModule="UIKitCatalog" sceneMemberID="viewController">
|
<tableViewController id="DSJ-7r-oCY" customClass="TextFieldViewController" customModule="UIKitCatalog" sceneMemberID="viewController">
|
||||||
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="dyj-uS-k8j">
|
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="none" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="dyj-uS-k8j">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
<sections>
|
<prototypes>
|
||||||
<tableViewSection headerTitle="Default" id="2JS-A6-933">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="searchTextField" id="ljc-Jw-BFg">
|
||||||
<cells>
|
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="tt6-SE-2XG">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ljc-Jw-BFg" id="Flg-he-G6P">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="tt6-SE-2XG" id="V1m-oL-rpG">
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<subviews>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="KMF-X8-0hG" customClass="UISearchTextField">
|
||||||
<subviews>
|
<rect key="frame" x="16" y="5" width="343" height="34"/>
|
||||||
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="d0M-ZQ-Bl5">
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
<rect key="frame" x="77.5" y="5" width="220" height="34"/>
|
<textInputTraits key="textInputTraits"/>
|
||||||
<constraints>
|
</textField>
|
||||||
<constraint firstAttribute="width" constant="220" id="SkU-sM-X8n"/>
|
</subviews>
|
||||||
</constraints>
|
<constraints>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
<constraint firstItem="KMF-X8-0hG" firstAttribute="leading" secondItem="Flg-he-G6P" secondAttribute="leading" constant="16" id="3oU-Rj-dHI"/>
|
||||||
<textInputTraits key="textInputTraits"/>
|
<constraint firstAttribute="trailing" secondItem="KMF-X8-0hG" secondAttribute="trailing" constant="16" id="a5j-ld-ug7"/>
|
||||||
<connections>
|
<constraint firstItem="KMF-X8-0hG" firstAttribute="centerY" secondItem="Flg-he-G6P" secondAttribute="centerY" id="sN1-MK-Ksi"/>
|
||||||
<outlet property="delegate" destination="DSJ-7r-oCY" id="ctm-bX-Oxa"/>
|
</constraints>
|
||||||
</connections>
|
</tableViewCellContentView>
|
||||||
</textField>
|
</tableViewCell>
|
||||||
</subviews>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="tintedTextField" id="Hzq-9N-XB0">
|
||||||
|
<rect key="frame" x="0.0" y="99.5" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Hzq-9N-XB0" id="Qda-3b-61J">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="RaZ-lZ-jgw">
|
||||||
|
<rect key="frame" x="77.5" y="5" width="220" height="34"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="d0M-ZQ-Bl5" firstAttribute="centerY" secondItem="V1m-oL-rpG" secondAttribute="centerY" id="t7K-C9-UtL"/>
|
<constraint firstAttribute="width" constant="220" id="8g0-cm-CCU"/>
|
||||||
<constraint firstItem="d0M-ZQ-Bl5" firstAttribute="centerX" secondItem="V1m-oL-rpG" secondAttribute="centerX" id="u0Y-TA-d2a"/>
|
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
</tableViewCell>
|
<textInputTraits key="textInputTraits"/>
|
||||||
</cells>
|
</textField>
|
||||||
</tableViewSection>
|
</subviews>
|
||||||
<tableViewSection headerTitle="Tinted" id="ugZ-rF-ygf">
|
<constraints>
|
||||||
<cells>
|
<constraint firstItem="RaZ-lZ-jgw" firstAttribute="centerX" secondItem="Qda-3b-61J" secondAttribute="centerX" id="Chp-t2-uTm"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="ByO-KF-g5d">
|
<constraint firstItem="RaZ-lZ-jgw" firstAttribute="centerY" secondItem="Qda-3b-61J" secondAttribute="centerY" id="frJ-63-zGK"/>
|
||||||
<rect key="frame" x="0.0" y="147.5" width="375" height="44"/>
|
</constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</tableViewCellContentView>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ByO-KF-g5d" id="3ka-jS-1aS">
|
</tableViewCell>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="customTextField" id="aEK-MG-3mO">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="0.0" y="143.5" width="375" height="44"/>
|
||||||
<subviews>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="HOG-Yp-juH">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="aEK-MG-3mO" id="rTF-Av-Gl6">
|
||||||
<rect key="frame" x="77.5" y="5" width="220" height="34"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<constraints>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<constraint firstAttribute="width" constant="220" id="LtQ-yh-RuD"/>
|
<subviews>
|
||||||
</constraints>
|
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="6wP-A9-fuw" customClass="CustomTextField" customModule="UIKitCatalog" customModuleProvider="target">
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
<rect key="frame" x="77.5" y="7" width="220" height="30"/>
|
||||||
<textInputTraits key="textInputTraits"/>
|
|
||||||
<connections>
|
|
||||||
<outlet property="delegate" destination="DSJ-7r-oCY" id="cAt-Pg-ihE"/>
|
|
||||||
</connections>
|
|
||||||
</textField>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="HOG-Yp-juH" firstAttribute="centerX" secondItem="3ka-jS-1aS" secondAttribute="centerX" id="DRS-zK-WcP"/>
|
<constraint firstAttribute="height" constant="30" id="9u9-Ih-c3n"/>
|
||||||
<constraint firstItem="HOG-Yp-juH" firstAttribute="centerY" secondItem="3ka-jS-1aS" secondAttribute="centerY" id="RkA-1I-yPa"/>
|
<constraint firstAttribute="width" constant="220" id="KcF-vn-pCo"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
</tableViewCell>
|
<textInputTraits key="textInputTraits"/>
|
||||||
</cells>
|
</textField>
|
||||||
</tableViewSection>
|
</subviews>
|
||||||
<tableViewSection headerTitle="Secure" id="9AM-Ev-vhx">
|
<constraints>
|
||||||
<cells>
|
<constraint firstItem="6wP-A9-fuw" firstAttribute="centerX" secondItem="rTF-Av-Gl6" secondAttribute="centerX" id="Ch9-dM-KUe"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="EAr-Is-gih">
|
<constraint firstItem="6wP-A9-fuw" firstAttribute="centerY" secondItem="rTF-Av-Gl6" secondAttribute="centerY" id="QQq-vN-xN6"/>
|
||||||
<rect key="frame" x="0.0" y="239.5" width="375" height="44"/>
|
</constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</tableViewCellContentView>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="EAr-Is-gih" id="Pbu-Mo-uwJ">
|
</tableViewCell>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="textField" id="i19-Yq-4mF">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="0.0" y="187.5" width="375" height="44"/>
|
||||||
<subviews>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="6hY-Wr-WkQ">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="i19-Yq-4mF" id="RSc-mr-TRr">
|
||||||
<rect key="frame" x="77.5" y="5" width="220" height="34"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<constraints>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<constraint firstAttribute="width" constant="220" id="G3c-qp-XID"/>
|
<subviews>
|
||||||
</constraints>
|
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="D6m-mF-B3r">
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
<rect key="frame" x="77.5" y="5" width="220" height="34"/>
|
||||||
<textInputTraits key="textInputTraits"/>
|
|
||||||
<connections>
|
|
||||||
<outlet property="delegate" destination="DSJ-7r-oCY" id="Zmt-rK-fSU"/>
|
|
||||||
</connections>
|
|
||||||
</textField>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="6hY-Wr-WkQ" firstAttribute="centerY" secondItem="Pbu-Mo-uwJ" secondAttribute="centerY" id="OnO-T7-ZUU"/>
|
<constraint firstAttribute="width" constant="220" id="Nex-2s-odm"/>
|
||||||
<constraint firstItem="6hY-Wr-WkQ" firstAttribute="centerX" secondItem="Pbu-Mo-uwJ" secondAttribute="centerX" id="aGR-0Y-ycU"/>
|
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
</tableViewCell>
|
<textInputTraits key="textInputTraits"/>
|
||||||
</cells>
|
</textField>
|
||||||
</tableViewSection>
|
</subviews>
|
||||||
<tableViewSection headerTitle="Specific Keyboard" id="8fd-bp-7eJ">
|
<constraints>
|
||||||
<cells>
|
<constraint firstItem="D6m-mF-B3r" firstAttribute="centerY" secondItem="RSc-mr-TRr" secondAttribute="centerY" id="9NB-wB-rek"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="mGp-N1-iXx">
|
<constraint firstItem="D6m-mF-B3r" firstAttribute="centerX" secondItem="RSc-mr-TRr" secondAttribute="centerX" id="lL4-fs-w9G"/>
|
||||||
<rect key="frame" x="0.0" y="331.5" width="375" height="44"/>
|
</constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</tableViewCellContentView>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="mGp-N1-iXx" id="odC-GC-3EW">
|
</tableViewCell>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="secureTextField" id="q3S-83-5Zc">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="0.0" y="231.5" width="375" height="44"/>
|
||||||
<subviews>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="3ok-UO-qNK">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="q3S-83-5Zc" id="ldB-99-6ew">
|
||||||
<rect key="frame" x="77.5" y="5" width="220" height="34"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<constraints>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<constraint firstAttribute="width" constant="220" id="d07-kK-qmr"/>
|
<subviews>
|
||||||
</constraints>
|
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="01t-K1-N8y">
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
<rect key="frame" x="77.5" y="5" width="220" height="34"/>
|
||||||
<textInputTraits key="textInputTraits"/>
|
|
||||||
<connections>
|
|
||||||
<outlet property="delegate" destination="DSJ-7r-oCY" id="CjX-Df-Mh3"/>
|
|
||||||
</connections>
|
|
||||||
</textField>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="3ok-UO-qNK" firstAttribute="centerY" secondItem="odC-GC-3EW" secondAttribute="centerY" id="O8S-Pd-mBi"/>
|
<constraint firstAttribute="width" constant="220" id="Oy2-bN-gOD"/>
|
||||||
<constraint firstItem="3ok-UO-qNK" firstAttribute="centerX" secondItem="odC-GC-3EW" secondAttribute="centerX" id="ZvK-c6-Jps"/>
|
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
</tableViewCell>
|
<textInputTraits key="textInputTraits"/>
|
||||||
</cells>
|
</textField>
|
||||||
</tableViewSection>
|
</subviews>
|
||||||
<tableViewSection headerTitle="Custom" id="l4j-0I-akf">
|
<constraints>
|
||||||
<cells>
|
<constraint firstItem="01t-K1-N8y" firstAttribute="centerX" secondItem="ldB-99-6ew" secondAttribute="centerX" id="JQW-P1-dGM"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="p2q-cS-yAy">
|
<constraint firstItem="01t-K1-N8y" firstAttribute="centerY" secondItem="ldB-99-6ew" secondAttribute="centerY" id="jOt-ew-Rwg"/>
|
||||||
<rect key="frame" x="0.0" y="423.5" width="375" height="44"/>
|
</constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</tableViewCellContentView>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="p2q-cS-yAy" id="bAa-ty-BjE">
|
</tableViewCell>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="specificKeyboardTextField" id="Zkk-A5-awr">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<rect key="frame" x="0.0" y="275.5" width="375" height="44"/>
|
||||||
<subviews>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="6mq-oY-1e5" customClass="CustomTextField" customModule="UIKitCatalog" customModuleProvider="target">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Zkk-A5-awr" id="WTM-Nr-vcg">
|
||||||
<rect key="frame" x="77.5" y="7" width="220" height="30"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<constraints>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<constraint firstAttribute="height" constant="30" id="Oha-uj-d5N"/>
|
<subviews>
|
||||||
<constraint firstAttribute="width" constant="220" id="eUf-Cr-cPr"/>
|
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="adw-oz-cM4">
|
||||||
</constraints>
|
<rect key="frame" x="77.5" y="5" width="220" height="34"/>
|
||||||
<nil key="textColor"/>
|
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
|
||||||
<textInputTraits key="textInputTraits"/>
|
|
||||||
</textField>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="centerX" secondItem="6mq-oY-1e5" secondAttribute="centerX" id="RXI-Mh-Ek3"/>
|
<constraint firstAttribute="width" constant="220" id="Oa9-Da-JNv"/>
|
||||||
<constraint firstAttribute="centerY" secondItem="6mq-oY-1e5" secondAttribute="centerY" id="dDm-B5-GZA"/>
|
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
</tableViewCell>
|
<textInputTraits key="textInputTraits"/>
|
||||||
</cells>
|
</textField>
|
||||||
</tableViewSection>
|
</subviews>
|
||||||
<tableViewSection headerTitle="Search" id="VUY-JJ-17B" userLabel="Search">
|
<constraints>
|
||||||
<cells>
|
<constraint firstItem="adw-oz-cM4" firstAttribute="centerY" secondItem="WTM-Nr-vcg" secondAttribute="centerY" id="Dib-Er-1pc"/>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="bAz-f1-WeK">
|
<constraint firstItem="adw-oz-cM4" firstAttribute="centerX" secondItem="WTM-Nr-vcg" secondAttribute="centerX" id="qS2-qW-3Ge"/>
|
||||||
<rect key="frame" x="0.0" y="515.5" width="375" height="44"/>
|
</constraints>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
</tableViewCellContentView>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="bAz-f1-WeK" id="Kgt-hf-9Hx">
|
</tableViewCell>
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
</prototypes>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<sections/>
|
||||||
<subviews>
|
|
||||||
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="gmJ-iC-UR1" customClass="UISearchTextField">
|
|
||||||
<rect key="frame" x="16" y="5" width="343" height="34"/>
|
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
|
||||||
<textInputTraits key="textInputTraits"/>
|
|
||||||
</textField>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstItem="gmJ-iC-UR1" firstAttribute="leading" secondItem="Kgt-hf-9Hx" secondAttribute="leading" constant="16" id="28g-0I-bAe"/>
|
|
||||||
<constraint firstAttribute="trailing" secondItem="gmJ-iC-UR1" secondAttribute="trailing" constant="16" id="Jz1-Nh-QXZ"/>
|
|
||||||
<constraint firstItem="gmJ-iC-UR1" firstAttribute="centerY" secondItem="Kgt-hf-9Hx" secondAttribute="centerY" id="Wkh-l0-hl5"/>
|
|
||||||
</constraints>
|
|
||||||
</tableViewCellContentView>
|
|
||||||
</tableViewCell>
|
|
||||||
</cells>
|
|
||||||
</tableViewSection>
|
|
||||||
</sections>
|
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="dataSource" destination="DSJ-7r-oCY" id="13x-bY-Aua"/>
|
<outlet property="dataSource" destination="DSJ-7r-oCY" id="13x-bY-Aua"/>
|
||||||
<outlet property="delegate" destination="DSJ-7r-oCY" id="55q-Q9-lgO"/>
|
<outlet property="delegate" destination="DSJ-7r-oCY" id="55q-Q9-lgO"/>
|
||||||
|
|
@ -191,18 +157,15 @@
|
||||||
</tableView>
|
</tableView>
|
||||||
<navigationItem key="navigationItem" title="Text Fields" id="zBI-nb-i1W"/>
|
<navigationItem key="navigationItem" title="Text Fields" id="zBI-nb-i1W"/>
|
||||||
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
|
||||||
<connections>
|
|
||||||
<outlet property="customTextField" destination="6mq-oY-1e5" id="Hmo-kx-Ova"/>
|
|
||||||
<outlet property="searchTextField" destination="gmJ-iC-UR1" id="9C4-Vs-FF9"/>
|
|
||||||
<outlet property="secureTextField" destination="6hY-Wr-WkQ" id="Q5H-ZR-LOf"/>
|
|
||||||
<outlet property="specificKeyboardTextField" destination="3ok-UO-qNK" id="6Ba-Of-HrL"/>
|
|
||||||
<outlet property="textField" destination="d0M-ZQ-Bl5" id="vN0-aU-p1n"/>
|
|
||||||
<outlet property="tintedTextField" destination="HOG-Yp-juH" id="zFM-DP-kUM"/>
|
|
||||||
</connections>
|
|
||||||
</tableViewController>
|
</tableViewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="OdI-IP-47Q" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="OdI-IP-47Q" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="7048.8000000000002" y="3367.4662668665669"/>
|
<point key="canvasLocation" x="7048.8000000000002" y="3367.4662668665669"/>
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
|
<resources>
|
||||||
|
<systemColor name="systemBackgroundColor">
|
||||||
|
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</systemColor>
|
||||||
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
||||||
53
UIKitCatalog/Base.lproj/VisualEffectViewController.storyboard
Executable file
|
|
@ -0,0 +1,53 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19115.2" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Tca-bC-mV6">
|
||||||
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19107.4"/>
|
||||||
|
<capability name="Image references" minToolsVersion="12.0"/>
|
||||||
|
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||||
|
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<scenes>
|
||||||
|
<!--SimpleApp-->
|
||||||
|
<scene sceneID="F0r-75-F0c">
|
||||||
|
<objects>
|
||||||
|
<viewController storyboardIdentifier="VisualEffectViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="Tca-bC-mV6" customClass="VisualEffectViewController" customModule="UIKitCatalog" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
|
<view key="view" contentMode="scaleToFill" id="0ea-tg-uqz">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="lPK-uB-0lC">
|
||||||
|
<rect key="frame" x="16" y="226" width="343" height="215"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="height" constant="215" id="LuO-hI-dhF"/>
|
||||||
|
<constraint firstAttribute="width" constant="343" id="gg5-5R-0of"/>
|
||||||
|
</constraints>
|
||||||
|
<imageReference key="image" image="Flowers_2"/>
|
||||||
|
</imageView>
|
||||||
|
</subviews>
|
||||||
|
<viewLayoutGuide key="safeArea" id="mbH-ch-V86"/>
|
||||||
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="lPK-uB-0lC" firstAttribute="centerY" secondItem="mbH-ch-V86" secondAttribute="centerY" id="B97-ip-aRP"/>
|
||||||
|
<constraint firstItem="lPK-uB-0lC" firstAttribute="centerX" secondItem="mbH-ch-V86" secondAttribute="centerX" id="Rjo-2r-9Mh"/>
|
||||||
|
</constraints>
|
||||||
|
</view>
|
||||||
|
<navigationItem key="navigationItem" title="SimpleApp" id="LGU-hM-wnb"/>
|
||||||
|
<connections>
|
||||||
|
<outlet property="imageView" destination="lPK-uB-0lC" id="91A-hY-8tb"/>
|
||||||
|
</connections>
|
||||||
|
</viewController>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="4pN-Sw-eWy" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||||
|
</objects>
|
||||||
|
<point key="canvasLocation" x="-68" y="3357"/>
|
||||||
|
</scene>
|
||||||
|
</scenes>
|
||||||
|
<resources>
|
||||||
|
<image name="Flowers_2" width="816" height="612"/>
|
||||||
|
<systemColor name="systemBackgroundColor">
|
||||||
|
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
</systemColor>
|
||||||
|
</resources>
|
||||||
|
</document>
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<br>
|
<br>
|
||||||
<h1>This is HTML content inside a <u>WKWebView</u>.</h1>
|
<h2>This is HTML content inside a <u>WKWebView</u>.</h2>
|
||||||
|
For more information refer to <a href="https://developer.apple.com/documentation/webkit/wkwebview">developer.apple.com</a>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
52
UIKitCatalog/BaseTableViewController.swift
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
See LICENSE folder for this sample’s licensing information.
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
A base class used for all UITableViewControllers in this sample app.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
class BaseTableViewController: UITableViewController {
|
||||||
|
// List of table view cell test cases.
|
||||||
|
var testCells = [CaseElement]()
|
||||||
|
|
||||||
|
func centeredHeaderView(_ title: String) -> UITableViewHeaderFooterView {
|
||||||
|
// Set the header title and make it centered.
|
||||||
|
let headerView: UITableViewHeaderFooterView = UITableViewHeaderFooterView()
|
||||||
|
var content = UIListContentConfiguration.groupedHeader()
|
||||||
|
content.text = title
|
||||||
|
content.textProperties.alignment = .center
|
||||||
|
headerView.contentConfiguration = content
|
||||||
|
return headerView
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - UITableViewDataSource
|
||||||
|
|
||||||
|
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
|
||||||
|
return centeredHeaderView(testCells[section].title)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
|
||||||
|
return testCells[section].title
|
||||||
|
}
|
||||||
|
|
||||||
|
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
override func numberOfSections(in tableView: UITableView) -> Int {
|
||||||
|
return testCells.count
|
||||||
|
}
|
||||||
|
|
||||||
|
override func tableView(_ tableView: UITableView,
|
||||||
|
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||||
|
let cellTest = testCells[indexPath.section]
|
||||||
|
let cell = tableView.dequeueReusableCell(withIdentifier: cellTest.cellID, for: indexPath)
|
||||||
|
if let view = cellTest.targetView(cell) {
|
||||||
|
cellTest.configHandler(view)
|
||||||
|
}
|
||||||
|
return cell
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
468
UIKitCatalog/ButtonViewController+Configs.swift
Executable file
|
|
@ -0,0 +1,468 @@
|
||||||
|
/*
|
||||||
|
See LICENSE folder for this sample’s licensing information.
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
Configuration functions for all the UIButtons found in ButtonViewController.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
extension ButtonViewController: UIToolTipInteractionDelegate {
|
||||||
|
|
||||||
|
func configureSystemTextButton(_ button: UIButton) {
|
||||||
|
button.setTitle(NSLocalizedString("Button", comment: ""), for: [])
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
func configureSystemDetailDisclosureButton(_ button: UIButton) {
|
||||||
|
// Nothing particular to set here, it's all been done in the storyboard.
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
func configureSystemContactAddButton(_ button: UIButton) {
|
||||||
|
// Nothing particular to set here, it's all been done in the storyboard.
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureCloseButton(_ button: UIButton) {
|
||||||
|
// Nothing particular to set here, it's all been done in the storyboard.
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 15.0, *)
|
||||||
|
func configureStyleGrayButton(_ button: UIButton) {
|
||||||
|
// Note this can be also be done in the storyboard for this button.
|
||||||
|
let config = UIButton.Configuration.gray()
|
||||||
|
button.configuration = config
|
||||||
|
|
||||||
|
button.setTitle(NSLocalizedString("Button", comment: ""), for: .normal)
|
||||||
|
button.toolTip = NSLocalizedString("GrayStyleButtonToolTipTitle", comment: "")
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 15.0, *)
|
||||||
|
func configureStyleTintedButton(_ button: UIButton) {
|
||||||
|
// Note this can be also be done in the storyboard for this button.
|
||||||
|
|
||||||
|
var config = UIButton.Configuration.tinted()
|
||||||
|
|
||||||
|
/** To keep the look the same betwen iOS and macOS:
|
||||||
|
For tinted color to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
|
||||||
|
Available in macOS 12 or later (Mac Catalyst 15.0 or later).
|
||||||
|
Use this for controls that need to look the same between iOS and macOS.
|
||||||
|
*/
|
||||||
|
if traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
button.preferredBehavioralStyle = .pad
|
||||||
|
}
|
||||||
|
|
||||||
|
// The following will make the button title red and background a lighter red.
|
||||||
|
config.baseBackgroundColor = .systemRed
|
||||||
|
config.baseForegroundColor = .systemRed
|
||||||
|
|
||||||
|
button.setTitle(NSLocalizedString("Button", comment: ""), for: .normal)
|
||||||
|
button.toolTip = NSLocalizedString("TintedStyleButtonToolTipTitle", comment: "")
|
||||||
|
|
||||||
|
button.configuration = config
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 15.0, *)
|
||||||
|
func configureStyleFilledButton(_ button: UIButton) {
|
||||||
|
// Note this can be also be done in the storyboard for this button.
|
||||||
|
var config = UIButton.Configuration.filled()
|
||||||
|
config.background.backgroundColor = .systemRed
|
||||||
|
button.configuration = config
|
||||||
|
|
||||||
|
button.setTitle(NSLocalizedString("Button", comment: ""), for: .normal)
|
||||||
|
button.toolTip = NSLocalizedString("FilledStyleButtonToolTipTitle", comment: "")
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 15.0, *)
|
||||||
|
func configureCornerStyleButton(_ button: UIButton) {
|
||||||
|
/** To keep the look the same betwen iOS and macOS:
|
||||||
|
For cornerStyle to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
|
||||||
|
Available in macOS 12 or later (Mac Catalyst 15.0 or later).
|
||||||
|
Use this for controls that need to look the same between iOS and macOS.
|
||||||
|
*/
|
||||||
|
if traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
button.preferredBehavioralStyle = .pad
|
||||||
|
}
|
||||||
|
|
||||||
|
var config = UIButton.Configuration.gray()
|
||||||
|
config.cornerStyle = .capsule
|
||||||
|
button.configuration = config
|
||||||
|
|
||||||
|
button.setTitle(NSLocalizedString("Button", comment: ""), for: .normal)
|
||||||
|
button.toolTip = NSLocalizedString("CapsuleStyleButtonToolTipTitle", comment: "")
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureImageButton(_ button: UIButton) {
|
||||||
|
// To create this button in code you can use `UIButton.init(type: .system)`.
|
||||||
|
|
||||||
|
// Set the tint color to the button's image.
|
||||||
|
if let image = UIImage(systemName: "xmark") {
|
||||||
|
let imageButtonNormalImage = image.withTintColor(.systemPurple)
|
||||||
|
button.setImage(imageButtonNormalImage, for: .normal)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Since this button title is just an image, add an accessibility label.
|
||||||
|
button.accessibilityLabel = NSLocalizedString("X", comment: "")
|
||||||
|
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
button.toolTip = NSLocalizedString("XButtonToolTipTitle", comment: "")
|
||||||
|
}
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureAttributedTextSystemButton(_ button: UIButton) {
|
||||||
|
let buttonTitle = NSLocalizedString("Button", comment: "")
|
||||||
|
|
||||||
|
// Set the button's title for normal state.
|
||||||
|
let normalTitleAttributes: [NSAttributedString.Key: Any] = [
|
||||||
|
NSAttributedString.Key.strikethroughStyle: NSUnderlineStyle.single.rawValue
|
||||||
|
]
|
||||||
|
|
||||||
|
let normalAttributedTitle = NSAttributedString(string: buttonTitle, attributes: normalTitleAttributes)
|
||||||
|
button.setAttributedTitle(normalAttributedTitle, for: .normal)
|
||||||
|
|
||||||
|
// Set the button's title for highlighted state (note this is not supported in Mac Catalyst).
|
||||||
|
let highlightedTitleAttributes: [NSAttributedString.Key: Any] = [
|
||||||
|
NSAttributedString.Key.foregroundColor: UIColor.systemGreen,
|
||||||
|
NSAttributedString.Key.strikethroughStyle: NSUnderlineStyle.thick.rawValue
|
||||||
|
]
|
||||||
|
let highlightedAttributedTitle = NSAttributedString(string: buttonTitle, attributes: highlightedTitleAttributes)
|
||||||
|
button.setAttributedTitle(highlightedAttributedTitle, for: .highlighted)
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureSymbolButton(_ button: UIButton) {
|
||||||
|
let buttonImage = UIImage(systemName: "person")
|
||||||
|
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
// For iOS 15 use the UIButtonConfiguration to set the image.
|
||||||
|
var buttonConfig = UIButton.Configuration.plain()
|
||||||
|
buttonConfig.image = buttonImage
|
||||||
|
button.configuration = buttonConfig
|
||||||
|
|
||||||
|
button.toolTip = NSLocalizedString("PersonButtonToolTipTitle", comment: "")
|
||||||
|
} else {
|
||||||
|
button.setImage(buttonImage, for: .normal)
|
||||||
|
}
|
||||||
|
|
||||||
|
let config = UIImage.SymbolConfiguration(textStyle: .body, scale: .large)
|
||||||
|
button.setPreferredSymbolConfiguration(config, forImageIn: .normal)
|
||||||
|
|
||||||
|
// Since this button title is just an image, add an accessibility label.
|
||||||
|
button.accessibilityLabel = NSLocalizedString("Person", comment: "")
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureLargeSymbolButton(_ button: UIButton) {
|
||||||
|
let buttonImage = UIImage(systemName: "person")
|
||||||
|
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
// For iOS 15 use the UIButtonConfiguration to change the size.
|
||||||
|
var buttonConfig = UIButton.Configuration.plain()
|
||||||
|
buttonConfig.preferredSymbolConfigurationForImage = UIImage.SymbolConfiguration(textStyle: .largeTitle)
|
||||||
|
buttonConfig.image = buttonImage
|
||||||
|
button.configuration = buttonConfig
|
||||||
|
} else {
|
||||||
|
button.setImage(buttonImage, for: .normal)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Since this button title is just an image, add an accessibility label.
|
||||||
|
button.accessibilityLabel = NSLocalizedString("Person", comment: "")
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureSymbolTextButton(_ button: UIButton) {
|
||||||
|
// Button with image to the left of the title.
|
||||||
|
|
||||||
|
let buttonImage = UIImage(systemName: "person")
|
||||||
|
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
// Use UIButtonConfiguration to set the image.
|
||||||
|
var buttonConfig = UIButton.Configuration.plain()
|
||||||
|
|
||||||
|
// Set up the symbol image size to match that of the title font size.
|
||||||
|
buttonConfig.preferredSymbolConfigurationForImage = UIImage.SymbolConfiguration(textStyle: .body)
|
||||||
|
buttonConfig.image = buttonImage
|
||||||
|
|
||||||
|
button.configuration = buttonConfig
|
||||||
|
} else {
|
||||||
|
button.setImage(buttonImage, for: .normal)
|
||||||
|
|
||||||
|
// Set up the symbol image size to match that of the title font size.
|
||||||
|
let config = UIImage.SymbolConfiguration(textStyle: .body, scale: .small)
|
||||||
|
button.setPreferredSymbolConfiguration(config, forImageIn: .normal)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the button's title and font.
|
||||||
|
button.setTitle(NSLocalizedString("Person", comment: ""), for: [])
|
||||||
|
button.titleLabel?.font = UIFont.preferredFont(forTextStyle: .body)
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureTextSymbolButton(_ button: UIButton) {
|
||||||
|
// Button with image to the right of the title.
|
||||||
|
|
||||||
|
let buttonImage = UIImage(systemName: "person")
|
||||||
|
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
// Use UIButtonConfiguration to set the image.
|
||||||
|
var buttonConfig = UIButton.Configuration.plain()
|
||||||
|
|
||||||
|
// Set up the symbol image size to match that of the title font size.
|
||||||
|
buttonConfig.preferredSymbolConfigurationForImage = UIImage.SymbolConfiguration(textStyle: .body)
|
||||||
|
|
||||||
|
buttonConfig.image = buttonImage
|
||||||
|
|
||||||
|
// Set the image placement to the right of the title.
|
||||||
|
/** For image placement to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
|
||||||
|
Available in macOS 12 or later (Mac Catalyst 15.0 or later).
|
||||||
|
Use this for controls that need to look the same between iOS and macOS.
|
||||||
|
*/
|
||||||
|
if traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
button.preferredBehavioralStyle = .pad
|
||||||
|
}
|
||||||
|
buttonConfig.imagePlacement = .trailing
|
||||||
|
|
||||||
|
button.configuration = buttonConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the button's title and font.
|
||||||
|
button.setTitle(NSLocalizedString("Person", comment: ""), for: [])
|
||||||
|
button.titleLabel?.font = UIFont.preferredFont(forTextStyle: .body)
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 15.0, *)
|
||||||
|
func configureMultiTitleButton(_ button: UIButton) {
|
||||||
|
/** To keep the look the same betwen iOS and macOS:
|
||||||
|
For setTitle(.highlighted) to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
|
||||||
|
Available in macOS 12 or later (Mac Catalyst 15.0 or later).
|
||||||
|
Use this for controls that need to look the same between iOS and macOS.
|
||||||
|
*/
|
||||||
|
if traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
button.preferredBehavioralStyle = .pad
|
||||||
|
}
|
||||||
|
|
||||||
|
button.setTitle(NSLocalizedString("Button", comment: ""), for: .normal)
|
||||||
|
button.setTitle(NSLocalizedString("Pressed", comment: ""), for: .highlighted)
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 15.0, *)
|
||||||
|
func configureToggleButton(button: UIButton) {
|
||||||
|
button.changesSelectionAsPrimaryAction = true // This makes the button style a "toggle button".
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureTitleTextButton(_ button: UIButton) {
|
||||||
|
// Note: Only for iOS the title's color can be changed.
|
||||||
|
button.setTitleColor(UIColor.systemGreen, for: [.normal])
|
||||||
|
button.setTitleColor(UIColor.systemRed, for: [.highlighted])
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureBackgroundButton(_ button: UIButton) {
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
/** To keep the look the same betwen iOS and macOS:
|
||||||
|
For setBackgroundImage to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
|
||||||
|
Available in macOS 12 or later (Mac Catalyst 15.0 or later).
|
||||||
|
Use this for controls that need to look the same between iOS and macOS.
|
||||||
|
*/
|
||||||
|
if traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
button.preferredBehavioralStyle = .pad
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
button.setBackgroundImage(UIImage(named: "background"), for: .normal)
|
||||||
|
button.setBackgroundImage(UIImage(named: "background_highlighted"), for: .highlighted)
|
||||||
|
button.setBackgroundImage(UIImage(named: "background_disabled"), for: .disabled)
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
// This handler is called when this button needs updating.
|
||||||
|
@available(iOS 15.0, *)
|
||||||
|
func configureUpdateActivityHandlerButton(_ button: UIButton) {
|
||||||
|
let activityUpdateHandler: (UIButton) -> Void = { button in
|
||||||
|
/// Shows an activity indicator in place of an image. Its placement is controlled by the `imagePlacement` property.
|
||||||
|
|
||||||
|
// Start with the current button's configuration.
|
||||||
|
var config = button.configuration
|
||||||
|
config?.showsActivityIndicator = button.isSelected ? false : true
|
||||||
|
button.configuration = config
|
||||||
|
}
|
||||||
|
|
||||||
|
var buttonConfig = UIButton.Configuration.plain()
|
||||||
|
buttonConfig.image = UIImage(systemName: "tray")
|
||||||
|
buttonConfig.preferredSymbolConfigurationForImage = UIImage.SymbolConfiguration(textStyle: .body)
|
||||||
|
button.configuration = buttonConfig
|
||||||
|
|
||||||
|
// Set the button's title and font.
|
||||||
|
button.setTitle(NSLocalizedString("Button", comment: ""), for: [])
|
||||||
|
button.titleLabel?.font = UIFont.preferredFont(forTextStyle: .body)
|
||||||
|
|
||||||
|
button.changesSelectionAsPrimaryAction = true // This turns on the toggle behavior.
|
||||||
|
button.configurationUpdateHandler = activityUpdateHandler
|
||||||
|
|
||||||
|
// For this button to include an activity indicator next to the title, keep the iPad behavior.
|
||||||
|
if traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
button.preferredBehavioralStyle = .pad
|
||||||
|
}
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.toggleButtonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 15.0, *)
|
||||||
|
func configureUpdateHandlerButton(_ button: UIButton) {
|
||||||
|
// This is called when a button needs an update.
|
||||||
|
let colorUpdateHandler: (UIButton) -> Void = { button in
|
||||||
|
button.configuration?.baseBackgroundColor = button.isSelected
|
||||||
|
? UIColor.systemPink.withAlphaComponent(0.4)
|
||||||
|
: UIColor.systemPink
|
||||||
|
}
|
||||||
|
|
||||||
|
let buttonConfig = UIButton.Configuration.filled()
|
||||||
|
button.configuration = buttonConfig
|
||||||
|
|
||||||
|
button.changesSelectionAsPrimaryAction = true // This turns on the toggle behavior.
|
||||||
|
button.configurationUpdateHandler = colorUpdateHandler
|
||||||
|
|
||||||
|
// For this button to use baseBackgroundColor for the visual toggle state, keep the iPad behavior.
|
||||||
|
if traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
button.preferredBehavioralStyle = .pad
|
||||||
|
}
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.toggleButtonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 15.0, *)
|
||||||
|
func configureUpdateImageHandlerButton(_ button: UIButton) {
|
||||||
|
// This is called when a button needs an update.
|
||||||
|
let colorUpdateHandler: (UIButton) -> Void = { button in
|
||||||
|
button.configuration?.image =
|
||||||
|
button.isSelected ? UIImage(systemName: "cart.fill") : UIImage(systemName: "cart")
|
||||||
|
button.toolTip =
|
||||||
|
button.isSelected ?
|
||||||
|
NSLocalizedString("CartFilledButtonToolTipTitle", comment: "") :
|
||||||
|
NSLocalizedString("CartEmptyButtonToolTipTitle", comment: "")
|
||||||
|
}
|
||||||
|
|
||||||
|
var buttonConfig = UIButton.Configuration.plain()
|
||||||
|
buttonConfig.image = UIImage(systemName: "cart")
|
||||||
|
buttonConfig.preferredSymbolConfigurationForImage = UIImage.SymbolConfiguration(textStyle: .largeTitle)
|
||||||
|
button.configuration = buttonConfig
|
||||||
|
|
||||||
|
button.changesSelectionAsPrimaryAction = true // This turns on the toggle behavior.
|
||||||
|
button.configurationUpdateHandler = colorUpdateHandler
|
||||||
|
|
||||||
|
// For this button to use the updateHandler to change it's icon for the visual toggle state, keep the iPad behavior.
|
||||||
|
if traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
button.preferredBehavioralStyle = .pad
|
||||||
|
}
|
||||||
|
|
||||||
|
button.setTitle("", for: []) // No title, just an image.
|
||||||
|
button.isSelected = false
|
||||||
|
|
||||||
|
button.addTarget(self, action: #selector(ButtonViewController.toggleButtonClicked(_:)), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Add To Cart Button
|
||||||
|
|
||||||
|
@available(iOS 15.0, *)
|
||||||
|
func toolTipInteraction(_ interaction: UIToolTipInteraction, configurationAt point: CGPoint) -> UIToolTipConfiguration? {
|
||||||
|
let formatString = NSLocalizedString("Cart Tooltip String",
|
||||||
|
comment: "Cart Tooltip String format to be found in Localizable.stringsdict")
|
||||||
|
let resultString = String.localizedStringWithFormat(formatString, cartItemCount)
|
||||||
|
return UIToolTipConfiguration(toolTip: resultString)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 15.0, *)
|
||||||
|
func addToCart(action: UIAction) {
|
||||||
|
cartItemCount = cartItemCount > 0 ? 0 : 12
|
||||||
|
if let button = action.sender as? UIButton {
|
||||||
|
button.setNeedsUpdateConfiguration()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 15.0, *)
|
||||||
|
func configureAddToCartButton(_ button: UIButton) {
|
||||||
|
var config = UIButton.Configuration.filled()
|
||||||
|
config.buttonSize = .large
|
||||||
|
config.image = UIImage(systemName: "cart.fill")
|
||||||
|
config.title = "Add to Cart"
|
||||||
|
config.cornerStyle = .capsule
|
||||||
|
config.baseBackgroundColor = UIColor.systemTeal
|
||||||
|
button.configuration = config
|
||||||
|
|
||||||
|
button.toolTip = "" // The value will be determined in its delegate.
|
||||||
|
button.toolTipInteraction?.delegate = self
|
||||||
|
|
||||||
|
button.addAction(UIAction(handler: addToCart(action:)), for: .touchUpInside)
|
||||||
|
|
||||||
|
// For this button to include subtitle and larger size, the behavioral style needs to be set to ".pad".
|
||||||
|
if traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
button.preferredBehavioralStyle = .pad
|
||||||
|
}
|
||||||
|
|
||||||
|
button.changesSelectionAsPrimaryAction = true // This turns on the toggle behavior.
|
||||||
|
|
||||||
|
// This handler is called when this button needs updating.
|
||||||
|
button.configurationUpdateHandler = {
|
||||||
|
[unowned self] button in
|
||||||
|
|
||||||
|
// Start with the current button's configuration.
|
||||||
|
var newConfig = button.configuration
|
||||||
|
|
||||||
|
if button.isSelected {
|
||||||
|
// The button was clicked or tapped.
|
||||||
|
newConfig?.image = cartItemCount > 0
|
||||||
|
? UIImage(systemName: "cart.fill.badge.plus")
|
||||||
|
: UIImage(systemName: "cart.badge.plus")
|
||||||
|
|
||||||
|
let formatString = NSLocalizedString("Cart Items String",
|
||||||
|
comment: "Cart Items String format to be found in Localizable.stringsdict")
|
||||||
|
let resultString = String.localizedStringWithFormat(formatString, cartItemCount)
|
||||||
|
newConfig?.subtitle = resultString
|
||||||
|
} else {
|
||||||
|
// As the button is highlighted (pressed), apply a temporary image and subtitle.
|
||||||
|
newConfig?.image = UIImage(systemName: "cart.fill")
|
||||||
|
newConfig?.subtitle = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
newConfig?.imagePadding = 8 // Add a litle more space between the icon and button title.
|
||||||
|
|
||||||
|
// Note: To change the padding between the title and subtitle, set "titlePadding".
|
||||||
|
// Note: To change the padding around the perimeter of the button, set "contentInsets".
|
||||||
|
|
||||||
|
button.configuration = newConfig
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Button Actions
|
||||||
|
|
||||||
|
@objc
|
||||||
|
func buttonClicked(_ sender: UIButton) {
|
||||||
|
Swift.debugPrint("Button was clicked.")
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc
|
||||||
|
func toggleButtonClicked(_ sender: UIButton) {
|
||||||
|
Swift.debugPrint("Toggle action: \(sender)")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -11,138 +11,146 @@ A view controller that demonstrates how to use `UIButton`.
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
class ButtonViewController: UITableViewController {
|
class ButtonViewController: BaseTableViewController {
|
||||||
|
|
||||||
|
// Cell identifier for each button table view cell.
|
||||||
|
enum ButtonKind: String, CaseIterable {
|
||||||
|
case buttonSystem
|
||||||
|
case buttonDetailDisclosure
|
||||||
|
case buttonSystemAddContact
|
||||||
|
case buttonClose
|
||||||
|
case buttonStyleGray
|
||||||
|
case buttonStyleTinted
|
||||||
|
case buttonStyleFilled
|
||||||
|
case buttonCornerStyle
|
||||||
|
case buttonToggle
|
||||||
|
case buttonTitleColor
|
||||||
|
case buttonImage
|
||||||
|
case buttonAttrText
|
||||||
|
case buttonSymbol
|
||||||
|
case buttonLargeSymbol
|
||||||
|
case buttonTextSymbol
|
||||||
|
case buttonSymbolText
|
||||||
|
case buttonMultiTitle
|
||||||
|
case buttonBackground
|
||||||
|
case addToCartButton
|
||||||
|
case buttonUpdateActivityHandler
|
||||||
|
case buttonUpdateHandler
|
||||||
|
case buttonImageUpdateHandler
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
|
|
||||||
@IBOutlet weak var systemTextButton: UIButton!
|
// "Add to Cart" Button
|
||||||
@IBOutlet weak var systemContactAddButton: UIButton!
|
var cartItemCount: Int = 0
|
||||||
@IBOutlet weak var systemDetailDisclosureButton: UIButton!
|
|
||||||
@IBOutlet weak var imageButton: UIButton!
|
|
||||||
@IBOutlet weak var attributedTextButton: UIButton!
|
|
||||||
@IBOutlet weak var symbolButton: UIButton!
|
|
||||||
@IBOutlet weak var symbolTextButton: UIButton!
|
|
||||||
@IBOutlet weak var menuButton: UIButton!
|
|
||||||
|
|
||||||
// MARK: - View Life Cycle
|
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
// All of the buttons are created in the storyboard, but configured below.
|
testCells.append(contentsOf: [
|
||||||
configureSystemTextButton()
|
CaseElement(title: NSLocalizedString("DefaultTitle", comment: ""),
|
||||||
configureSystemContactAddButton()
|
cellID: ButtonKind.buttonSystem.rawValue,
|
||||||
configureSystemDetailDisclosureButton()
|
configHandler: configureSystemTextButton),
|
||||||
configureImageButton()
|
CaseElement(title: NSLocalizedString("DetailDisclosureTitle", comment: ""),
|
||||||
configureAttributedTextSystemButton()
|
cellID: ButtonKind.buttonDetailDisclosure.rawValue,
|
||||||
configureSymbolButton()
|
configHandler: configureSystemDetailDisclosureButton),
|
||||||
configureSymbolTextButton()
|
CaseElement(title: NSLocalizedString("AddContactTitle", comment: ""),
|
||||||
configureMenuButton()
|
cellID: ButtonKind.buttonSystemAddContact.rawValue,
|
||||||
}
|
configHandler: configureSystemContactAddButton),
|
||||||
|
CaseElement(title: NSLocalizedString("CloseTitle", comment: ""),
|
||||||
|
cellID: ButtonKind.buttonClose.rawValue,
|
||||||
|
configHandler: configureCloseButton)
|
||||||
|
])
|
||||||
|
|
||||||
// MARK: - Configuration
|
if #available(iOS 15, *) {
|
||||||
|
// These button styles are available on iOS 15 or later.
|
||||||
func configureSystemTextButton() {
|
testCells.append(contentsOf: [
|
||||||
let buttonTitle = NSLocalizedString("Button", comment: "")
|
CaseElement(title: NSLocalizedString("GrayTitle", comment: ""),
|
||||||
|
cellID: ButtonKind.buttonStyleGray.rawValue,
|
||||||
systemTextButton.setTitle(buttonTitle, for: .normal)
|
configHandler: configureStyleGrayButton),
|
||||||
|
CaseElement(title: NSLocalizedString("TintedTitle", comment: ""),
|
||||||
systemTextButton.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
cellID: ButtonKind.buttonStyleTinted.rawValue,
|
||||||
}
|
configHandler: configureStyleTintedButton),
|
||||||
|
CaseElement(title: NSLocalizedString("FilledTitle", comment: ""),
|
||||||
func configureSystemContactAddButton() {
|
cellID: ButtonKind.buttonStyleFilled.rawValue,
|
||||||
systemContactAddButton.backgroundColor = UIColor.clear
|
configHandler: configureStyleFilledButton),
|
||||||
|
CaseElement(title: NSLocalizedString("CornerStyleTitle", comment: ""),
|
||||||
systemContactAddButton.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
cellID: ButtonKind.buttonCornerStyle.rawValue,
|
||||||
}
|
configHandler: configureCornerStyleButton),
|
||||||
|
CaseElement(title: NSLocalizedString("ToggleTitle", comment: ""),
|
||||||
func configureSystemDetailDisclosureButton() {
|
cellID: ButtonKind.buttonToggle.rawValue,
|
||||||
systemDetailDisclosureButton.backgroundColor = UIColor.clear
|
configHandler: configureToggleButton)
|
||||||
|
])
|
||||||
systemDetailDisclosureButton.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
|
||||||
}
|
|
||||||
|
|
||||||
func configureImageButton() {
|
|
||||||
// To create this button in code you can use `UIButton.init(type: .system)`.
|
|
||||||
|
|
||||||
// Set the tint color to the button's image.
|
|
||||||
if let image = UIImage(named: "x_icon") {
|
|
||||||
let imageButtonNormalImage = image.withTintColor(.systemPurple)
|
|
||||||
imageButton.setImage(imageButtonNormalImage, for: .normal)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add an accessibility label to the image.
|
if traitCollection.userInterfaceIdiom != .mac {
|
||||||
imageButton.accessibilityLabel = NSLocalizedString("X", comment: "")
|
// Colored button titles only on iOS.
|
||||||
|
testCells.append(contentsOf: [
|
||||||
imageButton.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
CaseElement(title: NSLocalizedString("ButtonColorTitle", comment: ""),
|
||||||
}
|
cellID: ButtonKind.buttonTitleColor.rawValue,
|
||||||
|
configHandler: configureTitleTextButton)
|
||||||
func configureAttributedTextSystemButton() {
|
])
|
||||||
let buttonTitle = NSLocalizedString("Button", comment: "")
|
}
|
||||||
|
|
||||||
// Set the button's title for normal state.
|
testCells.append(contentsOf: [
|
||||||
let normalTitleAttributes: [NSAttributedString.Key: Any] = [
|
CaseElement(title: NSLocalizedString("ImageTitle", comment: ""),
|
||||||
NSAttributedString.Key.strikethroughStyle: NSUnderlineStyle.single.rawValue
|
cellID: ButtonKind.buttonImage.rawValue,
|
||||||
]
|
configHandler: configureImageButton),
|
||||||
|
CaseElement(title: NSLocalizedString("AttributedStringTitle", comment: ""),
|
||||||
let normalAttributedTitle = NSAttributedString(string: buttonTitle, attributes: normalTitleAttributes)
|
cellID: ButtonKind.buttonAttrText.rawValue,
|
||||||
attributedTextButton.setAttributedTitle(normalAttributedTitle, for: .normal)
|
configHandler: configureAttributedTextSystemButton),
|
||||||
|
CaseElement(title: NSLocalizedString("SymbolTitle", comment: ""),
|
||||||
// Set the button's title for highlighted state.
|
cellID: ButtonKind.buttonSymbol.rawValue,
|
||||||
let highlightedTitleAttributes: [NSAttributedString.Key: Any] = [
|
configHandler: configureSymbolButton)
|
||||||
NSAttributedString.Key.foregroundColor: UIColor.systemGreen,
|
])
|
||||||
NSAttributedString.Key.strikethroughStyle: NSUnderlineStyle.thick.rawValue
|
|
||||||
]
|
if #available(iOS 15, *) {
|
||||||
let highlightedAttributedTitle = NSAttributedString(string: buttonTitle, attributes: highlightedTitleAttributes)
|
// This case uses UIButtonConfiguration which is available on iOS 15 or later.
|
||||||
attributedTextButton.setAttributedTitle(highlightedAttributedTitle, for: .highlighted)
|
if traitCollection.userInterfaceIdiom != .mac {
|
||||||
|
// UIButtonConfiguration for large images available only on iOS.
|
||||||
attributedTextButton.addTarget(self, action: #selector(ButtonViewController.buttonClicked(_:)), for: .touchUpInside)
|
testCells.append(contentsOf: [
|
||||||
}
|
CaseElement(title: NSLocalizedString("LargeSymbolTitle", comment: ""),
|
||||||
|
cellID: ButtonKind.buttonLargeSymbol.rawValue,
|
||||||
func configureSymbolButton() {
|
configHandler: configureLargeSymbolButton)
|
||||||
let buttonImage = UIImage(systemName: "person")
|
])
|
||||||
symbolButton.setImage(buttonImage, for: .normal)
|
}
|
||||||
|
}
|
||||||
// Add an accessibility label to the image.
|
|
||||||
symbolButton.accessibilityLabel = NSLocalizedString("Person", comment: "")
|
if #available(iOS 15, *) {
|
||||||
|
testCells.append(contentsOf: [
|
||||||
symbolButton.addTarget(self,
|
CaseElement(title: NSLocalizedString("StringSymbolTitle", comment: ""),
|
||||||
action: #selector(ButtonViewController.buttonClicked(_:)),
|
cellID: ButtonKind.buttonTextSymbol.rawValue,
|
||||||
for: .touchUpInside)
|
configHandler: configureTextSymbolButton),
|
||||||
}
|
CaseElement(title: NSLocalizedString("SymbolStringTitle", comment: ""),
|
||||||
|
cellID: ButtonKind.buttonSymbolText.rawValue,
|
||||||
func configureSymbolTextButton() {
|
configHandler: configureSymbolTextButton),
|
||||||
let buttonImage = UIImage(systemName: "person")
|
|
||||||
symbolTextButton.setImage(buttonImage, for: .normal)
|
CaseElement(title: NSLocalizedString("BackgroundTitle", comment: ""),
|
||||||
|
cellID: ButtonKind.buttonBackground.rawValue,
|
||||||
symbolTextButton.addTarget(self,
|
configHandler: configureBackgroundButton),
|
||||||
action: #selector(ButtonViewController.buttonClicked(_:)),
|
|
||||||
for: .touchUpInside)
|
// Multi-title button: title for normal and highlight state, setTitle(.highlighted) is for iOS 15 and later.
|
||||||
|
CaseElement(title: NSLocalizedString("MultiTitleTitle", comment: ""),
|
||||||
symbolTextButton.titleLabel?.font = UIFont.preferredFont(forTextStyle: .body)
|
cellID: ButtonKind.buttonMultiTitle.rawValue,
|
||||||
let config = UIImage.SymbolConfiguration(textStyle: .body, scale: .small)
|
configHandler: configureMultiTitleButton),
|
||||||
symbolTextButton.setPreferredSymbolConfiguration(config, forImageIn: .normal)
|
|
||||||
}
|
// Various button effects done to the addToCartButton are available only on iOS 15 or later.
|
||||||
|
CaseElement(title: NSLocalizedString("AddToCartTitle", comment: ""),
|
||||||
func menuHandler(action: UIAction) {
|
cellID: ButtonKind.addToCartButton.rawValue,
|
||||||
Swift.debugPrint("Menu Action '\(action.title)'")
|
configHandler: configureAddToCartButton),
|
||||||
}
|
|
||||||
|
// UIButtonConfiguration with updateHandlers is available only on iOS 15 or later.
|
||||||
func configureMenuButton() {
|
CaseElement(title: NSLocalizedString("UpdateActivityHandlerTitle", comment: ""),
|
||||||
let buttonTitle = NSLocalizedString("Button", comment: "")
|
cellID: ButtonKind.buttonUpdateActivityHandler.rawValue,
|
||||||
menuButton.setTitle(buttonTitle, for: .normal)
|
configHandler: configureUpdateActivityHandlerButton),
|
||||||
|
CaseElement(title: NSLocalizedString("UpdateHandlerTitle", comment: ""),
|
||||||
let items = (1...5).map {
|
cellID: ButtonKind.buttonUpdateHandler.rawValue,
|
||||||
UIAction(title: String(format: NSLocalizedString("ItemTitle", comment: ""), $0.description), handler: menuHandler)
|
configHandler: configureUpdateHandlerButton),
|
||||||
|
CaseElement(title: NSLocalizedString("UpdateImageHandlerTitle", comment: ""),
|
||||||
|
cellID: ButtonKind.buttonImageUpdateHandler.rawValue,
|
||||||
|
configHandler: configureUpdateImageHandlerButton)
|
||||||
|
])
|
||||||
}
|
}
|
||||||
menuButton.menu = UIMenu(title: NSLocalizedString("ChooseItemTitle", comment: ""), children: items)
|
|
||||||
menuButton.showsMenuAsPrimaryAction = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Actions
|
|
||||||
|
|
||||||
@objc
|
|
||||||
func buttonClicked(_ sender: UIButton) {
|
|
||||||
print("A button was clicked: \(sender).")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
29
UIKitCatalog/CaseElement.swift
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
See LICENSE folder for this sample’s licensing information.
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
Test case element that serves our UITableViewCells.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
struct CaseElement {
|
||||||
|
var title: String // Visual title of the cell (table section header title)
|
||||||
|
var cellID: String // Table view cell's identifier for searching for the cell within the nib file.
|
||||||
|
|
||||||
|
typealias ConfigurationClosure = (UIView) -> Void
|
||||||
|
var configHandler: ConfigurationClosure // Configuration handler for setting up the cell's subview.
|
||||||
|
|
||||||
|
init<V: UIView>(title: String, cellID: String, configHandler: @escaping (V) -> Void) {
|
||||||
|
self.title = title
|
||||||
|
self.cellID = cellID
|
||||||
|
self.configHandler = { view in
|
||||||
|
guard let view = view as? V else { fatalError("Impossible") }
|
||||||
|
configHandler(view)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func targetView(_ cell: UITableViewCell?) -> UIView? {
|
||||||
|
return cell != nil ? cell!.contentView.subviews[0] : nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -28,13 +28,14 @@ class ColorPickerViewController: UIViewController, UIColorPickerViewControllerDe
|
||||||
configureColorWell()
|
configureColorWell()
|
||||||
|
|
||||||
// For iOS, the picker button in the main view is not used, the color picker is presented from the navigation bar.
|
// For iOS, the picker button in the main view is not used, the color picker is presented from the navigation bar.
|
||||||
if navigationController!.traitCollection.userInterfaceIdiom != .mac {
|
if navigationController?.traitCollection.userInterfaceIdiom != .mac {
|
||||||
pickerButton.isHidden = true
|
pickerButton.isHidden = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - UIColorWell
|
// MARK: - UIColorWell
|
||||||
|
|
||||||
|
// Update the color view from the color well chosen action.
|
||||||
func colorWellHandler(action: UIAction) {
|
func colorWellHandler(action: UIAction) {
|
||||||
if let colorWell = action.sender as? UIColorWell {
|
if let colorWell = action.sender as? UIColorWell {
|
||||||
colorView.backgroundColor = colorWell.selectedColor
|
colorView.backgroundColor = colorWell.selectedColor
|
||||||
|
|
@ -48,11 +49,10 @@ class ColorPickerViewController: UIViewController, UIColorPickerViewControllerDe
|
||||||
*/
|
*/
|
||||||
let colorWellAction = UIAction(title: "", handler: colorWellHandler)
|
let colorWellAction = UIAction(title: "", handler: colorWellHandler)
|
||||||
colorWell =
|
colorWell =
|
||||||
UIColorWell(frame: CGRect(x: 0, y: 0, width: 32, height: 32),
|
UIColorWell(frame: CGRect(x: 0, y: 0, width: 32, height: 32), primaryAction: colorWellAction)
|
||||||
primaryAction: colorWellAction)
|
|
||||||
|
|
||||||
// For Mac Catalyst, the UIColorWell is placed in the main view.
|
// For Mac Catalyst, the UIColorWell is placed in the main view.
|
||||||
if navigationController!.traitCollection.userInterfaceIdiom == .mac {
|
if navigationController?.traitCollection.userInterfaceIdiom == .mac {
|
||||||
pickerWellView.addSubview(colorWell)
|
pickerWellView.addSubview(colorWell)
|
||||||
} else {
|
} else {
|
||||||
// For iOS, the UIColorWell is placed inside the navigation bar as a UIBarButtonItem.
|
// For iOS, the UIColorWell is placed inside the navigation bar as a UIBarButtonItem.
|
||||||
|
|
@ -75,7 +75,7 @@ class ColorPickerViewController: UIViewController, UIColorPickerViewControllerDe
|
||||||
// Present the color picker from the UIBarButtonItem, iOS only.
|
// Present the color picker from the UIBarButtonItem, iOS only.
|
||||||
// This will present it as a popover (preferred), or for compact mode as a modal sheet.
|
// This will present it as a popover (preferred), or for compact mode as a modal sheet.
|
||||||
@IBAction func presentColorPickerByBarButton(_ sender: UIBarButtonItem) {
|
@IBAction func presentColorPickerByBarButton(_ sender: UIBarButtonItem) {
|
||||||
colorPicker.modalPresentationStyle = UIModalPresentationStyle.popover
|
colorPicker.modalPresentationStyle = UIModalPresentationStyle.popover // will display as popover for iPad or sheet for compact screens.
|
||||||
let popover: UIPopoverPresentationController = colorPicker.popoverPresentationController!
|
let popover: UIPopoverPresentationController = colorPicker.popoverPresentationController!
|
||||||
popover.barButtonItem = sender
|
popover.barButtonItem = sender
|
||||||
present(colorPicker, animated: true, completion: nil)
|
present(colorPicker, animated: true, completion: nil)
|
||||||
|
|
@ -85,19 +85,53 @@ class ColorPickerViewController: UIViewController, UIColorPickerViewControllerDe
|
||||||
// This will present it as a popover (preferred), or for compact mode as a modal sheet.
|
// This will present it as a popover (preferred), or for compact mode as a modal sheet.
|
||||||
@IBAction func presentColorPickerByButton(_ sender: UIButton) {
|
@IBAction func presentColorPickerByButton(_ sender: UIButton) {
|
||||||
colorPicker.modalPresentationStyle = UIModalPresentationStyle.popover
|
colorPicker.modalPresentationStyle = UIModalPresentationStyle.popover
|
||||||
let popover: UIPopoverPresentationController = colorPicker.popoverPresentationController!
|
if let popover = colorPicker.popoverPresentationController {
|
||||||
popover.sourceView = sender
|
popover.sourceView = sender
|
||||||
present(colorPicker, animated: true, completion: nil)
|
present(colorPicker, animated: true, completion: nil)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - UIColorPickerViewControllerDelegate
|
// MARK: - UIColorPickerViewControllerDelegate
|
||||||
|
|
||||||
|
// Color returned from the color picker via UIBarButtonItem - iOS 15.0
|
||||||
|
@available(iOS 15.0, *)
|
||||||
|
func colorPickerViewController(_ viewController: UIColorPickerViewController, didSelect color: UIColor, continuously: Bool) {
|
||||||
|
// User has chosen a color.
|
||||||
|
let chosenColor = viewController.selectedColor
|
||||||
|
colorView.backgroundColor = chosenColor
|
||||||
|
|
||||||
|
// Dismiss the color picker if the conditions are right:
|
||||||
|
// 1) User is not doing a continous pick (tap and drag across multiple colors).
|
||||||
|
// 2) Picker is presented on a non-compact device.
|
||||||
|
//
|
||||||
|
// Use the following check to determine how the color picker was presented (modal or popover).
|
||||||
|
// For popover, we want to dismiss it when a color is locked.
|
||||||
|
// For modal, the picker has a close button.
|
||||||
|
//
|
||||||
|
if !continuously {
|
||||||
|
if traitCollection.horizontalSizeClass != .compact {
|
||||||
|
viewController.dismiss(animated: true, completion: {
|
||||||
|
Swift.debugPrint("\(chosenColor)")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Color returned from the color picker - iOS 14.x and earlier.
|
||||||
func colorPickerViewControllerDidSelectColor(_ viewController: UIColorPickerViewController) {
|
func colorPickerViewControllerDidSelectColor(_ viewController: UIColorPickerViewController) {
|
||||||
// User has chosen a color.
|
// User has chosen a color.
|
||||||
let chosenColor = viewController.selectedColor
|
let chosenColor = viewController.selectedColor
|
||||||
colorView.backgroundColor = chosenColor
|
colorView.backgroundColor = chosenColor
|
||||||
|
|
||||||
Swift.debugPrint("\(chosenColor)")
|
// Use the following check to determine how the color picker was presented (modal or popover).
|
||||||
|
// For popover, we want to dismiss it when a color is locked.
|
||||||
|
// For modal, the picker has a close button.
|
||||||
|
//
|
||||||
|
if traitCollection.horizontalSizeClass != .compact {
|
||||||
|
viewController.dismiss(animated: true, completion: {
|
||||||
|
Swift.debugPrint("\(chosenColor)")
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
|
func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
|
||||||
|
|
@ -108,16 +142,3 @@ class ColorPickerViewController: UIViewController, UIColorPickerViewControllerDe
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension UIColor {
|
|
||||||
var colorComponents: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)? {
|
|
||||||
guard let components = self.cgColor.components else { return nil }
|
|
||||||
|
|
||||||
return (
|
|
||||||
red: components[0],
|
|
||||||
green: components[1],
|
|
||||||
blue: components[2],
|
|
||||||
alpha: components[3]
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ class CustomPageControlViewController: UIViewController {
|
||||||
@objc
|
@objc
|
||||||
func pageControlValueDidChange() {
|
func pageControlValueDidChange() {
|
||||||
// Note: gesture swiping between pages is provided by `UIPageViewController` and not `UIPageControl`.
|
// Note: gesture swiping between pages is provided by `UIPageViewController` and not `UIPageControl`.
|
||||||
print("The page control changed its current page to \(pageControl.currentPage).")
|
Swift.debugPrint("The page control changed its current page to \(pageControl.currentPage).")
|
||||||
|
|
||||||
colorView.backgroundColor = colors[pageControl.currentPage]
|
colorView.backgroundColor = colors[pageControl.currentPage]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,19 +43,19 @@ class CustomSearchBarViewController: UIViewController {
|
||||||
|
|
||||||
extension CustomSearchBarViewController: UISearchBarDelegate {
|
extension CustomSearchBarViewController: UISearchBarDelegate {
|
||||||
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
|
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
|
||||||
print("The custom search bar keyboard \"Search\" button was tapped.")
|
Swift.debugPrint("The custom search bar keyboard \"Search\" button was tapped.")
|
||||||
|
|
||||||
searchBar.resignFirstResponder()
|
searchBar.resignFirstResponder()
|
||||||
}
|
}
|
||||||
|
|
||||||
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
|
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
|
||||||
print("The custom search bar \"Cancel\" button was tapped.")
|
Swift.debugPrint("The custom search bar \"Cancel\" button was tapped.")
|
||||||
|
|
||||||
searchBar.resignFirstResponder()
|
searchBar.resignFirstResponder()
|
||||||
}
|
}
|
||||||
|
|
||||||
func searchBarBookmarkButtonClicked(_ searchBar: UISearchBar) {
|
func searchBarBookmarkButtonClicked(_ searchBar: UISearchBar) {
|
||||||
print("The custom \"bookmark button\" inside the search bar was tapped.")
|
Swift.debugPrint("The custom \"bookmark button\" inside the search bar was tapped.")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ class CustomToolbarViewController: UIViewController {
|
||||||
let attributes = [
|
let attributes = [
|
||||||
NSAttributedString.Key.foregroundColor: UIColor.systemPurple
|
NSAttributedString.Key.foregroundColor: UIColor.systemPurple
|
||||||
]
|
]
|
||||||
barButtonItem.setTitleTextAttributes(attributes, for: .normal)
|
barButtonItem.setTitleTextAttributes(attributes, for: [])
|
||||||
|
|
||||||
return barButtonItem
|
return barButtonItem
|
||||||
}
|
}
|
||||||
|
|
@ -66,7 +66,7 @@ class CustomToolbarViewController: UIViewController {
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func barButtonItemClicked(_ barButtonItem: UIBarButtonItem) {
|
func barButtonItemClicked(_ barButtonItem: UIBarButtonItem) {
|
||||||
print("A bar button item on the custom toolbar was clicked: \(barButtonItem).")
|
Swift.debugPrint("A bar button item on the custom toolbar was clicked: \(barButtonItem).")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,12 @@ class DatePickerController: UIViewController {
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
// In case the label's content is too large to fit inside the label (causing truncation),
|
||||||
|
// use this to reveal the label's full text drawn as a tool tip.
|
||||||
|
dateLabel.showsExpansionTextWhenTruncated = true
|
||||||
|
}
|
||||||
|
|
||||||
configureDatePicker()
|
configureDatePicker()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ class PageControlViewController: UIViewController {
|
||||||
@objc
|
@objc
|
||||||
func pageControlValueDidChange() {
|
func pageControlValueDidChange() {
|
||||||
// Note: gesture swiping between pages is provided by `UIPageViewController` and not `UIPageControl`.
|
// Note: gesture swiping between pages is provided by `UIPageViewController` and not `UIPageControl`.
|
||||||
print("The page control changed its current page to \(pageControl.currentPage).")
|
Swift.debugPrint("The page control changed its current page to \(pageControl.currentPage).")
|
||||||
|
|
||||||
colorView.backgroundColor = colors[pageControl.currentPage]
|
colorView.backgroundColor = colors[pageControl.currentPage]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -38,17 +38,17 @@ class DefaultSearchBarViewController: UIViewController {
|
||||||
|
|
||||||
extension DefaultSearchBarViewController: UISearchBarDelegate {
|
extension DefaultSearchBarViewController: UISearchBarDelegate {
|
||||||
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
|
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
|
||||||
print("The default search selected scope button index changed to \(selectedScope).")
|
Swift.debugPrint("The default search selected scope button index changed to \(selectedScope).")
|
||||||
}
|
}
|
||||||
|
|
||||||
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
|
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
|
||||||
print("The default search bar keyboard search button was tapped: \(String(describing: searchBar.text)).")
|
Swift.debugPrint("The default search bar keyboard search button was tapped: \(String(describing: searchBar.text)).")
|
||||||
|
|
||||||
searchBar.resignFirstResponder()
|
searchBar.resignFirstResponder()
|
||||||
}
|
}
|
||||||
|
|
||||||
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
|
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
|
||||||
print("The default search bar cancel button was tapped.")
|
Swift.debugPrint("The default search bar cancel button was tapped.")
|
||||||
|
|
||||||
searchBar.resignFirstResponder()
|
searchBar.resignFirstResponder()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,6 @@ class DefaultToolbarViewController: UIViewController {
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func barButtonItemClicked(_ barButtonItem: UIBarButtonItem) {
|
func barButtonItemClicked(_ barButtonItem: UIBarButtonItem) {
|
||||||
print("A bar button item on the default toolbar was clicked: \(barButtonItem).")
|
Swift.debugPrint("A bar button item on the default toolbar was clicked: \(barButtonItem).")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,10 +26,10 @@ class FontPickerViewController: UIViewController {
|
||||||
|
|
||||||
configureFontPicker()
|
configureFontPicker()
|
||||||
|
|
||||||
#if !targetEnvironment(macCatalyst)
|
if traitCollection.userInterfaceIdiom != .mac {
|
||||||
// UITextFormattingCoordinator's toggleFontPanel is available only for macOS.
|
// UITextFormattingCoordinator's toggleFontPanel is available only for macOS.
|
||||||
textFormatterButton.isHidden = true
|
textFormatterButton.isHidden = true
|
||||||
#endif
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func viewDidAppear(_ animated: Bool) {
|
override func viewDidAppear(_ animated: Bool) {
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,13 @@ class ImageViewController: UIViewController {
|
||||||
|
|
||||||
imageView.isAccessibilityElement = true
|
imageView.isAccessibilityElement = true
|
||||||
imageView.accessibilityLabel = NSLocalizedString("Animated", comment: "")
|
imageView.accessibilityLabel = NSLocalizedString("Animated", comment: "")
|
||||||
|
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
// This case uses UIToolTipInteraction which is available on iOS 15 or later.
|
||||||
|
let interaction =
|
||||||
|
UIToolTipInteraction(defaultToolTip: NSLocalizedString("ImageToolTipTitle", comment: ""))
|
||||||
|
imageView.addInteraction(interaction)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
184
UIKitCatalog/MenuButtonViewController.swift
Executable file
|
|
@ -0,0 +1,184 @@
|
||||||
|
/*
|
||||||
|
See LICENSE folder for this sample’s licensing information.
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
A view controller that demonstrates how to attach menus to `UIButton`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
class MenuButtonViewController: BaseTableViewController {
|
||||||
|
|
||||||
|
// Cell identifier for each menu button table view cell.
|
||||||
|
enum MenuButtonKind: String, CaseIterable {
|
||||||
|
case buttonMenuProgrammatic
|
||||||
|
case buttonMenuMultiAction
|
||||||
|
case buttonSubMenu
|
||||||
|
case buttonMenuSelection
|
||||||
|
}
|
||||||
|
|
||||||
|
override func viewDidLoad() {
|
||||||
|
super.viewDidLoad()
|
||||||
|
|
||||||
|
testCells.append(contentsOf: [
|
||||||
|
CaseElement(title: NSLocalizedString("DropDownProgTitle", comment: ""),
|
||||||
|
cellID: MenuButtonKind.buttonMenuProgrammatic.rawValue,
|
||||||
|
configHandler: configureDropDownProgrammaticButton),
|
||||||
|
CaseElement(title: NSLocalizedString("DropDownMultiActionTitle", comment: ""),
|
||||||
|
cellID: MenuButtonKind.buttonMenuMultiAction.rawValue,
|
||||||
|
configHandler: configureDropdownMultiActionButton),
|
||||||
|
CaseElement(title: NSLocalizedString("DropDownButtonSubMenuTitle", comment: ""),
|
||||||
|
cellID: MenuButtonKind.buttonSubMenu.rawValue,
|
||||||
|
configHandler: configureDropdownSubMenuButton),
|
||||||
|
CaseElement(title: NSLocalizedString("PopupSelection", comment: ""),
|
||||||
|
cellID: MenuButtonKind.buttonMenuSelection.rawValue,
|
||||||
|
configHandler: configureSelectionPopupButton)
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Handlers
|
||||||
|
|
||||||
|
enum ButtonMenuActionIdentifiers: String {
|
||||||
|
case item1
|
||||||
|
case item2
|
||||||
|
case item3
|
||||||
|
}
|
||||||
|
func menuHandler(action: UIAction) {
|
||||||
|
switch action.identifier.rawValue {
|
||||||
|
case ButtonMenuActionIdentifiers.item1.rawValue:
|
||||||
|
Swift.debugPrint("Menu Action: item 1")
|
||||||
|
case ButtonMenuActionIdentifiers.item2.rawValue:
|
||||||
|
Swift.debugPrint("Menu Action: item 2")
|
||||||
|
case ButtonMenuActionIdentifiers.item3.rawValue:
|
||||||
|
Swift.debugPrint("Menu Action: item 3")
|
||||||
|
default: break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func item4Handler(action: UIAction) {
|
||||||
|
Swift.debugPrint("Menu Action: \(action.title)")
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Drop Down Menu Buttons
|
||||||
|
|
||||||
|
func configureDropDownProgrammaticButton(button: UIButton) {
|
||||||
|
button.menu = UIMenu(children: [
|
||||||
|
UIAction(title: String(format: NSLocalizedString("ItemTitle", comment: ""), "1"),
|
||||||
|
identifier: UIAction.Identifier(ButtonMenuActionIdentifiers.item1.rawValue),
|
||||||
|
handler: menuHandler),
|
||||||
|
UIAction(title: String(format: NSLocalizedString("ItemTitle", comment: ""), "2"),
|
||||||
|
identifier: UIAction.Identifier(ButtonMenuActionIdentifiers.item2.rawValue),
|
||||||
|
handler: menuHandler)
|
||||||
|
])
|
||||||
|
|
||||||
|
button.showsMenuAsPrimaryAction = true
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureDropdownMultiActionButton(button: UIButton) {
|
||||||
|
let buttonMenu = UIMenu(children: [
|
||||||
|
// Share a single handler for the first 3 actions.
|
||||||
|
UIAction(title: String(format: NSLocalizedString("ItemTitle", comment: ""), "1"),
|
||||||
|
image: UIImage(systemName: "1.circle"),
|
||||||
|
identifier: UIAction.Identifier(ButtonMenuActionIdentifiers.item1.rawValue),
|
||||||
|
attributes: [],
|
||||||
|
handler: menuHandler),
|
||||||
|
UIAction(title: String(format: NSLocalizedString("ItemTitle", comment: ""), "2"),
|
||||||
|
image: UIImage(systemName: "2.circle"),
|
||||||
|
identifier: UIAction.Identifier(ButtonMenuActionIdentifiers.item2.rawValue),
|
||||||
|
handler: menuHandler),
|
||||||
|
UIAction(title: String(format: NSLocalizedString("ItemTitle", comment: ""), "3"),
|
||||||
|
image: UIImage(systemName: "3.circle"),
|
||||||
|
identifier: UIAction.Identifier(ButtonMenuActionIdentifiers.item3.rawValue),
|
||||||
|
handler: menuHandler),
|
||||||
|
|
||||||
|
// Use a separate handler for this 4th action.
|
||||||
|
UIAction(title: String(format: NSLocalizedString("ItemTitle", comment: ""), "4"),
|
||||||
|
image: UIImage(systemName: "4.circle"),
|
||||||
|
identifier: nil,
|
||||||
|
handler: item4Handler(action:)),
|
||||||
|
|
||||||
|
// Use a closure for the 5th action.
|
||||||
|
UIAction(title: String(format: NSLocalizedString("ItemTitle", comment: ""), "5"),
|
||||||
|
image: UIImage(systemName: "5.circle"),
|
||||||
|
identifier: nil) { action in
|
||||||
|
Swift.debugPrint("Menu Action: \(action.title)")
|
||||||
|
},
|
||||||
|
|
||||||
|
// Use attributes to make the 6th action disabled.
|
||||||
|
UIAction(title: String(format: NSLocalizedString("ItemTitle", comment: ""), "6"),
|
||||||
|
image: UIImage(systemName: "6.circle"),
|
||||||
|
identifier: nil,
|
||||||
|
attributes: [UIMenuElement.Attributes.disabled]) { action in
|
||||||
|
Swift.debugPrint("Menu Action: \(action.title)")
|
||||||
|
}
|
||||||
|
])
|
||||||
|
button.menu = buttonMenu
|
||||||
|
|
||||||
|
// This makes the button behave like a drop down menu.
|
||||||
|
button.showsMenuAsPrimaryAction = true
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureDropdownSubMenuButton(button: UIButton) {
|
||||||
|
let sortClosure = { (action: UIAction) in
|
||||||
|
Swift.debugPrint("Sort by: \(action.title)")
|
||||||
|
}
|
||||||
|
let refreshClosure = { (action: UIAction) in
|
||||||
|
Swift.debugPrint("Refresh handler")
|
||||||
|
}
|
||||||
|
let accountHandler = { (action: UIAction) in
|
||||||
|
Swift.debugPrint("Account handler")
|
||||||
|
}
|
||||||
|
|
||||||
|
var sortMenu: UIMenu
|
||||||
|
if #available(iOS 15, *) { // .singleSelection option only on iOS 15 or later
|
||||||
|
// The sort sub menu supports a selection.
|
||||||
|
sortMenu = UIMenu(title: "Sort By", options: .singleSelection, children: [
|
||||||
|
UIAction(title: "Date", state: .on, handler: sortClosure),
|
||||||
|
UIAction(title: "Size", handler: sortClosure)
|
||||||
|
])
|
||||||
|
} else {
|
||||||
|
sortMenu = UIMenu(title: "Sort By", children: [
|
||||||
|
UIAction(title: "Date", handler: sortClosure),
|
||||||
|
UIAction(title: "Size", handler: sortClosure)
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
let topMenu = UIMenu(children: [
|
||||||
|
UIAction(title: "Refresh", handler: refreshClosure),
|
||||||
|
UIAction(title: "Account", handler: accountHandler),
|
||||||
|
sortMenu
|
||||||
|
])
|
||||||
|
|
||||||
|
// This makes the button behave like a drop down menu.
|
||||||
|
button.showsMenuAsPrimaryAction = true
|
||||||
|
button.menu = topMenu
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Selection Popup Menu Button
|
||||||
|
|
||||||
|
func updateColor(_ title: String) {
|
||||||
|
Swift.debugPrint("Color selected: \(title)")
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureSelectionPopupButton(button: UIButton) {
|
||||||
|
let colorClosure = { [unowned self] (action: UIAction) in
|
||||||
|
self.updateColor(action.title)
|
||||||
|
}
|
||||||
|
|
||||||
|
button.menu = UIMenu(children: [
|
||||||
|
UIAction(title: "Red", handler: colorClosure),
|
||||||
|
UIAction(title: "Green", state: .on, handler: colorClosure), // The default selected item (green).
|
||||||
|
UIAction(title: "Blue", handler: colorClosure)
|
||||||
|
])
|
||||||
|
|
||||||
|
// This makes the button behave like a drop down menu.
|
||||||
|
button.showsMenuAsPrimaryAction = true
|
||||||
|
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
button.changesSelectionAsPrimaryAction = true
|
||||||
|
// Select the default menu item (green).
|
||||||
|
updateColor((button.menu?.selectedElements.first!.title)!)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -39,6 +39,8 @@ class OutlineViewController: UIViewController {
|
||||||
var dataSource: UICollectionViewDiffableDataSource<Section, OutlineItem>! = nil
|
var dataSource: UICollectionViewDiffableDataSource<Section, OutlineItem>! = nil
|
||||||
var outlineCollectionView: UICollectionView! = nil
|
var outlineCollectionView: UICollectionView! = nil
|
||||||
|
|
||||||
|
private var detailTargetChangeObserver: Any? = nil
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
|
|
@ -49,51 +51,67 @@ class OutlineViewController: UIViewController {
|
||||||
splitViewController!.primaryBackgroundStyle = .sidebar
|
splitViewController!.primaryBackgroundStyle = .sidebar
|
||||||
view.backgroundColor = UIColor.clear
|
view.backgroundColor = UIColor.clear
|
||||||
|
|
||||||
// Listen for when a split view controller is expanded or collapsed.
|
// Listen for when the split view controller is expanded or collapsed for iPad multi-tasking,
|
||||||
NotificationCenter.default.addObserver(
|
// and on device rotate (iPhones that support regular size class).
|
||||||
self,
|
detailTargetChangeObserver =
|
||||||
selector: #selector(showDetailTargetDidChange(_:)),
|
NotificationCenter.default.addObserver(forName: UIViewController.showDetailTargetDidChangeNotification,
|
||||||
name: UIViewController.showDetailTargetDidChangeNotification,
|
object: nil,
|
||||||
object: nil)
|
queue: OperationQueue.main,
|
||||||
|
using: { _ in
|
||||||
|
// Posted when a split view controller is expanded or collapsed.
|
||||||
|
|
||||||
|
// Re-load the data source, the disclosure indicators need to change (push vs. present on a cell).
|
||||||
|
var snapshot = self.dataSource.snapshot()
|
||||||
|
snapshot.reloadItems(self.menuItems)
|
||||||
|
self.dataSource.apply(snapshot, animatingDifferences: false)
|
||||||
|
})
|
||||||
|
|
||||||
if navigationController!.traitCollection.userInterfaceIdiom == .mac {
|
if navigationController!.traitCollection.userInterfaceIdiom == .mac {
|
||||||
navigationController!.navigationBar.isHidden = true
|
navigationController!.navigationBar.isHidden = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Posted when a split view controller is expanded or collapsed.
|
|
||||||
@objc
|
|
||||||
func showDetailTargetDidChange(_ notification: NSNotification) {
|
|
||||||
// Reaload the data source, the disclosure indicators need to change (push vs. present on a cell).
|
|
||||||
var snapshot = dataSource.snapshot()
|
|
||||||
snapshot.reloadItems(menuItems)
|
|
||||||
dataSource.apply(snapshot, animatingDifferences: false)
|
|
||||||
}
|
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
NotificationCenter.default.removeObserver(self, name: UIViewController.showDetailTargetDidChangeNotification, object: nil)
|
if let observer = detailTargetChangeObserver {
|
||||||
|
NotificationCenter.default.removeObserver(observer)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lazy var controlsOutlineItem: OutlineItem = {
|
lazy var controlsOutlineItem: OutlineItem = {
|
||||||
var controlsSubItems = [
|
|
||||||
OutlineItem(title: NSLocalizedString("ButtonsTitle", comment: ""), imageName: nil,
|
|
||||||
storyboardName: "ButtonViewController"),
|
|
||||||
|
|
||||||
OutlineItem(title: NSLocalizedString("PageControlTitle", comment: ""), imageName: nil, subitems: [
|
// Determine the content of the UIButton grouping.
|
||||||
|
var buttonItems = [
|
||||||
|
OutlineItem(title: NSLocalizedString("ButtonsTitle", comment: ""), imageName: "rectangle",
|
||||||
|
storyboardName: "ButtonViewController"),
|
||||||
|
OutlineItem(title: NSLocalizedString("MenuButtonsTitle", comment: ""), imageName: "list.bullet.rectangle",
|
||||||
|
storyboardName: "MenuButtonViewController")
|
||||||
|
]
|
||||||
|
// UIPointerInteraction to UIButtons is applied for iPad.
|
||||||
|
if navigationController!.traitCollection.userInterfaceIdiom == .pad {
|
||||||
|
buttonItems.append(contentsOf:
|
||||||
|
[OutlineItem(title: NSLocalizedString("PointerInteractionButtonsTitle", comment: ""),
|
||||||
|
imageName: "cursorarrow.rays",
|
||||||
|
storyboardName: "PointerInteractionButtonViewController") ])
|
||||||
|
}
|
||||||
|
|
||||||
|
var controlsSubItems = [
|
||||||
|
OutlineItem(title: NSLocalizedString("ButtonsTitle", comment: ""), imageName: "rectangle.on.rectangle", subitems: buttonItems),
|
||||||
|
|
||||||
|
OutlineItem(title: NSLocalizedString("PageControlTitle", comment: ""), imageName: "photo.on.rectangle", subitems: [
|
||||||
OutlineItem(title: NSLocalizedString("DefaultPageControlTitle", comment: ""), imageName: nil,
|
OutlineItem(title: NSLocalizedString("DefaultPageControlTitle", comment: ""), imageName: nil,
|
||||||
storyboardName: "DefaultPageControlViewController"),
|
storyboardName: "DefaultPageControlViewController"),
|
||||||
OutlineItem(title: NSLocalizedString("CustomPageControlTitle", comment: ""), imageName: nil,
|
OutlineItem(title: NSLocalizedString("CustomPageControlTitle", comment: ""), imageName: nil,
|
||||||
storyboardName: "CustomPageControlViewController")
|
storyboardName: "CustomPageControlViewController")
|
||||||
]),
|
]),
|
||||||
|
|
||||||
OutlineItem(title: NSLocalizedString("SearchBarsTitle", comment: ""), imageName: nil, subitems: [
|
OutlineItem(title: NSLocalizedString("SearchBarsTitle", comment: ""), imageName: "magnifyingglass", subitems: [
|
||||||
OutlineItem(title: NSLocalizedString("DefaultSearchBarTitle", comment: ""), imageName: nil,
|
OutlineItem(title: NSLocalizedString("DefaultSearchBarTitle", comment: ""), imageName: nil,
|
||||||
storyboardName: "DefaultSearchBarViewController"),
|
storyboardName: "DefaultSearchBarViewController"),
|
||||||
OutlineItem(title: NSLocalizedString("CustomSearchBarTitle", comment: ""), imageName: nil,
|
OutlineItem(title: NSLocalizedString("CustomSearchBarTitle", comment: ""), imageName: nil,
|
||||||
storyboardName: "CustomSearchBarViewController")
|
storyboardName: "CustomSearchBarViewController")
|
||||||
]),
|
]),
|
||||||
|
|
||||||
OutlineItem(title: NSLocalizedString("SegmentedControlsTitle", comment: ""), imageName: nil,
|
OutlineItem(title: NSLocalizedString("SegmentedControlsTitle", comment: ""), imageName: "square.split.3x1",
|
||||||
storyboardName: "SegmentedControlViewController"),
|
storyboardName: "SegmentedControlViewController"),
|
||||||
OutlineItem(title: NSLocalizedString("SlidersTitle", comment: ""), imageName: nil,
|
OutlineItem(title: NSLocalizedString("SlidersTitle", comment: ""), imageName: nil,
|
||||||
storyboardName: "SliderViewController"),
|
storyboardName: "SliderViewController"),
|
||||||
|
|
@ -103,15 +121,12 @@ class OutlineViewController: UIViewController {
|
||||||
storyboardName: "TextFieldViewController")
|
storyboardName: "TextFieldViewController")
|
||||||
]
|
]
|
||||||
|
|
||||||
#if !targetEnvironment(macCatalyst)
|
if traitCollection.userInterfaceIdiom != .mac {
|
||||||
/** Because this sample has "Optimize Interface for Mac" turned on -
|
// UIStepper class is not supported when running Mac Catalyst apps in the Mac idiom.
|
||||||
UIStepper class is not supported when running Mac Catalyst apps in the Mac idiom.
|
let stepperItem =
|
||||||
*/
|
OutlineItem(title: NSLocalizedString("SteppersTitle", comment: ""), imageName: nil, storyboardName: "StepperViewController")
|
||||||
let stepperItem =
|
controlsSubItems.append(stepperItem)
|
||||||
OutlineItem(title: NSLocalizedString("SteppersTitle", comment: ""), imageName: nil,
|
}
|
||||||
storyboardName: "StepperViewController")
|
|
||||||
controlsSubItems.append(stepperItem)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return OutlineItem(title: "Controls", imageName: "slider.horizontal.3", subitems: controlsSubItems)
|
return OutlineItem(title: "Controls", imageName: "slider.horizontal.3", subitems: controlsSubItems)
|
||||||
}()
|
}()
|
||||||
|
|
@ -128,15 +143,13 @@ class OutlineViewController: UIViewController {
|
||||||
storyboardName: "ImagePickerViewController")
|
storyboardName: "ImagePickerViewController")
|
||||||
]
|
]
|
||||||
|
|
||||||
#if !targetEnvironment(macCatalyst)
|
if traitCollection.userInterfaceIdiom != .mac {
|
||||||
/** Because this sample has "Optimize Interface for Mac" turned on -
|
// UIPickerView class is not supported when running Mac Catalyst apps in the Mac idiom.
|
||||||
UIPickerView class is not supported when running Mac Catalyst apps in the Mac idiom.
|
// To use a picker in macOS, use UIButton with changesSelectionAsPrimaryAction set to "true".
|
||||||
*/
|
let pickerViewItem =
|
||||||
let pickerViewItem =
|
OutlineItem(title: NSLocalizedString("PickerViewTitle", comment: ""), imageName: nil, storyboardName: "PickerViewController")
|
||||||
OutlineItem(title: NSLocalizedString("PickerViewTitle", comment: ""), imageName: nil,
|
pickerSubItems.append(pickerViewItem)
|
||||||
storyboardName: "PickerViewController")
|
}
|
||||||
pickerSubItems.append(pickerViewItem)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return OutlineItem(title: "Pickers", imageName: "list.bullet", subitems: pickerSubItems)
|
return OutlineItem(title: "Pickers", imageName: "list.bullet", subitems: pickerSubItems)
|
||||||
}()
|
}()
|
||||||
|
|
@ -147,14 +160,22 @@ class OutlineViewController: UIViewController {
|
||||||
storyboardName: "ActivityIndicatorViewController"),
|
storyboardName: "ActivityIndicatorViewController"),
|
||||||
OutlineItem(title: NSLocalizedString("AlertControllersTitle", comment: ""), imageName: nil,
|
OutlineItem(title: NSLocalizedString("AlertControllersTitle", comment: ""), imageName: nil,
|
||||||
storyboardName: "AlertControllerViewController"),
|
storyboardName: "AlertControllerViewController"),
|
||||||
OutlineItem(title: NSLocalizedString("ImageViewTitle", comment: ""), imageName: nil,
|
OutlineItem(title: NSLocalizedString("TextViewTitle", comment: ""), imageName: nil,
|
||||||
storyboardName: "ImageViewController"),
|
storyboardName: "TextViewController"),
|
||||||
|
|
||||||
|
OutlineItem(title: NSLocalizedString("ImagesTitle", comment: ""), imageName: "photo", subitems: [
|
||||||
|
OutlineItem(title: NSLocalizedString("ImageViewTitle", comment: ""), imageName: nil,
|
||||||
|
storyboardName: "ImageViewController"),
|
||||||
|
OutlineItem(title: NSLocalizedString("SymbolsTitle", comment: ""), imageName: nil,
|
||||||
|
storyboardName: "SymbolViewController")
|
||||||
|
]),
|
||||||
|
|
||||||
OutlineItem(title: NSLocalizedString("ProgressViewsTitle", comment: ""), imageName: nil,
|
OutlineItem(title: NSLocalizedString("ProgressViewsTitle", comment: ""), imageName: nil,
|
||||||
storyboardName: "ProgressViewController"),
|
storyboardName: "ProgressViewController"),
|
||||||
OutlineItem(title: NSLocalizedString("StackViewsTitle", comment: ""), imageName: nil,
|
OutlineItem(title: NSLocalizedString("StackViewsTitle", comment: ""), imageName: nil,
|
||||||
storyboardName: "StackViewController"),
|
storyboardName: "StackViewController"),
|
||||||
|
|
||||||
OutlineItem(title: NSLocalizedString("ToolbarsTitle", comment: ""), imageName: nil, subitems: [
|
OutlineItem(title: NSLocalizedString("ToolbarsTitle", comment: ""), imageName: "hammer", subitems: [
|
||||||
OutlineItem(title: NSLocalizedString("DefaultToolBarTitle", comment: ""), imageName: nil,
|
OutlineItem(title: NSLocalizedString("DefaultToolBarTitle", comment: ""), imageName: nil,
|
||||||
storyboardName: "DefaultToolbarViewController"),
|
storyboardName: "DefaultToolbarViewController"),
|
||||||
OutlineItem(title: NSLocalizedString("TintedToolbarTitle", comment: ""), imageName: nil,
|
OutlineItem(title: NSLocalizedString("TintedToolbarTitle", comment: ""), imageName: nil,
|
||||||
|
|
@ -163,8 +184,9 @@ class OutlineViewController: UIViewController {
|
||||||
storyboardName: "CustomToolbarViewController")
|
storyboardName: "CustomToolbarViewController")
|
||||||
]),
|
]),
|
||||||
|
|
||||||
OutlineItem(title: NSLocalizedString("WebViewTitle", comment: ""), imageName: nil,
|
OutlineItem(title: NSLocalizedString("VisualEffectTitle", comment: ""), imageName: nil, storyboardName: "VisualEffectViewController"),
|
||||||
storyboardName: "WebViewController")
|
|
||||||
|
OutlineItem(title: NSLocalizedString("WebViewTitle", comment: ""), imageName: nil, storyboardName: "WebViewController")
|
||||||
])
|
])
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|
@ -198,24 +220,29 @@ extension OutlineViewController {
|
||||||
var contentConfiguration = cell.defaultContentConfiguration()
|
var contentConfiguration = cell.defaultContentConfiguration()
|
||||||
contentConfiguration.text = menuItem.title
|
contentConfiguration.text = menuItem.title
|
||||||
|
|
||||||
if menuItem.imageName != nil {
|
if let image = menuItem.imageName {
|
||||||
contentConfiguration.image = UIImage(systemName: menuItem.imageName!)
|
contentConfiguration.image = UIImage(systemName: image)
|
||||||
}
|
}
|
||||||
|
|
||||||
contentConfiguration.textProperties.font = .preferredFont(forTextStyle: .headline)
|
contentConfiguration.textProperties.font = .preferredFont(forTextStyle: .headline)
|
||||||
cell.contentConfiguration = contentConfiguration
|
cell.contentConfiguration = contentConfiguration
|
||||||
|
|
||||||
let disclosureOptions = UICellAccessory.OutlineDisclosureOptions(style: .header)
|
let disclosureOptions = UICellAccessory.OutlineDisclosureOptions(style: .header)
|
||||||
cell.accessories = [.outlineDisclosure(options:disclosureOptions)]
|
cell.accessories = [.outlineDisclosure(options: disclosureOptions)]
|
||||||
|
|
||||||
let background = UIBackgroundConfiguration.clear()
|
let background = UIBackgroundConfiguration.clear()
|
||||||
cell.backgroundConfiguration = background
|
cell.backgroundConfiguration = background
|
||||||
}
|
}
|
||||||
|
|
||||||
let cellRegistration = UICollectionView.CellRegistration<UICollectionViewListCell, OutlineItem> { cell, indexPath, menuItem in
|
let cellRegistration = UICollectionView.CellRegistration<UICollectionViewListCell, OutlineItem> { cell, indexPath, menuItem in
|
||||||
var content = UIListContentConfiguration.cell()
|
var contentConfiguration = cell.defaultContentConfiguration()
|
||||||
content.text = menuItem.title
|
contentConfiguration.text = menuItem.title
|
||||||
cell.contentConfiguration = content
|
|
||||||
|
if let image = menuItem.imageName {
|
||||||
|
contentConfiguration.image = UIImage(systemName: image)
|
||||||
|
}
|
||||||
|
|
||||||
|
cell.contentConfiguration = contentConfiguration
|
||||||
|
|
||||||
let background = UIBackgroundConfiguration.clear()
|
let background = UIBackgroundConfiguration.clear()
|
||||||
cell.backgroundConfiguration = background
|
cell.backgroundConfiguration = background
|
||||||
|
|
@ -295,6 +322,14 @@ extension OutlineViewController: UICollectionViewDelegate {
|
||||||
|
|
||||||
if let storyboardName = menuItem.storyboardName {
|
if let storyboardName = menuItem.storyboardName {
|
||||||
pushOrPresentStoryboard(storyboardName: storyboardName)
|
pushOrPresentStoryboard(storyboardName: storyboardName)
|
||||||
|
|
||||||
|
if navigationController!.traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
if let windowScene = view.window?.windowScene {
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
windowScene.subtitle = menuItem.title
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
168
UIKitCatalog/PointerInteractionButtonViewController.swift
Executable file
|
|
@ -0,0 +1,168 @@
|
||||||
|
/*
|
||||||
|
See LICENSE folder for this sample’s licensing information.
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
A view controller that demonstrates how to intergrate pointer interactions to `UIButton`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
class PointerInteractionButtonViewController: BaseTableViewController {
|
||||||
|
|
||||||
|
// Cell identifier for each button pointer table view cell.
|
||||||
|
enum PointerButtonKind: String, CaseIterable {
|
||||||
|
case buttonPointer
|
||||||
|
case buttonHighlight
|
||||||
|
case buttonLift
|
||||||
|
case buttonHover
|
||||||
|
case buttonCustom
|
||||||
|
}
|
||||||
|
|
||||||
|
// The pointer effect kind to use for each button (corresponds to the button's view tag).
|
||||||
|
enum ButtonPointerEffectKind: Int {
|
||||||
|
case pointer = 1
|
||||||
|
case highlight
|
||||||
|
case lift
|
||||||
|
case hover
|
||||||
|
case custom
|
||||||
|
}
|
||||||
|
|
||||||
|
override func viewDidLoad() {
|
||||||
|
super.viewDidLoad()
|
||||||
|
|
||||||
|
testCells.append(contentsOf: [
|
||||||
|
CaseElement(title: "UIPointerEffect.automatic",
|
||||||
|
cellID: PointerButtonKind.buttonPointer.rawValue,
|
||||||
|
configHandler: configurePointerButton),
|
||||||
|
CaseElement(title: "UIPointerEffect.highlight",
|
||||||
|
cellID: PointerButtonKind.buttonHighlight.rawValue,
|
||||||
|
configHandler: configureHighlightButton),
|
||||||
|
CaseElement(title: "UIPointerEffect.lift",
|
||||||
|
cellID: PointerButtonKind.buttonLift.rawValue,
|
||||||
|
configHandler: configureLiftButton),
|
||||||
|
CaseElement(title: "UIPointerEffect.hover",
|
||||||
|
cellID: PointerButtonKind.buttonHover.rawValue,
|
||||||
|
configHandler: configureHoverButton),
|
||||||
|
CaseElement(title: "UIPointerEffect (custom)",
|
||||||
|
cellID: PointerButtonKind.buttonCustom.rawValue,
|
||||||
|
configHandler: configureCustomButton)
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Configurations
|
||||||
|
|
||||||
|
func configurePointerButton(button: UIButton) {
|
||||||
|
button.pointerStyleProvider = defaultButtonProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureHighlightButton(button: UIButton) {
|
||||||
|
button.pointerStyleProvider = highlightButtonProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureLiftButton(button: UIButton) {
|
||||||
|
button.pointerStyleProvider = liftButtonProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureHoverButton(button: UIButton) {
|
||||||
|
button.pointerStyleProvider = hoverButtonProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureCustomButton(button: UIButton) {
|
||||||
|
button.pointerStyleProvider = customButtonProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: Button Pointer Providers
|
||||||
|
|
||||||
|
func defaultButtonProvider(button: UIButton, pointerEffect: UIPointerEffect, pointerShape: UIPointerShape) -> UIPointerStyle? {
|
||||||
|
var buttonPointerStyle: UIPointerStyle? = nil
|
||||||
|
|
||||||
|
// Use the pointer effect's preview that's passed in.
|
||||||
|
let targetedPreview = pointerEffect.preview
|
||||||
|
|
||||||
|
/** UIPointerEffect.automatic attempts to determine the appropriate effect for the given preview automatically.
|
||||||
|
The pointer effect has an automatic nature which adapts to the aspects of the button (background color, corner radius, size)
|
||||||
|
*/
|
||||||
|
let buttonPointerEffect = UIPointerEffect.automatic(targetedPreview)
|
||||||
|
buttonPointerStyle = UIPointerStyle(effect: buttonPointerEffect, shape: pointerShape)
|
||||||
|
return buttonPointerStyle
|
||||||
|
}
|
||||||
|
|
||||||
|
func highlightButtonProvider(button: UIButton, pointerEffect: UIPointerEffect, pointerShape: UIPointerShape) -> UIPointerStyle? {
|
||||||
|
var buttonPointerStyle: UIPointerStyle? = nil
|
||||||
|
|
||||||
|
// Use the pointer effect's preview that's passed in.
|
||||||
|
let targetedPreview = pointerEffect.preview
|
||||||
|
|
||||||
|
// Pointer slides under the given view and morphs into the view's shape.
|
||||||
|
let buttonHighlightPointerEffect = UIPointerEffect.highlight(targetedPreview)
|
||||||
|
buttonPointerStyle = UIPointerStyle(effect: buttonHighlightPointerEffect, shape: pointerShape)
|
||||||
|
|
||||||
|
return buttonPointerStyle
|
||||||
|
}
|
||||||
|
|
||||||
|
func liftButtonProvider(button: UIButton, pointerEffect: UIPointerEffect, pointerShape: UIPointerShape) -> UIPointerStyle? {
|
||||||
|
var buttonPointerStyle: UIPointerStyle? = nil
|
||||||
|
|
||||||
|
// Use the pointer effect's preview that's passed in.
|
||||||
|
let targetedPreview = pointerEffect.preview
|
||||||
|
|
||||||
|
/** Pointer slides under the given view and disappears as the view scales up and gains a shadow.
|
||||||
|
Make the pointer shape’s bounds match the view’s frame so the highlight extends to the edges.
|
||||||
|
*/
|
||||||
|
let buttonLiftPointerEffect = UIPointerEffect.lift(targetedPreview)
|
||||||
|
let customPointerShape = UIPointerShape.path(UIBezierPath(roundedRect: button.bounds, cornerRadius: 6.0))
|
||||||
|
buttonPointerStyle = UIPointerStyle(effect: buttonLiftPointerEffect, shape: customPointerShape)
|
||||||
|
|
||||||
|
return buttonPointerStyle
|
||||||
|
}
|
||||||
|
|
||||||
|
func hoverButtonProvider(button: UIButton, pointerEffect: UIPointerEffect, pointerShape: UIPointerShape) -> UIPointerStyle? {
|
||||||
|
var buttonPointerStyle: UIPointerStyle? = nil
|
||||||
|
|
||||||
|
// Use the pointer effect's preview that's passed in.
|
||||||
|
let targetedPreview = pointerEffect.preview
|
||||||
|
|
||||||
|
/** Pointer retains the system shape while over the given view.
|
||||||
|
Visual changes applied to the view are dictated by the effect's properties.
|
||||||
|
*/
|
||||||
|
let buttonHoverPointerEffect =
|
||||||
|
UIPointerEffect.hover(targetedPreview, preferredTintMode: .none, prefersShadow: true)
|
||||||
|
buttonPointerStyle = UIPointerStyle(effect: buttonHoverPointerEffect, shape: nil)
|
||||||
|
|
||||||
|
return buttonPointerStyle
|
||||||
|
}
|
||||||
|
|
||||||
|
func customButtonProvider(button: UIButton, pointerEffect: UIPointerEffect, pointerShape: UIPointerShape) -> UIPointerStyle? {
|
||||||
|
var buttonPointerStyle: UIPointerStyle? = nil
|
||||||
|
|
||||||
|
/** Hover pointer with a custom triangle pointer shape.
|
||||||
|
Override the default UITargetedPreview with our own, make the visible path outset a little larger.
|
||||||
|
*/
|
||||||
|
let parameters = UIPreviewParameters()
|
||||||
|
parameters.visiblePath = UIBezierPath(rect: button.bounds.insetBy(dx: -15.0, dy: -15.0))
|
||||||
|
let newTargetedPreview = UITargetedPreview(view: button, parameters: parameters)
|
||||||
|
|
||||||
|
let buttonPointerEffect =
|
||||||
|
UIPointerEffect.hover(newTargetedPreview, preferredTintMode: .overlay, prefersShadow: false, prefersScaledContent: false)
|
||||||
|
|
||||||
|
let customPointerShape = UIPointerShape.path(trianglePointerShape())
|
||||||
|
buttonPointerStyle = UIPointerStyle(effect: buttonPointerEffect, shape: customPointerShape)
|
||||||
|
|
||||||
|
return buttonPointerStyle
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return a triangle bezier path for the pointer's shape.
|
||||||
|
func trianglePointerShape() -> UIBezierPath {
|
||||||
|
let width = 20.0
|
||||||
|
let height = 20.0
|
||||||
|
let offset = 10.0 // Coordinate location to match up with the coordinate of default pointer shape.
|
||||||
|
|
||||||
|
let pathView = UIBezierPath()
|
||||||
|
pathView.move(to: CGPoint(x: (width / 2) - offset, y: -offset))
|
||||||
|
pathView.addLine(to: CGPoint(x: -offset, y: height - offset))
|
||||||
|
pathView.addLine(to: CGPoint(x: width - offset, y: height - offset))
|
||||||
|
pathView.close()
|
||||||
|
|
||||||
|
return pathView
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -7,26 +7,25 @@ A view controller that demonstrates how to use `UIProgressView`.
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
class ProgressViewController: UITableViewController {
|
class ProgressViewController: BaseTableViewController {
|
||||||
|
// Cell identifier for each progress view table view cell.
|
||||||
|
enum ProgressViewKind: String, CaseIterable {
|
||||||
|
case defaultProgress
|
||||||
|
case barProgress
|
||||||
|
case tintedProgress
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
|
|
||||||
@IBOutlet weak var defaultStyleProgressView: UIProgressView!
|
var observer: NSKeyValueObservation?
|
||||||
|
|
||||||
@IBOutlet weak var barStyleProgressView: UIProgressView!
|
// An `NSProgress` object whose `fractionCompleted` is observed using KVO to update the `UIProgressView`s' `progress` properties.
|
||||||
|
let progress = Progress(totalUnitCount: 10)
|
||||||
@IBOutlet weak var tintedProgressView: UIProgressView!
|
|
||||||
|
|
||||||
@IBOutlet var progressViews: [UIProgressView]!
|
|
||||||
|
|
||||||
var observer: NSKeyValueObservation?
|
|
||||||
|
|
||||||
/** An `NSProgress` object who's `fractionCompleted` is observed using KVO to update
|
|
||||||
the `UIProgressView`s' `progress` properties.
|
|
||||||
*/
|
|
||||||
let progress = Progress(totalUnitCount: 10)
|
|
||||||
|
|
||||||
// A repeating timer that, when fired, updates the `NSProgress` object's `completedUnitCount` property.
|
// A repeating timer that, when fired, updates the `NSProgress` object's `completedUnitCount` property.
|
||||||
var updateTimer: Timer?
|
var updateTimer: Timer?
|
||||||
|
|
||||||
|
var progressViews = [UIProgressView]() // Accumulated progress views from all table cells for progress updating.
|
||||||
|
|
||||||
// MARK: - Initialization
|
// MARK: - Initialization
|
||||||
|
|
||||||
|
|
@ -34,12 +33,12 @@ class ProgressViewController: UITableViewController {
|
||||||
super.init(coder: aDecoder)
|
super.init(coder: aDecoder)
|
||||||
|
|
||||||
// Register as an observer of the `NSProgress`'s `fractionCompleted` property.
|
// Register as an observer of the `NSProgress`'s `fractionCompleted` property.
|
||||||
observer = progress.observe(\.fractionCompleted, options: [.new]) { (_, _) in
|
observer = progress.observe(\.fractionCompleted, options: [.new]) { (_, _) in
|
||||||
// Update the progress views.
|
// Update the progress views.
|
||||||
for progressView in self.progressViews {
|
for progressView in self.progressViews {
|
||||||
progressView.setProgress(Float(self.progress.fractionCompleted), animated: true)
|
progressView.setProgress(Float(self.progress.fractionCompleted), animated: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
|
|
@ -52,19 +51,28 @@ class ProgressViewController: UITableViewController {
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
configureDefaultStyleProgressView()
|
testCells.append(contentsOf: [
|
||||||
configureBarStyleProgressView()
|
CaseElement(title: NSLocalizedString("ProgressDefaultTitle", comment: ""),
|
||||||
configureTintedProgressView()
|
cellID: ProgressViewKind.defaultProgress.rawValue,
|
||||||
|
configHandler: configureDefaultStyleProgressView),
|
||||||
|
CaseElement(title: NSLocalizedString("ProgressBarTitle", comment: ""),
|
||||||
|
cellID: ProgressViewKind.barProgress.rawValue,
|
||||||
|
configHandler: configureBarStyleProgressView)
|
||||||
|
])
|
||||||
|
|
||||||
|
if traitCollection.userInterfaceIdiom != .mac {
|
||||||
|
// Tinted progress views available only on iOS.
|
||||||
|
testCells.append(contentsOf: [
|
||||||
|
CaseElement(title: NSLocalizedString("ProgressTintedTitle", comment: ""),
|
||||||
|
cellID: ProgressViewKind.tintedProgress.rawValue,
|
||||||
|
configHandler: configureTintedProgressView)
|
||||||
|
])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func viewDidAppear(_ animated: Bool) {
|
override func viewDidAppear(_ animated: Bool) {
|
||||||
super.viewDidAppear(animated)
|
super.viewDidAppear(animated)
|
||||||
|
|
||||||
// Reset the completed progress of the `UIProgressView`s.
|
|
||||||
for progressView in progressViews {
|
|
||||||
progressView.setProgress(0.0, animated: false)
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Reset the `completedUnitCount` of the `NSProgress` object and create
|
/** Reset the `completedUnitCount` of the `NSProgress` object and create
|
||||||
a repeating timer to increment it over time.
|
a repeating timer to increment it over time.
|
||||||
*/
|
*/
|
||||||
|
|
@ -91,50 +99,34 @@ class ProgressViewController: UITableViewController {
|
||||||
|
|
||||||
// MARK: - Configuration
|
// MARK: - Configuration
|
||||||
|
|
||||||
func configureDefaultStyleProgressView() {
|
func configureDefaultStyleProgressView(_ progressView: UIProgressView) {
|
||||||
defaultStyleProgressView.progressViewStyle = .default
|
progressView.progressViewStyle = .default
|
||||||
|
|
||||||
|
// Reset the completed progress of the `UIProgressView`s.
|
||||||
|
progressView.setProgress(0.0, animated: false)
|
||||||
|
|
||||||
|
progressViews.append(progressView)
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureBarStyleProgressView() {
|
func configureBarStyleProgressView(_ progressView: UIProgressView) {
|
||||||
barStyleProgressView.progressViewStyle = .bar
|
progressView.progressViewStyle = .bar
|
||||||
|
|
||||||
|
// Reset the completed progress of the `UIProgressView`s.
|
||||||
|
progressView.setProgress(0.0, animated: false)
|
||||||
|
|
||||||
|
progressViews.append(progressView)
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureTintedProgressView() {
|
func configureTintedProgressView(_ progressView: UIProgressView) {
|
||||||
tintedProgressView.progressViewStyle = .default
|
progressView.progressViewStyle = .default
|
||||||
|
|
||||||
tintedProgressView.trackTintColor = UIColor.systemBlue
|
progressView.trackTintColor = UIColor.systemBlue
|
||||||
tintedProgressView.progressTintColor = UIColor.systemPurple
|
progressView.progressTintColor = UIColor.systemPurple
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - UITableViewDataSource
|
// Reset the completed progress of the `UIProgressView`s.
|
||||||
|
progressView.setProgress(0.0, animated: false)
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
|
progressViews.append(progressView)
|
||||||
#if targetEnvironment(macCatalyst)
|
|
||||||
// Don't show tinted progress view for macOS, it does not exist.
|
|
||||||
if section == 2 {
|
|
||||||
return ""
|
|
||||||
} else {
|
|
||||||
return super.tableView(tableView, titleForHeaderInSection: section)
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return super.tableView(tableView, titleForHeaderInSection: section)
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - UITableViewDelegate
|
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView,
|
|
||||||
heightForRowAt indexPath: IndexPath) -> CGFloat {
|
|
||||||
#if targetEnvironment(macCatalyst)
|
|
||||||
// Don't show tinted progress view for macOS, it does not exist.
|
|
||||||
if indexPath.section == 2 {
|
|
||||||
return 0
|
|
||||||
} else {
|
|
||||||
return super.tableView(tableView, heightForRowAt: indexPath)
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return super.tableView(tableView, heightForRowAt: indexPath)
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,81 +10,79 @@ import UIKit
|
||||||
class SceneDelegate: UIResponder, UIWindowSceneDelegate, UISplitViewControllerDelegate {
|
class SceneDelegate: UIResponder, UIWindowSceneDelegate, UISplitViewControllerDelegate {
|
||||||
var window: UIWindow?
|
var window: UIWindow?
|
||||||
|
|
||||||
/** Applications should configure their UIWindow, and attach the UIWindow to the provided UIWindowScene scene.
|
/** Applications configure their UIWindow and attach the UIWindow to the provided UIWindowScene scene.
|
||||||
|
|
||||||
Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
|
Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
|
||||||
|
|
||||||
If using a storyboard file (as specified by the Info.plist key, UISceneStoryboardFile,
|
If using a storyboard file, as specified by the Info.plist key `UISceneStoryboardFile`,
|
||||||
the window property will automatically be configured and attached to the windowScene.
|
the window property automatically configures and attaches to the windowScene.
|
||||||
|
|
||||||
Remember to retain the SceneDelegate 's UIWindow.
|
Remember to retain the SceneDelegate's UIWindow.
|
||||||
The recommended approach is for the SceneDelegate to retain the scene's window.
|
The recommended approach is for the SceneDelegate to retain the scene's window.
|
||||||
*/
|
*/
|
||||||
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
|
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
|
||||||
guard let windowScene = (scene as? UIWindowScene) else { return }
|
guard (scene as? UIWindowScene) != nil else { return }
|
||||||
|
|
||||||
if let splitViewController = window!.rootViewController as? UISplitViewController {
|
if let splitViewController = window!.rootViewController as? UISplitViewController {
|
||||||
splitViewController.delegate = self
|
splitViewController.delegate = self
|
||||||
|
|
||||||
splitViewController.preferredDisplayMode = .oneBesideSecondary
|
|
||||||
splitViewController.presentsWithGesture = false
|
|
||||||
|
|
||||||
if let navController = splitViewController.viewControllers[1] as? UINavigationController {
|
if let navController = splitViewController.viewControllers[1] as? UINavigationController {
|
||||||
// For the Mac, remove the title bar and navigation bar.
|
// For the Mac, remove the navigation bar.
|
||||||
#if targetEnvironment(macCatalyst)
|
if navController.traitCollection.userInterfaceIdiom == .mac {
|
||||||
if let titlebar = windowScene.titlebar {
|
|
||||||
titlebar.titleVisibility = .hidden
|
|
||||||
titlebar.toolbar = nil
|
|
||||||
}
|
|
||||||
// Hide the navigation bar on the Mac.
|
|
||||||
navController.navigationBar.isHidden = true
|
navController.navigationBar.isHidden = true
|
||||||
#endif
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Called as the scene is being released by the system or on window close.
|
/** Called by iOS when the system is releasing the scene or on window close.
|
||||||
This occurs shortly after the scene enters the background, or when its session is discarded.
|
This occurs shortly after the scene enters the background, or when discarding its session.
|
||||||
Release any resources associated with this scene that can be re-created the next time the scene connects.
|
Release any resources for this scene that you can create the next time the scene connects.
|
||||||
The scene may re-connect later, as its session was not neccessarily discarded (see`application:didDiscardSceneSessions` instead).
|
The scene may reconnect later because the system doesn't necessarily discard its session
|
||||||
|
(see `application:didDiscardSceneSessions` instead).
|
||||||
*/
|
*/
|
||||||
func sceneDidDisconnect(_ scene: UIScene) {
|
func sceneDidDisconnect(_ scene: UIScene) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Called as the scene transitions from the background to the foreground,
|
/** Called by iOS as the scene transitions from the background to the foreground, on window open, or on iOS resume.
|
||||||
on window open or in iOS resume.
|
Use this method to undo the changes that occur on entering the background.
|
||||||
Use this method to undo the changes made on entering the background.
|
|
||||||
*/
|
*/
|
||||||
func sceneWillEnterForeground(_ scene: UIScene) {
|
func sceneWillEnterForeground(_ scene: UIScene) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Called as the scene transitions from the foreground to the background.
|
/** Called by iOS as the scene transitions from the foreground to the background.
|
||||||
Use this method to save data, release shared resources, and store enough scene-specific state information
|
Use this method to save data, release shared resources, and store enough scene-specific state information
|
||||||
to restore the scene back to its current state.
|
to restore the scene to its current state.
|
||||||
*/
|
*/
|
||||||
func sceneDidEnterBackground(_ scene: UIScene) {
|
func sceneDidEnterBackground(_ scene: UIScene) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Called when the scene "will move" from an active state to an inactive state,
|
/** Called by iOS when the scene is about to move from an active state to an inactive state, on window close or on iOS enter background.
|
||||||
on window close or in iOS enter background.
|
This may occur due to temporary interruptions (such as, an incoming phone call).
|
||||||
This may occur due to temporary interruptions (ex. an incoming phone call).
|
|
||||||
*/
|
*/
|
||||||
func sceneWillResignActive(_ scene: UIScene) {
|
func sceneWillResignActive(_ scene: UIScene) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Called when the scene "has moved" from an inactive state to an active state.
|
/** Called by iOS when the scene after the scene moves from an inactive state to an active state.
|
||||||
Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
|
Use this method to restart any paused tasks (or pending tasks) when the scene is inactive.
|
||||||
Is called every time a scene becomes active, so setup your scene UI here.
|
This is called every time a scene becomes active, so set up your scene UI here.
|
||||||
*/
|
*/
|
||||||
func sceneDidBecomeActive(_ scene: UIScene) {
|
func sceneDidBecomeActive(_ scene: UIScene) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - UISplitViewControllerDelegate
|
func splitViewController(_ svc: UISplitViewController,
|
||||||
|
topColumnForCollapsingToProposedTopColumn proposedTopColumn: UISplitViewController.Column)
|
||||||
func splitViewController(_ splitViewController: UISplitViewController,
|
-> UISplitViewController.Column {
|
||||||
collapseSecondary secondaryViewController: UIViewController,
|
return .secondary
|
||||||
onto primaryViewController: UIViewController) -> Bool {
|
|
||||||
// Return true to prevent UIKit from applying its default behavior.
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func splitViewController(_ svc: UISplitViewController,
|
||||||
|
displayModeForExpandingToProposedDisplayMode proposedDisplayMode: UISplitViewController.DisplayMode)
|
||||||
|
-> UISplitViewController.DisplayMode {
|
||||||
|
if let navController = svc.viewControllers[0] as? UINavigationController {
|
||||||
|
navController.popToRootViewController(animated: false)
|
||||||
|
}
|
||||||
|
return .automatic
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,76 +7,117 @@ A view controller that demonstrates how to use `UISegmentedControl`.
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
class SegmentedControlViewController: UITableViewController {
|
class SegmentedControlViewController: BaseTableViewController {
|
||||||
// MARK: - Properties
|
|
||||||
|
|
||||||
@IBOutlet weak var defaultSegmentedControl: UISegmentedControl!
|
// Cell identifier for each segmented control table view cell.
|
||||||
@IBOutlet weak var tintedSegmentedControl: UISegmentedControl!
|
enum SegmentKind: String, CaseIterable {
|
||||||
@IBOutlet weak var customSegmentsSegmentedControl: UISegmentedControl!
|
case segmentDefault
|
||||||
@IBOutlet weak var customBackgroundSegmentedControl: UISegmentedControl!
|
case segmentTinted
|
||||||
@IBOutlet weak var actionBasedSegmentedControl: UISegmentedControl!
|
case segmentCustom
|
||||||
|
case segmentCustomBackground
|
||||||
|
case segmentAction
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - View Life Cycle
|
// MARK: - View Life Cycle
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
configureDefaultSegmentedControl()
|
testCells.append(contentsOf: [
|
||||||
configureTintedSegmentedControl()
|
CaseElement(title: NSLocalizedString("DefaultTitle", comment: ""),
|
||||||
configureCustomSegmentsSegmentedControl()
|
cellID: SegmentKind.segmentDefault.rawValue,
|
||||||
configureCustomBackgroundSegmentedControl()
|
configHandler: configureDefaultSegmentedControl),
|
||||||
configureActionBasedSegmentedControl()
|
CaseElement(title: NSLocalizedString("CustomSegmentsTitle", comment: ""),
|
||||||
|
cellID: SegmentKind.segmentCustom.rawValue,
|
||||||
|
configHandler: configureCustomSegmentsSegmentedControl),
|
||||||
|
CaseElement(title: NSLocalizedString("CustomBackgroundTitle", comment: ""),
|
||||||
|
cellID: SegmentKind.segmentCustomBackground.rawValue,
|
||||||
|
configHandler: configureCustomBackgroundSegmentedControl),
|
||||||
|
CaseElement(title: NSLocalizedString("ActionBasedTitle", comment: ""),
|
||||||
|
cellID: SegmentKind.segmentAction.rawValue,
|
||||||
|
configHandler: configureActionBasedSegmentedControl)
|
||||||
|
])
|
||||||
|
if self.traitCollection.userInterfaceIdiom != .mac {
|
||||||
|
// Tinted segmented control is only available on iOS.
|
||||||
|
testCells.append(contentsOf: [
|
||||||
|
CaseElement(title: "Tinted",
|
||||||
|
cellID: SegmentKind.segmentTinted.rawValue,
|
||||||
|
configHandler: configureTintedSegmentedControl)
|
||||||
|
])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Configuration
|
// MARK: - Configuration
|
||||||
|
|
||||||
func configureDefaultSegmentedControl() {
|
func configureDefaultSegmentedControl(_ segmentedControl: UISegmentedControl) {
|
||||||
// As a demonstration, disable the first segment.
|
// As a demonstration, disable the first segment.
|
||||||
defaultSegmentedControl.setEnabled(false, forSegmentAt: 0)
|
segmentedControl.setEnabled(false, forSegmentAt: 0)
|
||||||
|
|
||||||
defaultSegmentedControl.addTarget(self, action: #selector(SegmentedControlViewController.selectedSegmentDidChange(_:)), for: .valueChanged)
|
segmentedControl.addTarget(self, action: #selector(SegmentedControlViewController.selectedSegmentDidChange(_:)), for: .valueChanged)
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureTintedSegmentedControl() {
|
func configureTintedSegmentedControl(_ segmentedControl: UISegmentedControl) {
|
||||||
// Use a dynamic tinted color (separate one for Light Appearance and separate one for Dark Appearance).
|
// Use a dynamic tinted "green" color (separate one for Light Appearance and separate one for Dark Appearance).
|
||||||
tintedSegmentedControl.selectedSegmentTintColor = UIColor(named: "tinted_segmented_control")!
|
segmentedControl.selectedSegmentTintColor = UIColor(named: "tinted_segmented_control")!
|
||||||
|
segmentedControl.selectedSegmentIndex = 1
|
||||||
|
|
||||||
tintedSegmentedControl.selectedSegmentIndex = 1
|
segmentedControl.addTarget(self, action: #selector(SegmentedControlViewController.selectedSegmentDidChange(_:)), for: .valueChanged)
|
||||||
|
|
||||||
tintedSegmentedControl.addTarget(self, action: #selector(SegmentedControlViewController.selectedSegmentDidChange(_:)), for: .valueChanged)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureCustomSegmentsSegmentedControl() {
|
func configureCustomSegmentsSegmentedControl(_ segmentedControl: UISegmentedControl) {
|
||||||
let airplaneImage = UIImage(systemName: "airplane")
|
let airplaneImage = UIImage(systemName: "airplane")
|
||||||
airplaneImage?.accessibilityLabel = NSLocalizedString("Airplane", comment: "")
|
airplaneImage?.accessibilityLabel = NSLocalizedString("Airplane", comment: "")
|
||||||
customSegmentsSegmentedControl.setImage(airplaneImage, forSegmentAt: 0)
|
segmentedControl.setImage(airplaneImage, forSegmentAt: 0)
|
||||||
|
|
||||||
let giftImage = UIImage(systemName: "gift")
|
let giftImage = UIImage(systemName: "gift")
|
||||||
giftImage?.accessibilityLabel = NSLocalizedString("Gift", comment: "")
|
giftImage?.accessibilityLabel = NSLocalizedString("Gift", comment: "")
|
||||||
customSegmentsSegmentedControl.setImage(giftImage, forSegmentAt: 1)
|
segmentedControl.setImage(giftImage, forSegmentAt: 1)
|
||||||
|
|
||||||
let burstImage = UIImage(systemName: "burst")
|
let burstImage = UIImage(systemName: "burst")
|
||||||
burstImage?.accessibilityLabel = NSLocalizedString("Burst", comment: "")
|
burstImage?.accessibilityLabel = NSLocalizedString("Burst", comment: "")
|
||||||
customSegmentsSegmentedControl.setImage(burstImage, forSegmentAt: 2)
|
segmentedControl.setImage(burstImage, forSegmentAt: 2)
|
||||||
|
|
||||||
customSegmentsSegmentedControl.selectedSegmentIndex = 0
|
segmentedControl.selectedSegmentIndex = 0
|
||||||
|
|
||||||
customSegmentsSegmentedControl.addTarget(self,
|
segmentedControl.addTarget(self, action: #selector(SegmentedControlViewController.selectedSegmentDidChange(_:)), for: .valueChanged)
|
||||||
action: #selector(SegmentedControlViewController.selectedSegmentDidChange(_:)),
|
|
||||||
for: .valueChanged)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureCustomBackgroundSegmentedControl() {
|
// Utility function to resize an image to a particular size.
|
||||||
|
func scaledImage(_ image: UIImage, scaledToSize newSize: CGSize) -> UIImage {
|
||||||
|
UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
|
||||||
|
image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
|
||||||
|
let newImage = UIGraphicsGetImageFromCurrentImageContext()!
|
||||||
|
UIGraphicsEndImageContext()
|
||||||
|
return newImage
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure the segmented control with a background image, dividers, and custom font.
|
||||||
|
// The background image first needs to be sized to match the control's size.
|
||||||
|
//
|
||||||
|
func configureCustomBackgroundSegmentedControl(_ placeHolderView: UIView) {
|
||||||
|
let customBackgroundSegmentedControl =
|
||||||
|
UISegmentedControl(items: [NSLocalizedString("CheckTitle", comment: ""),
|
||||||
|
NSLocalizedString("SearchTitle", comment: ""),
|
||||||
|
NSLocalizedString("ToolsTitle", comment: "")])
|
||||||
customBackgroundSegmentedControl.selectedSegmentIndex = 2
|
customBackgroundSegmentedControl.selectedSegmentIndex = 2
|
||||||
|
|
||||||
// Set the background images for each control state.
|
// Place this custom segmented control within the placeholder view.
|
||||||
let normalSegmentBackgroundImage = UIImage(named: "stepper_and_segment_background")
|
customBackgroundSegmentedControl.frame.size.width = placeHolderView.frame.size.width
|
||||||
customBackgroundSegmentedControl.setBackgroundImage(normalSegmentBackgroundImage, for: .normal, barMetrics: .default)
|
customBackgroundSegmentedControl.frame.origin.y =
|
||||||
|
(placeHolderView.bounds.size.height - customBackgroundSegmentedControl.bounds.size.height) / 2
|
||||||
|
placeHolderView.addSubview(customBackgroundSegmentedControl)
|
||||||
|
|
||||||
let disabledSegmentBackgroundImage = UIImage(named: "stepper_and_segment_background_disabled")
|
// Set the background images for each control state.
|
||||||
|
let normalSegmentBackgroundImage = UIImage(named: "background")
|
||||||
|
// Size the background image to match the bounds of the segmented control.
|
||||||
|
let backgroundImageSize = customBackgroundSegmentedControl.bounds.size
|
||||||
|
let newBackgroundImageSize = scaledImage(normalSegmentBackgroundImage!, scaledToSize: backgroundImageSize)
|
||||||
|
customBackgroundSegmentedControl.setBackgroundImage(newBackgroundImageSize, for: .normal, barMetrics: .default)
|
||||||
|
|
||||||
|
let disabledSegmentBackgroundImage = UIImage(named: "background_disabled")
|
||||||
customBackgroundSegmentedControl.setBackgroundImage(disabledSegmentBackgroundImage, for: .disabled, barMetrics: .default)
|
customBackgroundSegmentedControl.setBackgroundImage(disabledSegmentBackgroundImage, for: .disabled, barMetrics: .default)
|
||||||
|
|
||||||
let highlightedSegmentBackgroundImage = UIImage(named: "stepper_and_segment_background_highlighted")
|
let highlightedSegmentBackgroundImage = UIImage(named: "background_highlighted")
|
||||||
customBackgroundSegmentedControl.setBackgroundImage(highlightedSegmentBackgroundImage, for: .highlighted, barMetrics: .default)
|
customBackgroundSegmentedControl.setBackgroundImage(highlightedSegmentBackgroundImage, for: .highlighted, barMetrics: .default)
|
||||||
|
|
||||||
// Set the divider image.
|
// Set the divider image.
|
||||||
|
|
@ -87,9 +128,7 @@ class SegmentedControlViewController: UITableViewController {
|
||||||
barMetrics: .default)
|
barMetrics: .default)
|
||||||
|
|
||||||
// Create a font to use for the attributed title, for both normal and highlighted states.
|
// Create a font to use for the attributed title, for both normal and highlighted states.
|
||||||
let captionFontDescriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: .caption1)
|
let font = UIFont(descriptor: UIFontDescriptor.preferredFontDescriptor(withTextStyle: .body), size: 0)
|
||||||
let font = UIFont(descriptor: captionFontDescriptor, size: 0)
|
|
||||||
|
|
||||||
let normalTextAttributes = [
|
let normalTextAttributes = [
|
||||||
NSAttributedString.Key.foregroundColor: UIColor.systemPurple,
|
NSAttributedString.Key.foregroundColor: UIColor.systemPurple,
|
||||||
NSAttributedString.Key.font: font
|
NSAttributedString.Key.font: font
|
||||||
|
|
@ -107,60 +146,44 @@ class SegmentedControlViewController: UITableViewController {
|
||||||
for: .valueChanged)
|
for: .valueChanged)
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureActionBasedSegmentedControl() {
|
func configureActionBasedSegmentedControl(_ segmentedControl: UISegmentedControl) {
|
||||||
actionBasedSegmentedControl.selectedSegmentIndex = 0
|
segmentedControl.selectedSegmentIndex = 0
|
||||||
let firstAction =
|
let firstAction =
|
||||||
UIAction(title: NSLocalizedString("CheckTitle", comment: "")) { action in
|
UIAction(title: NSLocalizedString("CheckTitle", comment: "")) { action in
|
||||||
Swift.debugPrint("Segment Action '\(action.title)'")
|
Swift.debugPrint("Segment Action '\(action.title)'")
|
||||||
}
|
}
|
||||||
actionBasedSegmentedControl.setAction(firstAction, forSegmentAt: 0)
|
segmentedControl.setAction(firstAction, forSegmentAt: 0)
|
||||||
let secondAction =
|
let secondAction =
|
||||||
UIAction(title: NSLocalizedString("SearchTitle", comment: "")) { action in
|
UIAction(title: NSLocalizedString("SearchTitle", comment: "")) { action in
|
||||||
Swift.debugPrint("Segment Action '\(action.title)'")
|
Swift.debugPrint("Segment Action '\(action.title)'")
|
||||||
}
|
}
|
||||||
actionBasedSegmentedControl.setAction(secondAction, forSegmentAt: 1)
|
segmentedControl.setAction(secondAction, forSegmentAt: 1)
|
||||||
let thirdAction =
|
let thirdAction =
|
||||||
UIAction(title: NSLocalizedString("ToolsTitle", comment: "")) { action in
|
UIAction(title: NSLocalizedString("ToolsTitle", comment: "")) { action in
|
||||||
Swift.debugPrint("Segment Action '\(action.title)'")
|
Swift.debugPrint("Segment Action '\(action.title)'")
|
||||||
}
|
}
|
||||||
actionBasedSegmentedControl.setAction(thirdAction, forSegmentAt: 2)
|
segmentedControl.setAction(thirdAction, forSegmentAt: 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Actions
|
// MARK: - Actions
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func selectedSegmentDidChange(_ segmentedControl: UISegmentedControl) {
|
func selectedSegmentDidChange(_ segmentedControl: UISegmentedControl) {
|
||||||
print("The selected segment changed for: \(segmentedControl).")
|
Swift.debugPrint("The selected segment: \(segmentedControl.selectedSegmentIndex).")
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - UITableViewDataSource
|
// MARK: - UITableViewDataSource
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
|
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||||
#if targetEnvironment(macCatalyst)
|
let cellTest = testCells[indexPath.section]
|
||||||
// Don't show tinted segmented control for macOS, it does not exist.
|
let cell = tableView.dequeueReusableCell(withIdentifier: cellTest.cellID, for: indexPath)
|
||||||
if section == 1 {
|
if let segementedControl = cellTest.targetView(cell) as? UISegmentedControl {
|
||||||
return ""
|
cellTest.configHandler(segementedControl)
|
||||||
} else {
|
} else if let placeHolderView = cellTest.targetView(cell) {
|
||||||
return super.tableView(tableView, titleForHeaderInSection: section)
|
// The only non-segmented control cell has a placeholder UIView (for adding one as a subview).
|
||||||
|
cellTest.configHandler(placeHolderView)
|
||||||
}
|
}
|
||||||
#else
|
return cell
|
||||||
return super.tableView(tableView, titleForHeaderInSection: section)
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - UITableViewDelegate
|
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView,
|
|
||||||
heightForRowAt indexPath: IndexPath) -> CGFloat {
|
|
||||||
#if targetEnvironment(macCatalyst)
|
|
||||||
// Don't show tinted segmented control for macOS, it does not exist.
|
|
||||||
if indexPath.section == 1 {
|
|
||||||
return 0
|
|
||||||
} else {
|
|
||||||
return super.tableView(tableView, heightForRowAt: indexPath)
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return super.tableView(tableView, heightForRowAt: indexPath)
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,98 +7,139 @@ A view controller that demonstrates how to use `UISlider`.
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
class SliderViewController: UITableViewController {
|
class SliderViewController: BaseTableViewController {
|
||||||
// MARK: - Properties
|
// Cell identifier for each slider table view cell.
|
||||||
|
enum SliderKind: String, CaseIterable {
|
||||||
@IBOutlet weak var defaultSlider: UISlider!
|
case sliderDefault
|
||||||
@IBOutlet weak var tintedSlider: UISlider!
|
case sliderTinted
|
||||||
@IBOutlet weak var customSlider: UISlider!
|
case sliderCustom
|
||||||
@IBOutlet weak var minMaxImageSlider: UISlider!
|
case sliderMaxMinImage
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - View Life Cycle
|
// MARK: - View Life Cycle
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
configureDefaultSlider()
|
testCells.append(contentsOf: [
|
||||||
#if !targetEnvironment(macCatalyst)
|
CaseElement(title: NSLocalizedString("DefaultTitle", comment: ""),
|
||||||
/** Only show for the first table cell (default slider).
|
cellID: SliderKind.sliderDefault.rawValue,
|
||||||
Because this sample has "Optimize Interface for Mac" turned on -
|
configHandler: configureDefaultSlider)
|
||||||
UISlider class: tinted, custom, and max/min image, are not supported when running Mac Catalyst apps in the Mac idiom.
|
])
|
||||||
*/
|
|
||||||
configureTintedSlider()
|
if #available(iOS 15, *) {
|
||||||
configureCustomSlider()
|
// These cases require iOS 15 or later when running on Mac Catalyst.
|
||||||
configureMinMaxImageSlider()
|
testCells.append(contentsOf: [
|
||||||
#endif
|
CaseElement(title: NSLocalizedString("CustomTitle", comment: ""),
|
||||||
|
cellID: SliderKind.sliderCustom.rawValue,
|
||||||
|
configHandler: configureCustomSlider)
|
||||||
|
])
|
||||||
|
testCells.append(contentsOf: [
|
||||||
|
CaseElement(title: NSLocalizedString("MinMaxImagesTitle", comment: ""),
|
||||||
|
cellID: SliderKind.sliderMaxMinImage.rawValue,
|
||||||
|
configHandler: configureMinMaxImageSlider)
|
||||||
|
])
|
||||||
|
testCells.append(contentsOf: [
|
||||||
|
CaseElement(title: NSLocalizedString("TintedTitle", comment: ""),
|
||||||
|
cellID: SliderKind.sliderTinted.rawValue,
|
||||||
|
configHandler: configureTintedSlider)
|
||||||
|
])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Configuration
|
// MARK: - Configuration
|
||||||
|
|
||||||
override func numberOfSections(in tableView: UITableView) -> Int {
|
func configureDefaultSlider(_ slider: UISlider) {
|
||||||
#if targetEnvironment(macCatalyst)
|
slider.minimumValue = 0
|
||||||
/** Only show for the first table cell (default slider).
|
slider.maximumValue = 100
|
||||||
Because this sample has "Optimize Interface for Mac" turned on -
|
slider.value = 42
|
||||||
UISlider class: tinted, custom, and max/min image, are not supported when running Mac Catalyst apps in the Mac idiom.
|
slider.isContinuous = true
|
||||||
|
|
||||||
|
slider.addTarget(self, action: #selector(SliderViewController.sliderValueDidChange(_:)), for: .valueChanged)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(iOS 15.0, *)
|
||||||
|
func configureTintedSlider(slider: UISlider) {
|
||||||
|
/** To keep the look the same betwen iOS and macOS:
|
||||||
|
For minimumTrackTintColor, maximumTrackTintColor to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
|
||||||
|
Available in macOS 12 or later (Mac Catalyst 15.0 or later).
|
||||||
|
Use this for controls that need to look the same between iOS and macOS.
|
||||||
*/
|
*/
|
||||||
return 1
|
if traitCollection.userInterfaceIdiom == .mac {
|
||||||
#else
|
slider.preferredBehavioralStyle = .pad
|
||||||
return super.numberOfSections(in: tableView)
|
}
|
||||||
#endif
|
|
||||||
|
slider.minimumTrackTintColor = UIColor.systemBlue
|
||||||
|
slider.maximumTrackTintColor = UIColor.systemPurple
|
||||||
|
|
||||||
|
slider.addTarget(self, action: #selector(SliderViewController.sliderValueDidChange(_:)), for: .valueChanged)
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureDefaultSlider() {
|
@available(iOS 15.0, *)
|
||||||
defaultSlider.minimumValue = 0
|
func configureCustomSlider(slider: UISlider) {
|
||||||
defaultSlider.maximumValue = 100
|
/** To keep the look the same betwen iOS and macOS:
|
||||||
defaultSlider.value = 42
|
For setMinimumTrackImage, setMaximumTrackImage, setThumbImage to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
|
||||||
defaultSlider.isContinuous = true
|
Available in macOS 12 or later (Mac Catalyst 15.0 or later).
|
||||||
|
Use this for controls that need to look the same between iOS and macOS.
|
||||||
|
*/
|
||||||
|
if traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
slider.preferredBehavioralStyle = .pad
|
||||||
|
}
|
||||||
|
|
||||||
defaultSlider.addTarget(self,
|
|
||||||
action: #selector(SliderViewController.sliderValueDidChange(_:)),
|
|
||||||
for: .valueChanged)
|
|
||||||
}
|
|
||||||
|
|
||||||
func configureTintedSlider() {
|
|
||||||
tintedSlider.minimumTrackTintColor = UIColor.systemBlue
|
|
||||||
tintedSlider.maximumTrackTintColor = UIColor.systemPurple
|
|
||||||
|
|
||||||
tintedSlider.addTarget(self,
|
|
||||||
action: #selector(SliderViewController.sliderValueDidChange(_:)),
|
|
||||||
for: .valueChanged)
|
|
||||||
}
|
|
||||||
|
|
||||||
func configureCustomSlider() {
|
|
||||||
let leftTrackImage = UIImage(named: "slider_blue_track")
|
let leftTrackImage = UIImage(named: "slider_blue_track")
|
||||||
customSlider.setMinimumTrackImage(leftTrackImage, for: .normal)
|
slider.setMinimumTrackImage(leftTrackImage, for: .normal)
|
||||||
|
|
||||||
let rightTrackImage = UIImage(named: "slider_green_track")
|
let rightTrackImage = UIImage(named: "slider_green_track")
|
||||||
customSlider.setMaximumTrackImage(rightTrackImage, for: .normal)
|
slider.setMaximumTrackImage(rightTrackImage, for: .normal)
|
||||||
|
|
||||||
// Set the sliding thumb image (normal and highlighted).
|
// Set the sliding thumb image (normal and highlighted).
|
||||||
let thumbImageConfig = UIImage.SymbolConfiguration(scale: .large)
|
//
|
||||||
|
// For fun, choose a different image symbol configuraton for the thumb's image between macOS and iOS.
|
||||||
|
var thumbImageConfig: UIImage.SymbolConfiguration
|
||||||
|
if slider.traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
thumbImageConfig = UIImage.SymbolConfiguration(scale: .large)
|
||||||
|
} else {
|
||||||
|
thumbImageConfig = UIImage.SymbolConfiguration(pointSize: 30, weight: .heavy, scale: .large)
|
||||||
|
}
|
||||||
let thumbImage = UIImage(systemName: "circle.fill", withConfiguration: thumbImageConfig)
|
let thumbImage = UIImage(systemName: "circle.fill", withConfiguration: thumbImageConfig)
|
||||||
customSlider.setThumbImage(thumbImage, for: .normal)
|
slider.setThumbImage(thumbImage, for: .normal)
|
||||||
|
|
||||||
let thumbImageHighlighted = UIImage(systemName: "circle", withConfiguration: thumbImageConfig)
|
let thumbImageHighlighted = UIImage(systemName: "circle", withConfiguration: thumbImageConfig)
|
||||||
customSlider.setThumbImage(thumbImageHighlighted, for: .highlighted)
|
slider.setThumbImage(thumbImageHighlighted, for: .highlighted)
|
||||||
|
|
||||||
customSlider.minimumValue = 0
|
// Set the rest of the slider's attributes.
|
||||||
customSlider.maximumValue = 100
|
slider.minimumValue = 0
|
||||||
customSlider.isContinuous = false
|
slider.maximumValue = 100
|
||||||
customSlider.value = 84
|
slider.isContinuous = false
|
||||||
|
slider.value = 84
|
||||||
|
|
||||||
customSlider.addTarget(self, action: #selector(SliderViewController.sliderValueDidChange(_:)), for: .valueChanged)
|
slider.addTarget(self, action: #selector(SliderViewController.sliderValueDidChange(_:)), for: .valueChanged)
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureMinMaxImageSlider() {
|
func configureMinMaxImageSlider(slider: UISlider) {
|
||||||
minMaxImageSlider.minimumValueImage = UIImage(systemName: "tortoise")
|
/** To keep the look the same betwen iOS and macOS:
|
||||||
minMaxImageSlider.maximumValueImage = UIImage(systemName: "hare")
|
For setMinimumValueImage, setMaximumValueImage to work in Mac Catalyst, use UIBehavioralStyle as ".pad",
|
||||||
|
Available in macOS 12 or later (Mac Catalyst 15.0 or later).
|
||||||
|
Use this for controls that need to look the same between iOS and macOS.
|
||||||
|
*/
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
if traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
slider.preferredBehavioralStyle = .pad
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
minMaxImageSlider.addTarget(self, action: #selector(SliderViewController.sliderValueDidChange(_:)), for: .valueChanged)
|
slider.minimumValueImage = UIImage(systemName: "tortoise")
|
||||||
|
slider.maximumValueImage = UIImage(systemName: "hare")
|
||||||
|
|
||||||
|
slider.addTarget(self, action: #selector(SliderViewController.sliderValueDidChange(_:)), for: .valueChanged)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Actions
|
// MARK: - Actions
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func sliderValueDidChange(_ slider: UISlider) {
|
func sliderValueDidChange(_ slider: UISlider) {
|
||||||
print("A slider changed its value: \(slider).")
|
let formattedValue = String(format: "%.2f", slider.value)
|
||||||
|
Swift.debugPrint("Slider changed its value: \(formattedValue)")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,13 +11,9 @@ class StackViewController: UIViewController {
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
|
|
||||||
@IBOutlet var furtherDetailStackView: UIStackView!
|
@IBOutlet var furtherDetailStackView: UIStackView!
|
||||||
|
|
||||||
@IBOutlet var plusButton: UIButton!
|
@IBOutlet var plusButton: UIButton!
|
||||||
|
|
||||||
@IBOutlet var addRemoveExampleStackView: UIStackView!
|
@IBOutlet var addRemoveExampleStackView: UIStackView!
|
||||||
|
|
||||||
@IBOutlet var addArrangedViewButton: UIButton!
|
@IBOutlet var addArrangedViewButton: UIButton!
|
||||||
|
|
||||||
@IBOutlet var removeArrangedViewButton: UIButton!
|
@IBOutlet var removeArrangedViewButton: UIButton!
|
||||||
|
|
||||||
let maximumArrangedSubviewCount = 3
|
let maximumArrangedSubviewCount = 3
|
||||||
|
|
|
||||||
|
|
@ -7,106 +7,91 @@ A view controller that demonstrates how to use `UIStepper`.
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
class StepperViewController: UITableViewController {
|
class StepperViewController: BaseTableViewController {
|
||||||
// MARK: - Properties
|
|
||||||
|
|
||||||
@IBOutlet weak var defaultStepper: UIStepper!
|
// Cell identifier for each stepper table view cell.
|
||||||
|
enum StepperKind: String, CaseIterable {
|
||||||
@IBOutlet weak var tintedStepper: UIStepper!
|
case defaultStepper
|
||||||
|
case tintedStepper
|
||||||
@IBOutlet weak var customStepper: UIStepper!
|
case customStepper
|
||||||
|
}
|
||||||
@IBOutlet weak var defaultStepperLabel: UILabel!
|
|
||||||
|
|
||||||
@IBOutlet weak var tintedStepperLabel: UILabel!
|
|
||||||
|
|
||||||
@IBOutlet weak var customStepperLabel: UILabel!
|
|
||||||
|
|
||||||
// MARK: - View Life Cycle
|
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
configureDefaultStepper()
|
testCells.append(contentsOf: [
|
||||||
configureTintedStepper()
|
CaseElement(title: NSLocalizedString("DefaultStepperTitle", comment: ""),
|
||||||
configureCustomStepper()
|
cellID: StepperKind.defaultStepper.rawValue,
|
||||||
|
configHandler: configureDefaultStepper),
|
||||||
|
CaseElement(title: NSLocalizedString("TintedStepperTitle", comment: ""),
|
||||||
|
cellID: StepperKind.tintedStepper.rawValue,
|
||||||
|
configHandler: configureTintedStepper),
|
||||||
|
CaseElement(title: NSLocalizedString("CustomStepperTitle", comment: ""),
|
||||||
|
cellID: StepperKind.customStepper.rawValue,
|
||||||
|
configHandler: configureCustomStepper)
|
||||||
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Configuration
|
// MARK: - Configuration
|
||||||
|
|
||||||
override func numberOfSections(in tableView: UITableView) -> Int {
|
func configureDefaultStepper(stepper: UIStepper) {
|
||||||
#if targetEnvironment(macCatalyst)
|
// Setup the stepper range 0 to 10, initial value 0, increment/decrement factor of 1.
|
||||||
// Only show for the first table cell (default stepper).
|
stepper.value = 0
|
||||||
// Tinted and Custom steppers do not exist in macOS.
|
stepper.minimumValue = 0
|
||||||
return 1
|
stepper.maximumValue = 10
|
||||||
#else
|
stepper.stepValue = 1
|
||||||
return super.numberOfSections(in: tableView)
|
|
||||||
#endif
|
stepper.addTarget(self,
|
||||||
|
action: #selector(StepperViewController.stepperValueDidChange(_:)),
|
||||||
|
for: .valueChanged)
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureDefaultStepper() {
|
func configureTintedStepper(stepper: UIStepper) {
|
||||||
defaultStepper.value = 0
|
// Setup the stepper range 0 to 20, initial value 20, increment/decrement factor of 1.
|
||||||
defaultStepper.minimumValue = 0
|
stepper.value = 20
|
||||||
defaultStepper.maximumValue = 10
|
stepper.minimumValue = 0
|
||||||
defaultStepper.stepValue = 1
|
stepper.maximumValue = 20
|
||||||
|
stepper.stepValue = 1
|
||||||
|
|
||||||
defaultStepperLabel.text = "\(Int(defaultStepper.value))"
|
stepper.tintColor = UIColor(named: "tinted_stepper_control")!
|
||||||
defaultStepper.addTarget(self,
|
stepper.setDecrementImage(stepper.decrementImage(for: .normal), for: .normal)
|
||||||
action: #selector(StepperViewController.stepperValueDidChange(_:)),
|
stepper.setIncrementImage(stepper.incrementImage(for: .normal), for: .normal)
|
||||||
for: .valueChanged)
|
|
||||||
|
stepper.addTarget(self,
|
||||||
|
action: #selector(StepperViewController.stepperValueDidChange(_:)),
|
||||||
|
for: .valueChanged)
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureTintedStepper() {
|
func configureCustomStepper(stepper: UIStepper) {
|
||||||
tintedStepper.tintColor = UIColor(named: "tinted_stepper_control")!
|
|
||||||
tintedStepper.setDecrementImage(tintedStepper.decrementImage(for: .normal), for: .normal)
|
|
||||||
tintedStepper.setIncrementImage(tintedStepper.incrementImage(for: .normal), for: .normal)
|
|
||||||
|
|
||||||
tintedStepperLabel.text = "\(Int(tintedStepper.value))"
|
|
||||||
tintedStepper.addTarget(self,
|
|
||||||
action: #selector(StepperViewController.stepperValueDidChange(_:)),
|
|
||||||
for: .valueChanged)
|
|
||||||
}
|
|
||||||
|
|
||||||
func configureCustomStepper() {
|
|
||||||
// Set the background image.
|
// Set the background image.
|
||||||
let stepperBackgroundImage = UIImage(named: "stepper_and_segment_background")
|
let stepperBackgroundImage = UIImage(named: "background")
|
||||||
customStepper.setBackgroundImage(stepperBackgroundImage, for: .normal)
|
stepper.setBackgroundImage(stepperBackgroundImage, for: .normal)
|
||||||
|
|
||||||
let stepperHighlightedBackgroundImage = UIImage(named: "stepper_and_segment_background_highlighted")
|
let stepperHighlightedBackgroundImage = UIImage(named: "background_highlighted")
|
||||||
customStepper.setBackgroundImage(stepperHighlightedBackgroundImage, for: .highlighted)
|
stepper.setBackgroundImage(stepperHighlightedBackgroundImage, for: .highlighted)
|
||||||
|
|
||||||
let stepperDisabledBackgroundImage = UIImage(named: "stepper_and_segment_background_disabled")
|
let stepperDisabledBackgroundImage = UIImage(named: "background_disabled")
|
||||||
customStepper.setBackgroundImage(stepperDisabledBackgroundImage, for: .disabled)
|
stepper.setBackgroundImage(stepperDisabledBackgroundImage, for: .disabled)
|
||||||
|
|
||||||
// Set the image which will be painted in between the two stepper segments. It depends on the states of both segments.
|
// Set the image which will be painted in between the two stepper segments. It depends on the states of both segments.
|
||||||
let stepperSegmentDividerImage = UIImage(named: "stepper_and_segment_divider")
|
let stepperSegmentDividerImage = UIImage(named: "stepper_and_segment_divider")
|
||||||
customStepper.setDividerImage(stepperSegmentDividerImage, forLeftSegmentState: .normal, rightSegmentState: .normal)
|
stepper.setDividerImage(stepperSegmentDividerImage, forLeftSegmentState: .normal, rightSegmentState: .normal)
|
||||||
|
|
||||||
// Set the image for the + button.
|
// Set the image for the + button.
|
||||||
let stepperIncrementImage = UIImage(named: "stepper_increment")
|
let stepperIncrementImage = UIImage(systemName: "plus")
|
||||||
customStepper.setIncrementImage(stepperIncrementImage, for: .normal)
|
stepper.setIncrementImage(stepperIncrementImage, for: .normal)
|
||||||
|
|
||||||
// Set the image for the - button.
|
// Set the image for the - button.
|
||||||
let stepperDecrementImage = UIImage(named: "stepper_decrement")
|
let stepperDecrementImage = UIImage(systemName: "minus")
|
||||||
customStepper.setDecrementImage(stepperDecrementImage, for: .normal)
|
stepper.setDecrementImage(stepperDecrementImage, for: .normal)
|
||||||
|
|
||||||
customStepperLabel.text = "\(Int(customStepper.value))"
|
stepper.addTarget(self, action: #selector(StepperViewController.stepperValueDidChange(_:)), for: .valueChanged)
|
||||||
customStepper.addTarget(self, action: #selector(StepperViewController.stepperValueDidChange(_:)), for: .valueChanged)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Actions
|
// MARK: - Actions
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func stepperValueDidChange(_ stepper: UIStepper) {
|
func stepperValueDidChange(_ stepper: UIStepper) {
|
||||||
print("A stepper changed its value: \(stepper).")
|
Swift.debugPrint("A stepper changed its value: \(stepper.value).")
|
||||||
|
|
||||||
// A mapping from a stepper to its associated label.
|
|
||||||
let stepperMapping = [
|
|
||||||
defaultStepper: defaultStepperLabel,
|
|
||||||
tintedStepper: tintedStepperLabel,
|
|
||||||
customStepper: customStepperLabel
|
|
||||||
]
|
|
||||||
|
|
||||||
stepperMapping[stepper]!?.text = "\(Int(stepper.value))"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,106 +7,85 @@ A view controller that demonstrates how to use `UISwitch`.
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
class SwitchViewController: UITableViewController {
|
class SwitchViewController: BaseTableViewController {
|
||||||
// MARK: - Properties
|
|
||||||
|
|
||||||
@IBOutlet weak var defaultSwitch: UISwitch!
|
// Cell identifier for each switch table view cell.
|
||||||
@IBOutlet weak var checkBoxSwitch: UISwitch!
|
enum SwitchKind: String, CaseIterable {
|
||||||
@IBOutlet weak var tintedSwitch: UISwitch!
|
case defaultSwitch
|
||||||
|
case checkBoxSwitch
|
||||||
// MARK: - View Life Cycle
|
case tintedSwitch
|
||||||
|
}
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
configureDefaultSwitch()
|
testCells.append(contentsOf: [
|
||||||
configureCheckboxSwitch() // macOS only.
|
CaseElement(title: NSLocalizedString("DefaultSwitchTitle", comment: ""),
|
||||||
configureTintedSwitch() // iOS only.
|
cellID: SwitchKind.defaultSwitch.rawValue,
|
||||||
|
configHandler: configureDefaultSwitch)
|
||||||
|
])
|
||||||
|
|
||||||
|
// Checkbox switch is available only when running on macOS.
|
||||||
|
if navigationController!.traitCollection.userInterfaceIdiom == .mac {
|
||||||
|
testCells.append(contentsOf: [
|
||||||
|
CaseElement(title: NSLocalizedString("CheckboxSwitchTitle", comment: ""),
|
||||||
|
cellID: SwitchKind.checkBoxSwitch.rawValue,
|
||||||
|
configHandler: configureCheckboxSwitch)
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tinted switch is available only when running on iOS.
|
||||||
|
if navigationController!.traitCollection.userInterfaceIdiom != .mac {
|
||||||
|
testCells.append(contentsOf: [
|
||||||
|
CaseElement(title: NSLocalizedString("TintedSwitchTitle", comment: ""),
|
||||||
|
cellID: SwitchKind.tintedSwitch.rawValue,
|
||||||
|
configHandler: configureTintedSwitch)
|
||||||
|
])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Configuration
|
// MARK: - Configuration
|
||||||
|
|
||||||
func configureDefaultSwitch() {
|
func configureDefaultSwitch(_ switchControl: UISwitch) {
|
||||||
defaultSwitch.setOn(true, animated: false)
|
switchControl.setOn(true, animated: false)
|
||||||
defaultSwitch.preferredStyle = .sliding
|
switchControl.preferredStyle = .sliding
|
||||||
|
|
||||||
defaultSwitch.addTarget(self, action: #selector(SwitchViewController.switchValueDidChange(_:)), for: .valueChanged)
|
switchControl.addTarget(self,
|
||||||
|
action: #selector(SwitchViewController.switchValueDidChange(_:)),
|
||||||
|
for: .valueChanged)
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureCheckboxSwitch() {
|
func configureCheckboxSwitch(_ switchControl: UISwitch) {
|
||||||
checkBoxSwitch.setOn(true, animated: false)
|
switchControl.setOn(true, animated: false)
|
||||||
|
|
||||||
checkBoxSwitch.addTarget(self, action: #selector(SwitchViewController.switchValueDidChange(_:)), for: .valueChanged)
|
switchControl.addTarget(self,
|
||||||
|
action: #selector(SwitchViewController.switchValueDidChange(_:)),
|
||||||
|
for: .valueChanged)
|
||||||
|
|
||||||
// On the Mac, make sure this control take on the apperance of a checkbox with a title.
|
// On the Mac, make sure this control take on the apperance of a checkbox with a title.
|
||||||
if traitCollection.userInterfaceIdiom == .mac {
|
if traitCollection.userInterfaceIdiom == .mac {
|
||||||
checkBoxSwitch.preferredStyle = .checkbox
|
switchControl.preferredStyle = .checkbox
|
||||||
|
|
||||||
// Title on a UISwitch is only supported when running Catalyst apps in the Mac Idiom.
|
// Title on a UISwitch is only supported when running Catalyst apps in the Mac Idiom.
|
||||||
checkBoxSwitch.title = NSLocalizedString("SwitchTitle", comment: "")
|
switchControl.title = NSLocalizedString("SwitchTitle", comment: "")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureTintedSwitch() {
|
func configureTintedSwitch(_ switchControl: UISwitch) {
|
||||||
tintedSwitch.tintColor = UIColor.systemBlue
|
switchControl.tintColor = UIColor.systemBlue
|
||||||
tintedSwitch.onTintColor = UIColor.systemGreen
|
switchControl.onTintColor = UIColor.systemGreen
|
||||||
tintedSwitch.thumbTintColor = UIColor.systemPurple
|
switchControl.thumbTintColor = UIColor.systemPurple
|
||||||
|
|
||||||
tintedSwitch.addTarget(self, action: #selector(SwitchViewController.switchValueDidChange(_:)), for: .valueChanged)
|
switchControl.addTarget(self,
|
||||||
|
action: #selector(SwitchViewController.switchValueDidChange(_:)),
|
||||||
// Note that on the Mac, tinted switches are not possible, so we hide the tinted one.
|
for: .valueChanged)
|
||||||
if traitCollection.userInterfaceIdiom == .mac {
|
|
||||||
tintedSwitch.isHidden = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - UITableViewDataSource
|
|
||||||
|
|
||||||
override func numberOfSections(in tableView: UITableView) -> Int {
|
|
||||||
return 3
|
|
||||||
}
|
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
|
|
||||||
#if targetEnvironment(macCatalyst)
|
|
||||||
// Don't show tinted switch control for macOS, it does not exist.
|
|
||||||
if section == 2 {
|
|
||||||
return ""
|
|
||||||
} else {
|
|
||||||
return super.tableView(tableView, titleForHeaderInSection: section)
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// Don't show checkbox switch control for iOS, it does not exist.
|
|
||||||
if section == 1 {
|
|
||||||
return ""
|
|
||||||
} else {
|
|
||||||
return super.tableView(tableView, titleForHeaderInSection: section)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView,
|
|
||||||
heightForRowAt indexPath: IndexPath) -> CGFloat {
|
|
||||||
#if targetEnvironment(macCatalyst)
|
|
||||||
// Don't show tinted switch control for macOS, it does not exist.
|
|
||||||
if indexPath.section == 2 {
|
|
||||||
return 0
|
|
||||||
} else {
|
|
||||||
return super.tableView(tableView, heightForRowAt: indexPath)
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// Don't show checkbox switch control for iOS, it does not exist.
|
|
||||||
if indexPath.section == 1 {
|
|
||||||
return 0
|
|
||||||
} else {
|
|
||||||
return super.tableView(tableView, heightForRowAt: indexPath)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Actions
|
// MARK: - Actions
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func switchValueDidChange(_ aSwitch: UISwitch) {
|
func switchValueDidChange(_ aSwitch: UISwitch) {
|
||||||
print("A switch changed its value: \(aSwitch).")
|
Swift.debugPrint("A switch changed its value: \(aSwitch.isOn).")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
103
UIKitCatalog/SymbolViewController.swift
Executable file
|
|
@ -0,0 +1,103 @@
|
||||||
|
/*
|
||||||
|
See LICENSE folder for this sample’s licensing information.
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
A view controller that demonstrates how to use SF Symbols.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
class SymbolViewController: BaseTableViewController {
|
||||||
|
|
||||||
|
// Cell identifier for each SF Symbol table view cell.
|
||||||
|
enum SymbolKind: String, CaseIterable {
|
||||||
|
case plainSymbol
|
||||||
|
case tintedSymbol
|
||||||
|
case largeSizeSymbol
|
||||||
|
case hierarchicalColorSymbol
|
||||||
|
case paletteColorsSymbol
|
||||||
|
case preferringMultiColorSymbol
|
||||||
|
}
|
||||||
|
|
||||||
|
override func viewDidLoad() {
|
||||||
|
super.viewDidLoad()
|
||||||
|
|
||||||
|
testCells.append(contentsOf: [
|
||||||
|
CaseElement(title: NSLocalizedString("PlainSymbolTitle", comment: ""),
|
||||||
|
cellID: SymbolKind.plainSymbol.rawValue,
|
||||||
|
configHandler: configurePlainSymbol),
|
||||||
|
CaseElement(title: NSLocalizedString("TintedSymbolTitle", comment: ""),
|
||||||
|
cellID: SymbolKind.tintedSymbol.rawValue,
|
||||||
|
configHandler: configureTintedSymbol),
|
||||||
|
CaseElement(title: NSLocalizedString("LargeSymbolTitle", comment: ""),
|
||||||
|
cellID: SymbolKind.largeSizeSymbol.rawValue,
|
||||||
|
configHandler: configureLargeSizeSymbol)
|
||||||
|
])
|
||||||
|
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
// These type SF Sybols, and variants are available on iOS 15, Mac Catalyst 15 or later.
|
||||||
|
testCells.append(contentsOf: [
|
||||||
|
CaseElement(title: NSLocalizedString("HierarchicalSymbolTitle", comment: ""),
|
||||||
|
cellID: SymbolKind.hierarchicalColorSymbol.rawValue,
|
||||||
|
configHandler: configureHierarchicalSymbol),
|
||||||
|
CaseElement(title: NSLocalizedString("PaletteSymbolTitle", comment: ""),
|
||||||
|
cellID: SymbolKind.paletteColorsSymbol.rawValue,
|
||||||
|
configHandler: configurePaletteColorsSymbol),
|
||||||
|
CaseElement(title: NSLocalizedString("PreferringMultiColorSymbolTitle", comment: ""),
|
||||||
|
cellID: SymbolKind.preferringMultiColorSymbol.rawValue,
|
||||||
|
configHandler: configurePreferringMultiColorSymbol)
|
||||||
|
])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - UITableViewDataSource
|
||||||
|
|
||||||
|
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
|
||||||
|
let cellTest = testCells[indexPath.section]
|
||||||
|
let cell = tableView.dequeueReusableCell(withIdentifier: cellTest.cellID)
|
||||||
|
return cell!.contentView.bounds.size.height
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Configuration
|
||||||
|
|
||||||
|
func configurePlainSymbol(_ imageView: UIImageView) {
|
||||||
|
let image = UIImage(systemName: "cloud.sun.rain.fill")
|
||||||
|
imageView.image = image
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureTintedSymbol(_ imageView: UIImageView) {
|
||||||
|
let image = UIImage(systemName: "cloud.sun.rain.fill")
|
||||||
|
imageView.image = image
|
||||||
|
imageView.tintColor = .systemPurple
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureLargeSizeSymbol(_ imageView: UIImageView) {
|
||||||
|
let image = UIImage(systemName: "cloud.sun.rain.fill")
|
||||||
|
imageView.image = image
|
||||||
|
let symbolConfig = UIImage.SymbolConfiguration(pointSize: 32, weight: .heavy, scale: .large)
|
||||||
|
imageView.preferredSymbolConfiguration = symbolConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func configureHierarchicalSymbol(_ imageView: UIImageView) {
|
||||||
|
let imageConfig = UIImage.SymbolConfiguration(hierarchicalColor: UIColor.systemRed)
|
||||||
|
let hierarchicalSymbol = UIImage(systemName: "cloud.sun.rain.fill")
|
||||||
|
imageView.image = hierarchicalSymbol
|
||||||
|
imageView.preferredSymbolConfiguration = imageConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func configurePaletteColorsSymbol(_ imageView: UIImageView) {
|
||||||
|
let palleteSymbolConfig = UIImage.SymbolConfiguration(paletteColors: [UIColor.systemRed, UIColor.systemOrange, UIColor.systemYellow])
|
||||||
|
let palleteSymbol = UIImage(systemName: "battery.100.bolt")
|
||||||
|
imageView.image = palleteSymbol
|
||||||
|
imageView.backgroundColor = UIColor.darkText
|
||||||
|
imageView.preferredSymbolConfiguration = palleteSymbolConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func configurePreferringMultiColorSymbol(_ imageView: UIImageView) {
|
||||||
|
let preferredSymbolConfig = UIImage.SymbolConfiguration.configurationPreferringMulticolor()
|
||||||
|
let preferredSymbol = UIImage(systemName: "circle.hexagongrid.fill")
|
||||||
|
imageView.image = preferredSymbol
|
||||||
|
imageView.preferredSymbolConfiguration = preferredSymbolConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -7,90 +7,114 @@ A view controller that demonstrates how to use `UITextField`.
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
class TextFieldViewController: UITableViewController {
|
class TextFieldViewController: BaseTableViewController {
|
||||||
// MARK: - Properties
|
|
||||||
|
|
||||||
@IBOutlet weak var textField: UITextField!
|
// Cell identifier for each text field table view cell.
|
||||||
@IBOutlet weak var tintedTextField: UITextField!
|
enum TextFieldKind: String, CaseIterable {
|
||||||
@IBOutlet weak var secureTextField: UITextField!
|
case textField
|
||||||
@IBOutlet weak var specificKeyboardTextField: UITextField!
|
case tintedTextField
|
||||||
@IBOutlet weak var customTextField: UITextField!
|
case secureTextField
|
||||||
@IBOutlet weak var searchTextField: CustomTextField!
|
case specificKeyboardTextField
|
||||||
|
case customTextField
|
||||||
// MARK: View Life Cycle
|
case searchTextField
|
||||||
|
}
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
configureTextField()
|
testCells.append(contentsOf: [
|
||||||
configureTintedTextField()
|
CaseElement(title: NSLocalizedString("DefaultTextFieldTitle", comment: ""),
|
||||||
configureSecureTextField()
|
cellID: TextFieldKind.textField.rawValue,
|
||||||
configureSpecificKeyboardTextField()
|
configHandler: configureTextField),
|
||||||
configureCustomTextField()
|
CaseElement(title: NSLocalizedString("TintedTextFieldTitle", comment: ""),
|
||||||
configureSearchTextField()
|
cellID: TextFieldKind.tintedTextField.rawValue,
|
||||||
|
configHandler: configureTintedTextField),
|
||||||
|
CaseElement(title: NSLocalizedString("SecuretTextFieldTitle", comment: ""),
|
||||||
|
cellID: TextFieldKind.secureTextField.rawValue,
|
||||||
|
configHandler: configureSecureTextField),
|
||||||
|
CaseElement(title: NSLocalizedString("SearchTextFieldTitle", comment: ""),
|
||||||
|
cellID: TextFieldKind.searchTextField.rawValue,
|
||||||
|
configHandler: configureSearchTextField)
|
||||||
|
])
|
||||||
|
|
||||||
|
if traitCollection.userInterfaceIdiom != .mac {
|
||||||
|
testCells.append(contentsOf: [
|
||||||
|
// Show text field with specific kind of keyboard for iOS only.
|
||||||
|
CaseElement(title: NSLocalizedString("SpecificKeyboardTextFieldTitle", comment: ""),
|
||||||
|
cellID: TextFieldKind.specificKeyboardTextField.rawValue,
|
||||||
|
configHandler: configureSpecificKeyboardTextField),
|
||||||
|
|
||||||
|
// Show text field with custom background for iOS only.
|
||||||
|
CaseElement(title: NSLocalizedString("CustomTextFieldTitle", comment: ""),
|
||||||
|
cellID: TextFieldKind.customTextField.rawValue,
|
||||||
|
configHandler: configureCustomTextField)
|
||||||
|
])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Configuration
|
// MARK: - Configuration
|
||||||
|
|
||||||
func configureTextField() {
|
func configureTextField(_ textField: UITextField) {
|
||||||
textField.placeholder = NSLocalizedString("Placeholder text", comment: "")
|
textField.placeholder = NSLocalizedString("Placeholder text", comment: "")
|
||||||
textField.autocorrectionType = .yes
|
textField.autocorrectionType = .yes
|
||||||
textField.returnKeyType = .done
|
textField.returnKeyType = .done
|
||||||
textField.clearButtonMode = .whileEditing
|
textField.clearButtonMode = .whileEditing
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureTintedTextField() {
|
func configureTintedTextField(_ textField: UITextField) {
|
||||||
tintedTextField.tintColor = UIColor.systemBlue
|
textField.tintColor = UIColor.systemBlue
|
||||||
tintedTextField.textColor = UIColor.systemGreen
|
textField.textColor = UIColor.systemGreen
|
||||||
|
|
||||||
tintedTextField.placeholder = NSLocalizedString("Placeholder text", comment: "")
|
textField.placeholder = NSLocalizedString("Placeholder text", comment: "")
|
||||||
tintedTextField.returnKeyType = .done
|
textField.returnKeyType = .done
|
||||||
tintedTextField.clearButtonMode = .never
|
textField.clearButtonMode = .never
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureSecureTextField() {
|
func configureSecureTextField(_ textField: UITextField) {
|
||||||
secureTextField.isSecureTextEntry = true
|
textField.isSecureTextEntry = true
|
||||||
|
|
||||||
secureTextField.placeholder = NSLocalizedString("Placeholder text", comment: "")
|
textField.placeholder = NSLocalizedString("Placeholder text", comment: "")
|
||||||
secureTextField.returnKeyType = .done
|
textField.returnKeyType = .done
|
||||||
secureTextField.clearButtonMode = .always
|
textField.clearButtonMode = .always
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureSearchTextField() {
|
func configureSearchTextField(_ textField: UITextField) {
|
||||||
searchTextField.placeholder = NSLocalizedString("Enter search text", comment: "")
|
if let searchField = textField as? UISearchTextField {
|
||||||
searchTextField.returnKeyType = .done
|
searchField.placeholder = NSLocalizedString("Enter search text", comment: "")
|
||||||
searchTextField.clearButtonMode = .always
|
searchField.returnKeyType = .done
|
||||||
searchTextField.allowsDeletingTokens = true
|
searchField.clearButtonMode = .always
|
||||||
|
searchField.allowsDeletingTokens = true
|
||||||
|
|
||||||
// Setup the left view as a symbol image view.
|
// Setup the left view as a symbol image view.
|
||||||
let searchIcon = UIImageView(image: UIImage(systemName: "magnifyingglass"))
|
let searchIcon = UIImageView(image: UIImage(systemName: "magnifyingglass"))
|
||||||
searchIcon.tintColor = UIColor.systemGray
|
searchIcon.tintColor = UIColor.systemGray
|
||||||
searchTextField.leftView = searchIcon
|
searchField.leftView = searchIcon
|
||||||
searchTextField.leftViewMode = .always
|
searchField.leftViewMode = .always
|
||||||
|
|
||||||
let secondToken = UISearchToken(icon: UIImage(systemName: "staroflife"), text: "Token 2")
|
let secondToken = UISearchToken(icon: UIImage(systemName: "staroflife"), text: "Token 2")
|
||||||
searchTextField.insertToken(secondToken, at: 0)
|
searchField.insertToken(secondToken, at: 0)
|
||||||
|
|
||||||
let firstToken = UISearchToken(icon: UIImage(systemName: "staroflife.fill"), text: "Token 1")
|
let firstToken = UISearchToken(icon: UIImage(systemName: "staroflife.fill"), text: "Token 1")
|
||||||
searchTextField.insertToken(firstToken, at: 0)
|
searchField.insertToken(firstToken, at: 0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** There are many different types of keyboards that you may choose to use.
|
/** There are many different types of keyboards that you may choose to use.
|
||||||
The different types of keyboards are defined in the `UITextInputTraits` interface.
|
The different types of keyboards are defined in the `UITextInputTraits` interface.
|
||||||
This example shows how to display a keyboard to help enter email addresses.
|
This example shows how to display a keyboard to help enter email addresses.
|
||||||
*/
|
*/
|
||||||
func configureSpecificKeyboardTextField() {
|
func configureSpecificKeyboardTextField(_ textField: UITextField) {
|
||||||
specificKeyboardTextField.keyboardType = .emailAddress
|
textField.keyboardType = .emailAddress
|
||||||
|
|
||||||
specificKeyboardTextField.placeholder = NSLocalizedString("Placeholder text", comment: "")
|
textField.placeholder = NSLocalizedString("Placeholder text", comment: "")
|
||||||
specificKeyboardTextField.returnKeyType = .done
|
textField.returnKeyType = .done
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureCustomTextField() {
|
func configureCustomTextField(_ textField: UITextField) {
|
||||||
// Text fields with custom image backgrounds must have no border.
|
// Text fields with custom image backgrounds must have no border.
|
||||||
customTextField.borderStyle = .none
|
textField.borderStyle = .none
|
||||||
|
|
||||||
customTextField.background = UIImage(named: "text_field_background")
|
textField.background = UIImage(named: "text_field_background")
|
||||||
|
|
||||||
// Create a purple button to be used as the right view of the custom text field.
|
// Create a purple button to be used as the right view of the custom text field.
|
||||||
let purpleImage = UIImage(named: "text_field_purple_right_view")!
|
let purpleImage = UIImage(named: "text_field_purple_right_view")!
|
||||||
|
|
@ -99,51 +123,20 @@ class TextFieldViewController: UITableViewController {
|
||||||
purpleImageButton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 5)
|
purpleImageButton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 5)
|
||||||
purpleImageButton.setImage(purpleImage, for: .normal)
|
purpleImageButton.setImage(purpleImage, for: .normal)
|
||||||
purpleImageButton.addTarget(self, action: #selector(TextFieldViewController.customTextFieldPurpleButtonClicked), for: .touchUpInside)
|
purpleImageButton.addTarget(self, action: #selector(TextFieldViewController.customTextFieldPurpleButtonClicked), for: .touchUpInside)
|
||||||
customTextField.rightView = purpleImageButton
|
textField.rightView = purpleImageButton
|
||||||
customTextField.rightViewMode = .always
|
textField.rightViewMode = .always
|
||||||
|
|
||||||
customTextField.placeholder = NSLocalizedString("Placeholder text", comment: "")
|
textField.placeholder = NSLocalizedString("Placeholder text", comment: "")
|
||||||
customTextField.autocorrectionType = .no
|
textField.autocorrectionType = .no
|
||||||
customTextField.clearButtonMode = .never
|
textField.clearButtonMode = .never
|
||||||
customTextField.returnKeyType = .done
|
textField.returnKeyType = .done
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Actions
|
// MARK: - Actions
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func customTextFieldPurpleButtonClicked() {
|
func customTextFieldPurpleButtonClicked() {
|
||||||
print("The custom text field's purple right view button was clicked.")
|
Swift.debugPrint("The custom text field's purple right view button was clicked.")
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - UITableViewDataSource
|
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
|
|
||||||
#if targetEnvironment(macCatalyst)
|
|
||||||
// Don't show text field with custom background for macOS, it does not exist.
|
|
||||||
if section == 4 {
|
|
||||||
return ""
|
|
||||||
} else {
|
|
||||||
return super.tableView(tableView, titleForHeaderInSection: section)
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return super.tableView(tableView, titleForHeaderInSection: section)
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - UITableViewDelegate
|
|
||||||
|
|
||||||
override func tableView(_ tableView: UITableView,
|
|
||||||
heightForRowAt indexPath: IndexPath) -> CGFloat {
|
|
||||||
#if targetEnvironment(macCatalyst)
|
|
||||||
// Don't show text field with custom background for macOS, it does not exist.
|
|
||||||
if indexPath.section == 4 {
|
|
||||||
return 0
|
|
||||||
} else {
|
|
||||||
return super.tableView(tableView, heightForRowAt: indexPath)
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return super.tableView(tableView, heightForRowAt: indexPath)
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -167,18 +160,21 @@ extension TextFieldViewController: UITextFieldDelegate {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Custom text field for controlling input text placement.
|
// Custom text field for controlling input text placement.
|
||||||
class CustomTextField: UISearchTextField {
|
class CustomTextField: UITextField {
|
||||||
let leftMarginPadding: CGFloat = 12
|
let leftMarginPadding: CGFloat = 12
|
||||||
|
let rightMarginPadding: CGFloat = 36
|
||||||
|
|
||||||
override func textRect(forBounds bounds: CGRect) -> CGRect {
|
override func textRect(forBounds bounds: CGRect) -> CGRect {
|
||||||
var rect = bounds
|
var rect = bounds
|
||||||
rect.origin.x += leftMarginPadding
|
rect.origin.x += leftMarginPadding
|
||||||
|
rect.size.width -= rightMarginPadding
|
||||||
return rect
|
return rect
|
||||||
}
|
}
|
||||||
|
|
||||||
override func editingRect(forBounds bounds: CGRect) -> CGRect {
|
override func editingRect(forBounds bounds: CGRect) -> CGRect {
|
||||||
var rect = bounds
|
var rect = bounds
|
||||||
rect.origin.x += leftMarginPadding
|
rect.origin.x += leftMarginPadding
|
||||||
|
rect.size.width -= rightMarginPadding
|
||||||
return rect
|
return rect
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ class TextViewController: UIViewController {
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
func handleKeyboardNotification(_ notification: Notification) {
|
func handleKeyboardNotification(_ notification: Notification) {
|
||||||
let userInfo = notification.userInfo!
|
guard let userInfo = notification.userInfo else { return }
|
||||||
|
|
||||||
// Get the animation duration.
|
// Get the animation duration.
|
||||||
var animationDuration: TimeInterval = 0
|
var animationDuration: TimeInterval = 0
|
||||||
|
|
@ -107,7 +107,7 @@ class TextViewController: UIViewController {
|
||||||
entireAttributedText.addAttribute(NSAttributedString.Key.foregroundColor, value: entireTextColor, range: entireRange)
|
entireAttributedText.addAttribute(NSAttributedString.Key.foregroundColor, value: entireTextColor, range: entireRange)
|
||||||
textView.attributedText = entireAttributedText
|
textView.attributedText = entireAttributedText
|
||||||
|
|
||||||
/** Let's modify some of the attributes of the attributed string.
|
/** Modify some of the attributes of the attributed string.
|
||||||
You can modify these attributes yourself to get a better feel for what they do.
|
You can modify these attributes yourself to get a better feel for what they do.
|
||||||
Note that the initial text is visible in the storyboard.
|
Note that the initial text is visible in the storyboard.
|
||||||
*/
|
*/
|
||||||
|
|
@ -124,9 +124,7 @@ class TextViewController: UIViewController {
|
||||||
let underlinedRange = text.range(of: NSLocalizedString("underlined", comment: ""))
|
let underlinedRange = text.range(of: NSLocalizedString("underlined", comment: ""))
|
||||||
let tintedRange = text.range(of: NSLocalizedString("tinted", comment: ""))
|
let tintedRange = text.range(of: NSLocalizedString("tinted", comment: ""))
|
||||||
|
|
||||||
/** Add bold attribute. Take the current font descriptor and create a new font descriptor
|
// Add bold attribute. Take the current font descriptor and create a new font descriptor with an additional bold trait.
|
||||||
with an additional bold trait.
|
|
||||||
*/
|
|
||||||
let boldFontDescriptor = textView.font!.fontDescriptor.withSymbolicTraits(.traitBold)
|
let boldFontDescriptor = textView.font!.fontDescriptor.withSymbolicTraits(.traitBold)
|
||||||
let boldFont = UIFont(descriptor: boldFontDescriptor!, size: 0)
|
let boldFont = UIFont(descriptor: boldFontDescriptor!, size: 0)
|
||||||
attributedText.addAttribute(NSAttributedString.Key.font, value: boldFont, range: boldRange)
|
attributedText.addAttribute(NSAttributedString.Key.font, value: boldFont, range: boldRange)
|
||||||
|
|
@ -156,6 +154,15 @@ class TextViewController: UIViewController {
|
||||||
return NSAttributedString(attachment: symbolAttachment)
|
return NSAttributedString(attachment: symbolAttachment)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func multiColorSymbolAttributedString(name: String) -> NSAttributedString {
|
||||||
|
let symbolAttachment = NSTextAttachment()
|
||||||
|
let palleteSymbolConfig = UIImage.SymbolConfiguration(paletteColors: [UIColor.systemOrange, UIColor.systemRed])
|
||||||
|
if let symbolImage = UIImage(systemName: name)?.withConfiguration(palleteSymbolConfig) {
|
||||||
|
symbolAttachment.image = symbolImage
|
||||||
|
}
|
||||||
|
return NSAttributedString(attachment: symbolAttachment)
|
||||||
|
}
|
||||||
|
|
||||||
func configureTextView() {
|
func configureTextView() {
|
||||||
let bodyFontDescriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: UIFont.TextStyle.body)
|
let bodyFontDescriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: UIFont.TextStyle.body)
|
||||||
let bodyFont = UIFont(descriptor: bodyFontDescriptor, size: 0)
|
let bodyFont = UIFont(descriptor: bodyFontDescriptor, size: 0)
|
||||||
|
|
@ -179,6 +186,12 @@ class TextViewController: UIViewController {
|
||||||
insertPoint += 1
|
insertPoint += 1
|
||||||
attributedText.insert(symbolAttributedString(name: "heart.slash"), at: insertPoint)
|
attributedText.insert(symbolAttributedString(name: "heart.slash"), at: insertPoint)
|
||||||
|
|
||||||
|
// Multi-color SF Symbols only in iOS 15 or later.
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
insertPoint += 1
|
||||||
|
attributedText.insert(multiColorSymbolAttributedString(name: "arrow.up.heart.fill"), at: insertPoint)
|
||||||
|
}
|
||||||
|
|
||||||
// Add the image as an attachment.
|
// Add the image as an attachment.
|
||||||
if let image = UIImage(named: "text_view_attachment") {
|
if let image = UIImage(named: "text_view_attachment") {
|
||||||
let textAttachment = NSTextAttachment()
|
let textAttachment = NSTextAttachment()
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,29 @@
|
||||||
<string>1</string>
|
<string>1</string>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>UIApplicationSceneManifest</key>
|
||||||
|
<dict>
|
||||||
|
<key>UIApplicationSupportsMultipleScenes</key>
|
||||||
|
<false/>
|
||||||
|
<key>UISceneConfigurations</key>
|
||||||
|
<dict>
|
||||||
|
<key>UIWindowSceneSessionRoleApplication</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>UILaunchStoryboardName</key>
|
||||||
|
<string>LaunchScreen</string>
|
||||||
|
<key>UISceneClassName</key>
|
||||||
|
<string>UIWindowScene</string>
|
||||||
|
<key>UISceneConfigurationName</key>
|
||||||
|
<string>Default Configuration</string>
|
||||||
|
<key>UISceneDelegateClassName</key>
|
||||||
|
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
|
||||||
|
<key>UISceneStoryboardFile</key>
|
||||||
|
<string>Main</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
<key>UILaunchStoryboardName</key>
|
<key>UILaunchStoryboardName</key>
|
||||||
<string>LaunchScreen</string>
|
<string>LaunchScreen</string>
|
||||||
<key>UIMainStoryboardFile</key>
|
<key>UIMainStoryboardFile</key>
|
||||||
|
|
@ -43,28 +66,5 @@
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
</array>
|
</array>
|
||||||
<key>UIApplicationSceneManifest</key>
|
|
||||||
<dict>
|
|
||||||
<key>UIApplicationSupportsMultipleScenes</key>
|
|
||||||
<false/>
|
|
||||||
<key>UISceneConfigurations</key>
|
|
||||||
<dict>
|
|
||||||
<key>UIWindowSceneSessionRoleApplication</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>UILaunchStoryboardName</key>
|
|
||||||
<string>LaunchScreen</string>
|
|
||||||
<key>UISceneClassName</key>
|
|
||||||
<string>UIWindowScene</string>
|
|
||||||
<key>UISceneConfigurationName</key>
|
|
||||||
<string>Default Configuration</string>
|
|
||||||
<key>UISceneDelegateClassName</key>
|
|
||||||
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
|
|
||||||
<key>UISceneStoryboardFile</key>
|
|
||||||
<string>Main</string>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|
|
||||||
41
UIKitCatalog/UIKitCatalog/Base.lproj/Localizable.stringsdict
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>Cart Items String</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSStringLocalizedFormatKey</key>
|
||||||
|
<string>%#@items@</string>
|
||||||
|
<key>items</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSStringFormatSpecTypeKey</key>
|
||||||
|
<string>NSStringPluralRuleType</string>
|
||||||
|
<key>NSStringFormatValueTypeKey</key>
|
||||||
|
<string>d</string>
|
||||||
|
<key>one</key>
|
||||||
|
<string>%d item</string>
|
||||||
|
<key>other</key>
|
||||||
|
<string>%d items</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
|
||||||
|
<key>Cart Tooltip String</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSStringLocalizedFormatKey</key>
|
||||||
|
<string>%#@items@</string>
|
||||||
|
<key>items</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSStringFormatSpecTypeKey</key>
|
||||||
|
<string>NSStringPluralRuleType</string>
|
||||||
|
<key>NSStringFormatValueTypeKey</key>
|
||||||
|
<string>d</string>
|
||||||
|
<key>zero</key>
|
||||||
|
<string>Cart is Empty</string>
|
||||||
|
<key>one</key>
|
||||||
|
<string>Cart has %d item</string>
|
||||||
|
<key>other</key>
|
||||||
|
<string>Cart has %d items</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
68
UIKitCatalog/VisualEffectViewController.swift
Executable file
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
See LICENSE folder for this sample’s licensing information.
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
A view controller that demonstrates how to use `UIVisualEffectView`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
class VisualEffectViewController: UIViewController {
|
||||||
|
// MARK: - Properties
|
||||||
|
|
||||||
|
@IBOutlet var imageView: UIImageView!
|
||||||
|
|
||||||
|
private var visualEffect: UIVisualEffectView = {
|
||||||
|
let vev = UIVisualEffectView(effect: UIBlurEffect(style: .regular))
|
||||||
|
vev.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
return vev
|
||||||
|
}()
|
||||||
|
|
||||||
|
private var textView: UITextView = {
|
||||||
|
let textView = UITextView(frame: CGRect())
|
||||||
|
textView.font = UIFont.systemFont(ofSize: 14)
|
||||||
|
textView.text = NSLocalizedString("VisualEffectTextContent", comment: "")
|
||||||
|
|
||||||
|
textView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
textView.backgroundColor = UIColor.clear
|
||||||
|
if let fontDescriptor = UIFontDescriptor
|
||||||
|
.preferredFontDescriptor(withTextStyle: UIFont.TextStyle.body)
|
||||||
|
.withSymbolicTraits(UIFontDescriptor.SymbolicTraits.traitLooseLeading) {
|
||||||
|
let looseLeadingFont = UIFont(descriptor: fontDescriptor, size: 0)
|
||||||
|
textView.font = looseLeadingFont
|
||||||
|
}
|
||||||
|
return textView
|
||||||
|
}()
|
||||||
|
|
||||||
|
// MARK: - View Life Cycle
|
||||||
|
|
||||||
|
override func viewDidLoad() {
|
||||||
|
super.viewDidLoad()
|
||||||
|
|
||||||
|
// Add the visual effect view in the same area covering the image view.
|
||||||
|
view.addSubview(visualEffect)
|
||||||
|
NSLayoutConstraint.activate([
|
||||||
|
visualEffect.topAnchor.constraint(equalTo: imageView.topAnchor),
|
||||||
|
visualEffect.leadingAnchor.constraint(equalTo: imageView.leadingAnchor),
|
||||||
|
visualEffect.trailingAnchor.constraint(equalTo: imageView.trailingAnchor),
|
||||||
|
visualEffect.bottomAnchor.constraint(equalTo: imageView.bottomAnchor)
|
||||||
|
])
|
||||||
|
|
||||||
|
// Add a text view as a subview to the visual effect view.
|
||||||
|
visualEffect.contentView.addSubview(textView)
|
||||||
|
NSLayoutConstraint.activate([
|
||||||
|
textView.topAnchor.constraint(equalTo: visualEffect.safeAreaLayoutGuide.topAnchor),
|
||||||
|
textView.leadingAnchor.constraint(equalTo: visualEffect.safeAreaLayoutGuide.leadingAnchor),
|
||||||
|
textView.trailingAnchor.constraint(equalTo: visualEffect.safeAreaLayoutGuide.trailingAnchor),
|
||||||
|
textView.bottomAnchor.constraint(equalTo: visualEffect.safeAreaLayoutGuide.bottomAnchor)
|
||||||
|
])
|
||||||
|
|
||||||
|
if #available(iOS 15, *) {
|
||||||
|
// Use UIToolTipInteraction which is available on iOS 15 or later, add it to the image view.
|
||||||
|
let toolTipString = NSLocalizedString("VisualEffectToolTipTitle", comment: "")
|
||||||
|
let interaction = UIToolTipInteraction(defaultToolTip: toolTipString)
|
||||||
|
imageView.addInteraction(interaction)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||