├── .gitignore
├── README.md
├── UIScrollView Programmatically.xcodeproj
├── project.pbxproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ ├── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
│ └── xcuserdata
│ │ └── andreatoso.xcuserdatad
│ │ └── UserInterfaceState.xcuserstate
└── xcuserdata
│ └── andreatoso.xcuserdatad
│ └── xcschemes
│ └── xcschememanagement.plist
├── UIScrollView Programmatically
├── AppDelegate.swift
├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ └── Contents.json
│ └── Contents.json
├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
├── Info.plist
└── ViewController.swift
└── preview.gif
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | # Created by https://www.gitignore.io/api/git,xcode,macos,swift
3 | # Edit at https://www.gitignore.io/?templates=git,xcode,macos,swift
4 |
5 | ### Git ###
6 | # Created by git for backups. To disable backups in Git:
7 | # $ git config --global mergetool.keepBackup false
8 | *.orig
9 |
10 | # Created by git when using merge tools for conflicts
11 | *.BACKUP.*
12 | *.BASE.*
13 | *.LOCAL.*
14 | *.REMOTE.*
15 | *_BACKUP_*.txt
16 | *_BASE_*.txt
17 | *_LOCAL_*.txt
18 | *_REMOTE_*.txt
19 |
20 | ### macOS ###
21 | # General
22 | .DS_Store
23 | .AppleDouble
24 | .LSOverride
25 |
26 | # Icon must end with two \r
27 | Icon
28 |
29 | # Thumbnails
30 | ._*
31 |
32 | # Files that might appear in the root of a volume
33 | .DocumentRevisions-V100
34 | .fseventsd
35 | .Spotlight-V100
36 | .TemporaryItems
37 | .Trashes
38 | .VolumeIcon.icns
39 | .com.apple.timemachine.donotpresent
40 |
41 | # Directories potentially created on remote AFP share
42 | .AppleDB
43 | .AppleDesktop
44 | Network Trash Folder
45 | Temporary Items
46 | .apdisk
47 |
48 | ### Swift ###
49 | # Xcode
50 | #
51 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
52 |
53 | ## Build generated
54 | build/
55 | DerivedData/
56 |
57 | ## Various settings
58 | *.pbxuser
59 | !default.pbxuser
60 | *.mode1v3
61 | !default.mode1v3
62 | *.mode2v3
63 | !default.mode2v3
64 | *.perspectivev3
65 | !default.perspectivev3
66 | xcuserdata/
67 |
68 | ## Other
69 | *.moved-aside
70 | *.xccheckout
71 | *.xcscmblueprint
72 |
73 | ## Obj-C/Swift specific
74 | *.hmap
75 | *.ipa
76 | *.dSYM.zip
77 | *.dSYM
78 |
79 | ## Playgrounds
80 | timeline.xctimeline
81 | playground.xcworkspace
82 |
83 | # Swift Package Manager
84 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
85 | # Packages/
86 | # Package.pins
87 | # Package.resolved
88 | .build/
89 |
90 | # CocoaPods
91 | # We recommend against adding the Pods directory to your .gitignore. However
92 | # you should judge for yourself, the pros and cons are mentioned at:
93 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
94 | # Pods/
95 | # Add this line if you want to avoid checking in source code from the Xcode workspace
96 | # *.xcworkspace
97 |
98 | # Carthage
99 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
100 | # Carthage/Checkouts
101 |
102 | Carthage/Build
103 |
104 | # fastlane
105 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
106 | # screenshots whenever they are needed.
107 | # For more information about the recommended setup visit:
108 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
109 |
110 | fastlane/report.xml
111 | fastlane/Preview.html
112 | fastlane/screenshots/**/*.png
113 | fastlane/test_output
114 |
115 | # Code Injection
116 | # After new code Injection tools there's a generated folder /iOSInjectionProject
117 | # https://github.com/johnno1962/injectionforxcode
118 |
119 | iOSInjectionProject/
120 |
121 | ### Xcode ###
122 | # Xcode
123 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
124 |
125 | ## User settings
126 |
127 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
128 |
129 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
130 |
131 | ### Xcode Patch ###
132 | *.xcodeproj/*
133 | !*.xcodeproj/project.pbxproj
134 | !*.xcodeproj/xcshareddata/
135 | !*.xcworkspace/contents.xcworkspacedata
136 | /*.gcno
137 | **/xcshareddata/WorkspaceSettings.xcsettings
138 |
139 | # End of https://www.gitignore.io/api/git,xcode,macos,swift
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # UISCrollView Programmatically (Swift)
2 |
3 | Creating a UIScrollView using Autolayout (programmatically) with auto-height.
4 |
5 | ## Features
6 |
7 | * Programmatically (no storyboard / nib)
8 | * Autolayout
9 | * UIScrollView
10 | * ContentView inside UIScrollView
11 | * Dynamic height
12 | * Handles rotation
13 |
14 | ## Preview
15 |
16 |
17 |
18 | ## License
19 |
20 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details
21 |
--------------------------------------------------------------------------------
/UIScrollView Programmatically.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 02930B04220EDD9E00BA7238 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02930B03220EDD9E00BA7238 /* AppDelegate.swift */; };
11 | 02930B06220EDD9E00BA7238 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02930B05220EDD9E00BA7238 /* ViewController.swift */; };
12 | 02930B09220EDD9E00BA7238 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 02930B07220EDD9E00BA7238 /* Main.storyboard */; };
13 | 02930B0B220EDDA000BA7238 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 02930B0A220EDDA000BA7238 /* Assets.xcassets */; };
14 | 02930B0E220EDDA000BA7238 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 02930B0C220EDDA000BA7238 /* LaunchScreen.storyboard */; };
15 | /* End PBXBuildFile section */
16 |
17 | /* Begin PBXFileReference section */
18 | 02930B00220EDD9E00BA7238 /* UIScrollView Programmatically.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "UIScrollView Programmatically.app"; sourceTree = BUILT_PRODUCTS_DIR; };
19 | 02930B03220EDD9E00BA7238 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
20 | 02930B05220EDD9E00BA7238 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
21 | 02930B08220EDD9E00BA7238 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
22 | 02930B0A220EDDA000BA7238 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
23 | 02930B0D220EDDA000BA7238 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
24 | 02930B0F220EDDA000BA7238 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
25 | /* End PBXFileReference section */
26 |
27 | /* Begin PBXFrameworksBuildPhase section */
28 | 02930AFD220EDD9E00BA7238 /* Frameworks */ = {
29 | isa = PBXFrameworksBuildPhase;
30 | buildActionMask = 2147483647;
31 | files = (
32 | );
33 | runOnlyForDeploymentPostprocessing = 0;
34 | };
35 | /* End PBXFrameworksBuildPhase section */
36 |
37 | /* Begin PBXGroup section */
38 | 02930AF7220EDD9E00BA7238 = {
39 | isa = PBXGroup;
40 | children = (
41 | 02930B02220EDD9E00BA7238 /* UIScrollView Programmatically */,
42 | 02930B01220EDD9E00BA7238 /* Products */,
43 | );
44 | sourceTree = "";
45 | };
46 | 02930B01220EDD9E00BA7238 /* Products */ = {
47 | isa = PBXGroup;
48 | children = (
49 | 02930B00220EDD9E00BA7238 /* UIScrollView Programmatically.app */,
50 | );
51 | name = Products;
52 | sourceTree = "";
53 | };
54 | 02930B02220EDD9E00BA7238 /* UIScrollView Programmatically */ = {
55 | isa = PBXGroup;
56 | children = (
57 | 02930B03220EDD9E00BA7238 /* AppDelegate.swift */,
58 | 02930B05220EDD9E00BA7238 /* ViewController.swift */,
59 | 02930B07220EDD9E00BA7238 /* Main.storyboard */,
60 | 02930B0A220EDDA000BA7238 /* Assets.xcassets */,
61 | 02930B0C220EDDA000BA7238 /* LaunchScreen.storyboard */,
62 | 02930B0F220EDDA000BA7238 /* Info.plist */,
63 | );
64 | path = "UIScrollView Programmatically";
65 | sourceTree = "";
66 | };
67 | /* End PBXGroup section */
68 |
69 | /* Begin PBXNativeTarget section */
70 | 02930AFF220EDD9E00BA7238 /* UIScrollView Programmatically */ = {
71 | isa = PBXNativeTarget;
72 | buildConfigurationList = 02930B12220EDDA000BA7238 /* Build configuration list for PBXNativeTarget "UIScrollView Programmatically" */;
73 | buildPhases = (
74 | 02930AFC220EDD9E00BA7238 /* Sources */,
75 | 02930AFD220EDD9E00BA7238 /* Frameworks */,
76 | 02930AFE220EDD9E00BA7238 /* Resources */,
77 | );
78 | buildRules = (
79 | );
80 | dependencies = (
81 | );
82 | name = "UIScrollView Programmatically";
83 | productName = "UIScrollView Programmatically";
84 | productReference = 02930B00220EDD9E00BA7238 /* UIScrollView Programmatically.app */;
85 | productType = "com.apple.product-type.application";
86 | };
87 | /* End PBXNativeTarget section */
88 |
89 | /* Begin PBXProject section */
90 | 02930AF8220EDD9E00BA7238 /* Project object */ = {
91 | isa = PBXProject;
92 | attributes = {
93 | LastSwiftUpdateCheck = 1010;
94 | LastUpgradeCheck = 1010;
95 | ORGANIZATIONNAME = "Andrea Toso";
96 | TargetAttributes = {
97 | 02930AFF220EDD9E00BA7238 = {
98 | CreatedOnToolsVersion = 10.1;
99 | };
100 | };
101 | };
102 | buildConfigurationList = 02930AFB220EDD9E00BA7238 /* Build configuration list for PBXProject "UIScrollView Programmatically" */;
103 | compatibilityVersion = "Xcode 9.3";
104 | developmentRegion = en;
105 | hasScannedForEncodings = 0;
106 | knownRegions = (
107 | en,
108 | Base,
109 | );
110 | mainGroup = 02930AF7220EDD9E00BA7238;
111 | productRefGroup = 02930B01220EDD9E00BA7238 /* Products */;
112 | projectDirPath = "";
113 | projectRoot = "";
114 | targets = (
115 | 02930AFF220EDD9E00BA7238 /* UIScrollView Programmatically */,
116 | );
117 | };
118 | /* End PBXProject section */
119 |
120 | /* Begin PBXResourcesBuildPhase section */
121 | 02930AFE220EDD9E00BA7238 /* Resources */ = {
122 | isa = PBXResourcesBuildPhase;
123 | buildActionMask = 2147483647;
124 | files = (
125 | 02930B0E220EDDA000BA7238 /* LaunchScreen.storyboard in Resources */,
126 | 02930B0B220EDDA000BA7238 /* Assets.xcassets in Resources */,
127 | 02930B09220EDD9E00BA7238 /* Main.storyboard in Resources */,
128 | );
129 | runOnlyForDeploymentPostprocessing = 0;
130 | };
131 | /* End PBXResourcesBuildPhase section */
132 |
133 | /* Begin PBXSourcesBuildPhase section */
134 | 02930AFC220EDD9E00BA7238 /* Sources */ = {
135 | isa = PBXSourcesBuildPhase;
136 | buildActionMask = 2147483647;
137 | files = (
138 | 02930B06220EDD9E00BA7238 /* ViewController.swift in Sources */,
139 | 02930B04220EDD9E00BA7238 /* AppDelegate.swift in Sources */,
140 | );
141 | runOnlyForDeploymentPostprocessing = 0;
142 | };
143 | /* End PBXSourcesBuildPhase section */
144 |
145 | /* Begin PBXVariantGroup section */
146 | 02930B07220EDD9E00BA7238 /* Main.storyboard */ = {
147 | isa = PBXVariantGroup;
148 | children = (
149 | 02930B08220EDD9E00BA7238 /* Base */,
150 | );
151 | name = Main.storyboard;
152 | sourceTree = "";
153 | };
154 | 02930B0C220EDDA000BA7238 /* LaunchScreen.storyboard */ = {
155 | isa = PBXVariantGroup;
156 | children = (
157 | 02930B0D220EDDA000BA7238 /* Base */,
158 | );
159 | name = LaunchScreen.storyboard;
160 | sourceTree = "";
161 | };
162 | /* End PBXVariantGroup section */
163 |
164 | /* Begin XCBuildConfiguration section */
165 | 02930B10220EDDA000BA7238 /* Debug */ = {
166 | isa = XCBuildConfiguration;
167 | buildSettings = {
168 | ALWAYS_SEARCH_USER_PATHS = NO;
169 | CLANG_ANALYZER_NONNULL = YES;
170 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
171 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
172 | CLANG_CXX_LIBRARY = "libc++";
173 | CLANG_ENABLE_MODULES = YES;
174 | CLANG_ENABLE_OBJC_ARC = YES;
175 | CLANG_ENABLE_OBJC_WEAK = YES;
176 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
177 | CLANG_WARN_BOOL_CONVERSION = YES;
178 | CLANG_WARN_COMMA = YES;
179 | CLANG_WARN_CONSTANT_CONVERSION = YES;
180 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
181 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
182 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
183 | CLANG_WARN_EMPTY_BODY = YES;
184 | CLANG_WARN_ENUM_CONVERSION = YES;
185 | CLANG_WARN_INFINITE_RECURSION = YES;
186 | CLANG_WARN_INT_CONVERSION = YES;
187 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
188 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
189 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
190 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
191 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
192 | CLANG_WARN_STRICT_PROTOTYPES = YES;
193 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
194 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
195 | CLANG_WARN_UNREACHABLE_CODE = YES;
196 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
197 | CODE_SIGN_IDENTITY = "iPhone Developer";
198 | COPY_PHASE_STRIP = NO;
199 | DEBUG_INFORMATION_FORMAT = dwarf;
200 | ENABLE_STRICT_OBJC_MSGSEND = YES;
201 | ENABLE_TESTABILITY = YES;
202 | GCC_C_LANGUAGE_STANDARD = gnu11;
203 | GCC_DYNAMIC_NO_PIC = NO;
204 | GCC_NO_COMMON_BLOCKS = YES;
205 | GCC_OPTIMIZATION_LEVEL = 0;
206 | GCC_PREPROCESSOR_DEFINITIONS = (
207 | "DEBUG=1",
208 | "$(inherited)",
209 | );
210 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
211 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
212 | GCC_WARN_UNDECLARED_SELECTOR = YES;
213 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
214 | GCC_WARN_UNUSED_FUNCTION = YES;
215 | GCC_WARN_UNUSED_VARIABLE = YES;
216 | IPHONEOS_DEPLOYMENT_TARGET = 12.1;
217 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
218 | MTL_FAST_MATH = YES;
219 | ONLY_ACTIVE_ARCH = YES;
220 | SDKROOT = iphoneos;
221 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
222 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
223 | };
224 | name = Debug;
225 | };
226 | 02930B11220EDDA000BA7238 /* Release */ = {
227 | isa = XCBuildConfiguration;
228 | buildSettings = {
229 | ALWAYS_SEARCH_USER_PATHS = NO;
230 | CLANG_ANALYZER_NONNULL = YES;
231 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
232 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
233 | CLANG_CXX_LIBRARY = "libc++";
234 | CLANG_ENABLE_MODULES = YES;
235 | CLANG_ENABLE_OBJC_ARC = YES;
236 | CLANG_ENABLE_OBJC_WEAK = YES;
237 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
238 | CLANG_WARN_BOOL_CONVERSION = YES;
239 | CLANG_WARN_COMMA = YES;
240 | CLANG_WARN_CONSTANT_CONVERSION = YES;
241 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
242 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
243 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
244 | CLANG_WARN_EMPTY_BODY = YES;
245 | CLANG_WARN_ENUM_CONVERSION = YES;
246 | CLANG_WARN_INFINITE_RECURSION = YES;
247 | CLANG_WARN_INT_CONVERSION = YES;
248 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
249 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
250 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
251 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
252 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
253 | CLANG_WARN_STRICT_PROTOTYPES = YES;
254 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
255 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
256 | CLANG_WARN_UNREACHABLE_CODE = YES;
257 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
258 | CODE_SIGN_IDENTITY = "iPhone Developer";
259 | COPY_PHASE_STRIP = NO;
260 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
261 | ENABLE_NS_ASSERTIONS = NO;
262 | ENABLE_STRICT_OBJC_MSGSEND = YES;
263 | GCC_C_LANGUAGE_STANDARD = gnu11;
264 | GCC_NO_COMMON_BLOCKS = YES;
265 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
266 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
267 | GCC_WARN_UNDECLARED_SELECTOR = YES;
268 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
269 | GCC_WARN_UNUSED_FUNCTION = YES;
270 | GCC_WARN_UNUSED_VARIABLE = YES;
271 | IPHONEOS_DEPLOYMENT_TARGET = 12.1;
272 | MTL_ENABLE_DEBUG_INFO = NO;
273 | MTL_FAST_MATH = YES;
274 | SDKROOT = iphoneos;
275 | SWIFT_COMPILATION_MODE = wholemodule;
276 | SWIFT_OPTIMIZATION_LEVEL = "-O";
277 | VALIDATE_PRODUCT = YES;
278 | };
279 | name = Release;
280 | };
281 | 02930B13220EDDA000BA7238 /* Debug */ = {
282 | isa = XCBuildConfiguration;
283 | buildSettings = {
284 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
285 | CODE_SIGN_STYLE = Automatic;
286 | DEVELOPMENT_TEAM = 5ZY53UGE4V;
287 | INFOPLIST_FILE = "UIScrollView Programmatically/Info.plist";
288 | LD_RUNPATH_SEARCH_PATHS = (
289 | "$(inherited)",
290 | "@executable_path/Frameworks",
291 | );
292 | PRODUCT_BUNDLE_IDENTIFIER = "com.andreatoso.UIScrollView-Programmatically";
293 | PRODUCT_NAME = "$(TARGET_NAME)";
294 | SWIFT_VERSION = 4.2;
295 | TARGETED_DEVICE_FAMILY = "1,2";
296 | };
297 | name = Debug;
298 | };
299 | 02930B14220EDDA000BA7238 /* Release */ = {
300 | isa = XCBuildConfiguration;
301 | buildSettings = {
302 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
303 | CODE_SIGN_STYLE = Automatic;
304 | DEVELOPMENT_TEAM = 5ZY53UGE4V;
305 | INFOPLIST_FILE = "UIScrollView Programmatically/Info.plist";
306 | LD_RUNPATH_SEARCH_PATHS = (
307 | "$(inherited)",
308 | "@executable_path/Frameworks",
309 | );
310 | PRODUCT_BUNDLE_IDENTIFIER = "com.andreatoso.UIScrollView-Programmatically";
311 | PRODUCT_NAME = "$(TARGET_NAME)";
312 | SWIFT_VERSION = 4.2;
313 | TARGETED_DEVICE_FAMILY = "1,2";
314 | };
315 | name = Release;
316 | };
317 | /* End XCBuildConfiguration section */
318 |
319 | /* Begin XCConfigurationList section */
320 | 02930AFB220EDD9E00BA7238 /* Build configuration list for PBXProject "UIScrollView Programmatically" */ = {
321 | isa = XCConfigurationList;
322 | buildConfigurations = (
323 | 02930B10220EDDA000BA7238 /* Debug */,
324 | 02930B11220EDDA000BA7238 /* Release */,
325 | );
326 | defaultConfigurationIsVisible = 0;
327 | defaultConfigurationName = Release;
328 | };
329 | 02930B12220EDDA000BA7238 /* Build configuration list for PBXNativeTarget "UIScrollView Programmatically" */ = {
330 | isa = XCConfigurationList;
331 | buildConfigurations = (
332 | 02930B13220EDDA000BA7238 /* Debug */,
333 | 02930B14220EDDA000BA7238 /* Release */,
334 | );
335 | defaultConfigurationIsVisible = 0;
336 | defaultConfigurationName = Release;
337 | };
338 | /* End XCConfigurationList section */
339 | };
340 | rootObject = 02930AF8220EDD9E00BA7238 /* Project object */;
341 | }
342 |
--------------------------------------------------------------------------------
/UIScrollView Programmatically.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/UIScrollView Programmatically.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/UIScrollView Programmatically.xcodeproj/project.xcworkspace/xcuserdata/andreatoso.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreatoso/UIScrollView-Programmatically/733e8361707c18cd8ef9e3e090b206798f77d9a1/UIScrollView Programmatically.xcodeproj/project.xcworkspace/xcuserdata/andreatoso.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/UIScrollView Programmatically.xcodeproj/xcuserdata/andreatoso.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | UIScrollView Programmatically.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/UIScrollView Programmatically/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // UIScrollView Programmatically
4 | //
5 | // Created by Andrea Toso on 09/02/2019.
6 | // Copyright © 2019 Andrea Toso. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
18 |
19 | window = UIWindow()
20 | window?.makeKeyAndVisible()
21 |
22 | window?.rootViewController = ViewController()
23 |
24 | return true
25 | }
26 |
27 | func applicationWillResignActive(_ application: UIApplication) {
28 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
29 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
30 | }
31 |
32 | func applicationDidEnterBackground(_ application: UIApplication) {
33 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
34 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
35 | }
36 |
37 | func applicationWillEnterForeground(_ application: UIApplication) {
38 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
39 | }
40 |
41 | func applicationDidBecomeActive(_ application: UIApplication) {
42 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
43 | }
44 |
45 | func applicationWillTerminate(_ application: UIApplication) {
46 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
47 | }
48 |
49 |
50 | }
51 |
52 |
--------------------------------------------------------------------------------
/UIScrollView Programmatically/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/UIScrollView Programmatically/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/UIScrollView Programmatically/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/UIScrollView Programmatically/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/UIScrollView Programmatically/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UILaunchStoryboardName
24 | LaunchScreen
25 | UIMainStoryboardFile
26 | Main
27 | UIRequiredDeviceCapabilities
28 |
29 | armv7
30 |
31 | UISupportedInterfaceOrientations
32 |
33 | UIInterfaceOrientationPortrait
34 | UIInterfaceOrientationLandscapeLeft
35 | UIInterfaceOrientationLandscapeRight
36 |
37 | UISupportedInterfaceOrientations~ipad
38 |
39 | UIInterfaceOrientationPortrait
40 | UIInterfaceOrientationPortraitUpsideDown
41 | UIInterfaceOrientationLandscapeLeft
42 | UIInterfaceOrientationLandscapeRight
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/UIScrollView Programmatically/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // UIScrollView Programmatically
4 | //
5 | // Created by Andrea Toso on 09/02/2019.
6 | // Copyright © 2019 Andrea Toso. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class ViewController: UIViewController {
12 |
13 | let scrollView = UIScrollView()
14 | let contentView = UIView()
15 |
16 | override func viewDidLoad() {
17 | super.viewDidLoad()
18 |
19 | setupScrollView()
20 | setupViews()
21 | }
22 |
23 | func setupScrollView(){
24 | scrollView.translatesAutoresizingMaskIntoConstraints = false
25 | contentView.translatesAutoresizingMaskIntoConstraints = false
26 |
27 | view.addSubview(scrollView)
28 | scrollView.addSubview(contentView)
29 |
30 | scrollView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
31 | scrollView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
32 | scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
33 | scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
34 |
35 | contentView.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor).isActive = true
36 | contentView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true
37 | contentView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
38 | contentView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
39 | }
40 |
41 | func setupViews(){
42 | contentView.addSubview(label1)
43 | label1.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
44 | label1.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
45 | label1.widthAnchor.constraint(equalTo: contentView.widthAnchor, multiplier: 3/4).isActive = true
46 |
47 | contentView.addSubview(label2)
48 | label2.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
49 | label2.topAnchor.constraint(equalTo: label1.bottomAnchor, constant: 25).isActive = true
50 | label2.widthAnchor.constraint(equalTo: contentView.widthAnchor, multiplier: 3/4).isActive = true
51 | label2.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
52 | }
53 |
54 | let label1: UILabel = {
55 | let label = UILabel()
56 | label.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborumLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborumLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.............."
57 | label.numberOfLines = 0
58 | label.sizeToFit()
59 | label.textColor = UIColor.white
60 | label.translatesAutoresizingMaskIntoConstraints = false
61 | return label
62 | }()
63 |
64 | let label2: UILabel = {
65 | let label = UILabel()
66 | label.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
67 | label.numberOfLines = 0
68 | label.sizeToFit()
69 | label.textColor = UIColor.white
70 | label.translatesAutoresizingMaskIntoConstraints = false
71 | return label
72 | }()
73 |
74 | }
75 |
76 |
--------------------------------------------------------------------------------
/preview.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreatoso/UIScrollView-Programmatically/733e8361707c18cd8ef9e3e090b206798f77d9a1/preview.gif
--------------------------------------------------------------------------------