From 20ef45f80d048310b7a00acd03437b810c6b61f1 Mon Sep 17 00:00:00 2001 From: Alex King Date: Sat, 11 Apr 2020 14:57:12 -0700 Subject: [PATCH 1/7] WIP ConversionViewController --- CookSmart/CookSmart.xcodeproj/project.pbxproj | 12 ++++++ .../Conversion/ConversionViewController.swift | 41 +++++++++++++++++++ CookSmart/CookSmart/cake-Bridging-Header.h | 1 + 3 files changed, 54 insertions(+) create mode 100644 CookSmart/CookSmart/Conversion/ConversionViewController.swift diff --git a/CookSmart/CookSmart.xcodeproj/project.pbxproj b/CookSmart/CookSmart.xcodeproj/project.pbxproj index e9617ce..5812d32 100644 --- a/CookSmart/CookSmart.xcodeproj/project.pbxproj +++ b/CookSmart/CookSmart.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 396E363F24396D5900C2815B /* UnitPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 396E363E24396D5900C2815B /* UnitPickerView.swift */; }; 396E3643243976A000C2815B /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 396E3642243976A000C2815B /* GradientView.swift */; }; 396E3647243A3BDC00C2815B /* UnitPickerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 396E3646243A3BDC00C2815B /* UnitPickerDelegate.swift */; }; + 39C3CE2524426BE600359EDF /* ConversionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39C3CE2424426BE600359EDF /* ConversionViewController.swift */; }; 77479AEA242FB9C8000CFB0E /* ScaleTile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77479AE9242FB9C8000CFB0E /* ScaleTile.swift */; }; 77479AF924303D86000CFB0E /* Fonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77479AF824303D86000CFB0E /* Fonts.swift */; }; 80433B2E1BB26C1A006B7A85 /* CSRecentsIngredientGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 80433B2D1BB26C1A006B7A85 /* CSRecentsIngredientGroup.m */; }; @@ -77,6 +78,7 @@ 396E363E24396D5900C2815B /* UnitPickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnitPickerView.swift; sourceTree = ""; }; 396E3642243976A000C2815B /* GradientView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientView.swift; sourceTree = ""; }; 396E3646243A3BDC00C2815B /* UnitPickerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnitPickerDelegate.swift; sourceTree = ""; }; + 39C3CE2424426BE600359EDF /* ConversionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversionViewController.swift; sourceTree = ""; }; 77479AE8242FB9C8000CFB0E /* cake-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "cake-Bridging-Header.h"; sourceTree = ""; }; 77479AE9242FB9C8000CFB0E /* ScaleTile.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = ScaleTile.swift; sourceTree = ""; }; 77479AF824303D86000CFB0E /* Fonts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Fonts.swift; sourceTree = ""; }; @@ -166,6 +168,14 @@ path = Core; sourceTree = ""; }; + 39C3CE2224426AF700359EDF /* Conversion */ = { + isa = PBXGroup; + children = ( + 39C3CE2424426BE600359EDF /* ConversionViewController.swift */, + ); + path = Conversion; + sourceTree = ""; + }; 8000355C18B3CBF50032BF91 /* Scales */ = { isa = PBXGroup; children = ( @@ -283,6 +293,7 @@ B7BCA296180524A800CF7588 /* CookSmart */ = { isa = PBXGroup; children = ( + 39C3CE2224426AF700359EDF /* Conversion */, 392D8642242FD0CA002064D6 /* Core */, 80433B351BB2731B006B7A85 /* Launch Screen.storyboard */, 935DB3A918B46A28007989D7 /* CSEditIngredientVC.h */, @@ -533,6 +544,7 @@ 93D09934189766080014DB3E /* CSUnit.m in Sources */, 80433B2E1BB26C1A006B7A85 /* CSRecentsIngredientGroup.m in Sources */, B7BCA29D180524A800CF7588 /* main.m in Sources */, + 39C3CE2524426BE600359EDF /* ConversionViewController.swift in Sources */, 396E3643243976A000C2815B /* GradientView.swift in Sources */, 396E363D2439684E00C2815B /* UnitPickerCenterLineView.swift in Sources */, 936809701891059700655B89 /* CSIngredientListVC.m in Sources */, diff --git a/CookSmart/CookSmart/Conversion/ConversionViewController.swift b/CookSmart/CookSmart/Conversion/ConversionViewController.swift new file mode 100644 index 0000000..dfd3853 --- /dev/null +++ b/CookSmart/CookSmart/Conversion/ConversionViewController.swift @@ -0,0 +1,41 @@ +// +// ConversionViewController.swift +// cake +// +// Created by Alex King on 4/11/20. +// Copyright © 2020 Olga Galchenko. All rights reserved. +// + +import Foundation +import UIKit + +class ConversionViewController: UIViewController { + init() { + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + assertionFailure("init(coder:) has not been implemented") + return nil + } + + private lazy var scaleViewController = CSScaleVC(nibName: "CSScaleVC", bundle: nil) + + override func viewDidLoad() { + super.viewDidLoad() + + addChild(scaleViewController) + view.addSubview(scaleViewController.view) + scaleViewController.view.translatesAutoresizingMaskIntoConstraints = false + scaleViewController.delegate = self + } + + private func setupViews() { + + } +} + +extension ConversionViewController: CSScaleVCDelegate { + +} diff --git a/CookSmart/CookSmart/cake-Bridging-Header.h b/CookSmart/CookSmart/cake-Bridging-Header.h index 10e186b..7745afe 100644 --- a/CookSmart/CookSmart/cake-Bridging-Header.h +++ b/CookSmart/CookSmart/cake-Bridging-Header.h @@ -4,3 +4,4 @@ #import "CSUnit.h" #import "CSUnitCollection.h" +#import "CSScaleVC.h" From 119bdaafefc46aa93d373446c7ebcbf5f546b178 Mon Sep 17 00:00:00 2001 From: Alex King Date: Sat, 11 Apr 2020 16:11:11 -0700 Subject: [PATCH 2/7] Some stuff working --- CookSmart/CookSmart/CSScaleVC.m | 10 ++-- CookSmart/CookSmart/CSScaleView.m | 3 ++ .../Conversion/ConversionViewController.swift | 47 ++++++++++++++++--- CookSmart/CookSmart/SceneDelegate.swift | 5 +- CookSmart/CookSmart/cake-Bridging-Header.h | 2 + 5 files changed, 55 insertions(+), 12 deletions(-) diff --git a/CookSmart/CookSmart/CSScaleVC.m b/CookSmart/CookSmart/CSScaleVC.m index 9fd2bc2..d6398df 100644 --- a/CookSmart/CookSmart/CSScaleVC.m +++ b/CookSmart/CookSmart/CSScaleVC.m @@ -474,11 +474,11 @@ - (NSDictionary *)analyticsAttributes { return @{ @"ingredient_name" : self.ingredient.name, - @"ingredient_density" : [self.ingredient isIngredientDensityValid] ? [NSNumber numberWithFloat:self.ingredient.density] : [NSNumber numberWithFloat:FLT_MAX], - @"volume_unit" : self.currentVolumeUnit.name, - @"weight_unit" : self.currentWeightUnit.name, - @"volume_value" : @([self.volumeScaleScrollView getCenterValue]), - @"weight_value" : @([self.weightScaleScrollView getCenterValue]), +// @"ingredient_density" : [self.ingredient isIngredientDensityValid] ? [NSNumber numberWithFloat:self.ingredient.density] : [NSNumber numberWithFloat:FLT_MAX], +// @"volume_unit" : self.currentVolumeUnit.name, +// @"weight_unit" : self.currentWeightUnit.name, +// @"volume_value" : @([self.volumeScaleScrollView getCenterValue]), +// @"weight_value" : @([self.weightScaleScrollView getCenterValue]), }; } diff --git a/CookSmart/CookSmart/CSScaleView.m b/CookSmart/CookSmart/CSScaleView.m index 41f720b..f5f6186 100644 --- a/CookSmart/CookSmart/CSScaleView.m +++ b/CookSmart/CookSmart/CSScaleView.m @@ -206,6 +206,9 @@ static inline CGFloat getTargetContentOffset(CSScaleView *scaleView) static inline void setScrollViewOffset(CSScaleView *scaleView, CGPoint newContentOffset, BOOL cancelDeceleration) { + if (isnan(newContentOffset.y)) { + return; + } id delegate = scaleView.delegate; scaleView.delegate = nil; if (cancelDeceleration) diff --git a/CookSmart/CookSmart/Conversion/ConversionViewController.swift b/CookSmart/CookSmart/Conversion/ConversionViewController.swift index dfd3853..b2200f5 100644 --- a/CookSmart/CookSmart/Conversion/ConversionViewController.swift +++ b/CookSmart/CookSmart/Conversion/ConversionViewController.swift @@ -10,6 +10,8 @@ import Foundation import UIKit class ConversionViewController: UIViewController { + private var ingredientIndex: UInt = 0 + init() { super.init(nibName: nil, bundle: nil) } @@ -20,22 +22,55 @@ class ConversionViewController: UIViewController { return nil } - private lazy var scaleViewController = CSScaleVC(nibName: "CSScaleVC", bundle: nil) + private let ingredientLabel: UILabel = { + let label = UILabel() + label.textColor = Color.redLineColor + label.font = Fonts.regular?.withSize(20) + label.translatesAutoresizingMaskIntoConstraints = false + return label + }() + + private let ingredientLabelContainer = UIView() + + private let scaleViewController = CSScaleVC(nibName: "CSScaleVC", bundle: nil) override func viewDidLoad() { super.viewDidLoad() + setupViews() + selectIngredientAtCurrentIndex() + } + + private func setupViews() { + view.backgroundColor = .systemBackground + + ingredientLabelContainer.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(ingredientLabelContainer) + ingredientLabelContainer.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true + ingredientLabelContainer.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true + ingredientLabelContainer.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true + ingredientLabelContainer.heightAnchor.constraint(equalToConstant: 70).isActive = true + + ingredientLabelContainer.addSubview(ingredientLabel) + ingredientLabel.centerYAnchor.constraint(equalTo: ingredientLabelContainer.centerYAnchor).isActive = true + ingredientLabel.centerXAnchor.constraint(equalTo: ingredientLabelContainer.centerXAnchor).isActive = true + ingredientLabel.leadingAnchor.constraint(greaterThanOrEqualTo: ingredientLabelContainer.leadingAnchor, constant: 15).isActive = true addChild(scaleViewController) view.addSubview(scaleViewController.view) scaleViewController.view.translatesAutoresizingMaskIntoConstraints = false scaleViewController.delegate = self + + scaleViewController.view.topAnchor.constraint(equalTo: ingredientLabelContainer.bottomAnchor).isActive = true + scaleViewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true + scaleViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true + scaleViewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true } - private func setupViews() { - + private func selectIngredientAtCurrentIndex() { + let ingredient = CSIngredients.sharedInstance()?.ingredient(atFlattenedIngredientIndex: ingredientIndex) + ingredientLabel.text = ingredient?.name + scaleViewController.ingredient = ingredient } } -extension ConversionViewController: CSScaleVCDelegate { - -} +extension ConversionViewController: CSScaleVCDelegate {} diff --git a/CookSmart/CookSmart/SceneDelegate.swift b/CookSmart/CookSmart/SceneDelegate.swift index 0687251..2faa7a7 100644 --- a/CookSmart/CookSmart/SceneDelegate.swift +++ b/CookSmart/CookSmart/SceneDelegate.swift @@ -19,7 +19,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { // Use a UIHostingController as window root view controller. if let windowScene = scene as? UIWindowScene { let window = UIWindow(windowScene: windowScene) - window.rootViewController = CSConversionVC(ingredientGroupIndex: 0, ingredientIndex: 0) + +// window.rootViewController = CSConversionVC(ingredientGroupIndex: 0, ingredientIndex: 0) + window.rootViewController = ConversionViewController() + self.window = window window.makeKeyAndVisible() } diff --git a/CookSmart/CookSmart/cake-Bridging-Header.h b/CookSmart/CookSmart/cake-Bridging-Header.h index dbc8f0c..181ef86 100644 --- a/CookSmart/CookSmart/cake-Bridging-Header.h +++ b/CookSmart/CookSmart/cake-Bridging-Header.h @@ -8,3 +8,5 @@ #import "CSUnitCollection.h" #import "CSScaleVC.h" #import "CSConversionVC.h" +#import "CSIngredient.h" +#import "CSIngredients.h" From 00c4aafa85548cf3c66e96e981d3e8ce57be98d3 Mon Sep 17 00:00:00 2001 From: Alex King Date: Sat, 11 Apr 2020 17:01:21 -0700 Subject: [PATCH 3/7] Fully switched to Swift --- CookSmart/CookSmart.xcodeproj/project.pbxproj | 10 - CookSmart/CookSmart/CSConversionVC.h | 20 -- CookSmart/CookSmart/CSConversionVC.m | 272 ------------------ CookSmart/CookSmart/CSConversionVC.xib | 46 --- .../Conversion/ConversionViewController.swift | 82 ++++-- CookSmart/CookSmart/Core/Colors.swift | 8 +- CookSmart/CookSmart/Core/Fonts.swift | 1 + CookSmart/CookSmart/cake-Bridging-Header.h | 2 +- 8 files changed, 65 insertions(+), 376 deletions(-) delete mode 100644 CookSmart/CookSmart/CSConversionVC.h delete mode 100644 CookSmart/CookSmart/CSConversionVC.m delete mode 100644 CookSmart/CookSmart/CSConversionVC.xib diff --git a/CookSmart/CookSmart.xcodeproj/project.pbxproj b/CookSmart/CookSmart.xcodeproj/project.pbxproj index fe6c2f8..43c53be 100644 --- a/CookSmart/CookSmart.xcodeproj/project.pbxproj +++ b/CookSmart/CookSmart.xcodeproj/project.pbxproj @@ -33,8 +33,6 @@ 931AF96818C2B8AF0018AA8B /* WeightUnits.plist in Resources */ = {isa = PBXBuildFile; fileRef = 931AF96718C2B8AF0018AA8B /* WeightUnits.plist */; }; 931AF96A18C2B9C90018AA8B /* VolumeUnits.plist in Resources */ = {isa = PBXBuildFile; fileRef = 931AF96918C2B9C90018AA8B /* VolumeUnits.plist */; }; 931AF96D18C2BAE50018AA8B /* CSUnitCollection.m in Sources */ = {isa = PBXBuildFile; fileRef = 931AF96C18C2BAE50018AA8B /* CSUnitCollection.m */; }; - 9358BD6E1891CAAA00A99D51 /* CSConversionVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 9358BD6C1891CAAA00A99D51 /* CSConversionVC.m */; }; - 9358BD6F1891CAAA00A99D51 /* CSConversionVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9358BD6D1891CAAA00A99D51 /* CSConversionVC.xib */; }; 935DB3AC18B46A28007989D7 /* CSEditIngredientVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 935DB3AA18B46A28007989D7 /* CSEditIngredientVC.m */; }; 935DB3AD18B46A28007989D7 /* CSEditIngredientVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 935DB3AB18B46A28007989D7 /* CSEditIngredientVC.xib */; }; 936809701891059700655B89 /* CSIngredientListVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 9368096F1891059700655B89 /* CSIngredientListVC.m */; }; @@ -124,9 +122,6 @@ 931AF96918C2B9C90018AA8B /* VolumeUnits.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = VolumeUnits.plist; sourceTree = ""; }; 931AF96B18C2BAE50018AA8B /* CSUnitCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSUnitCollection.h; sourceTree = ""; }; 931AF96C18C2BAE50018AA8B /* CSUnitCollection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSUnitCollection.m; sourceTree = ""; }; - 9358BD6B1891CAAA00A99D51 /* CSConversionVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSConversionVC.h; sourceTree = ""; }; - 9358BD6C1891CAAA00A99D51 /* CSConversionVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSConversionVC.m; sourceTree = ""; }; - 9358BD6D1891CAAA00A99D51 /* CSConversionVC.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CSConversionVC.xib; sourceTree = ""; }; 935DB3A918B46A28007989D7 /* CSEditIngredientVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSEditIngredientVC.h; sourceTree = ""; }; 935DB3AA18B46A28007989D7 /* CSEditIngredientVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSEditIngredientVC.m; sourceTree = ""; }; 935DB3AB18B46A28007989D7 /* CSEditIngredientVC.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CSEditIngredientVC.xib; sourceTree = ""; }; @@ -328,9 +323,6 @@ 935DB3A918B46A28007989D7 /* CSEditIngredientVC.h */, 935DB3AA18B46A28007989D7 /* CSEditIngredientVC.m */, 935DB3AB18B46A28007989D7 /* CSEditIngredientVC.xib */, - 9358BD6B1891CAAA00A99D51 /* CSConversionVC.h */, - 9358BD6C1891CAAA00A99D51 /* CSConversionVC.m */, - 9358BD6D1891CAAA00A99D51 /* CSConversionVC.xib */, 8000355C18B3CBF50032BF91 /* Scales */, 80592C0218924AEA0082D4E1 /* Model */, 807C0B681BB3DD04007D2C03 /* Ingredient List UI */, @@ -475,7 +467,6 @@ buildActionMask = 2147483647; files = ( 931AF96818C2B8AF0018AA8B /* WeightUnits.plist in Resources */, - 9358BD6F1891CAAA00A99D51 /* CSConversionVC.xib in Resources */, 931AF96A18C2B9C90018AA8B /* VolumeUnits.plist in Resources */, B7BCA29B180524A800CF7588 /* InfoPlist.strings in Resources */, B7BCA2C01805284A00CF7588 /* Ingredients.plist in Resources */, @@ -587,7 +578,6 @@ 80592C0B1892541D0082D4E1 /* CSIngredientGroup.m in Sources */, 77479AF924303D86000CFB0E /* Fonts.swift in Sources */, 80592C1718939E030082D4E1 /* CSGradientView.m in Sources */, - 9358BD6E1891CAAA00A99D51 /* CSConversionVC.m in Sources */, 80592C0518924B010082D4E1 /* CSIngredients.m in Sources */, 807C0B6C1BB3DD4D007D2C03 /* CSIngredientListViewCell.m in Sources */, DC82F26218AC25B9004FD733 /* CSFilteredIngredientGroup.m in Sources */, diff --git a/CookSmart/CookSmart/CSConversionVC.h b/CookSmart/CookSmart/CSConversionVC.h deleted file mode 100644 index ac0d54a..0000000 --- a/CookSmart/CookSmart/CSConversionVC.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// CSConversionVC.h -// CookSmart -// -// Created by Olga Galchenko on 1/23/14. -// Copyright (c) 2014 Olga Galchenko. All rights reserved. -// - -#import -#import "CSIngredientListVC.h" -#import "CSScaleView.h" -#import "CSScaleVC.h" - -@class CSIngredientGroup; - -@interface CSConversionVC : UIViewController - -- (id)initWithIngredientGroupIndex:(NSUInteger)ingredientGroupIndex ingredientIndex:(NSUInteger)ingredientIndex; - -@end diff --git a/CookSmart/CookSmart/CSConversionVC.m b/CookSmart/CookSmart/CSConversionVC.m deleted file mode 100644 index fc28dd8..0000000 --- a/CookSmart/CookSmart/CSConversionVC.m +++ /dev/null @@ -1,272 +0,0 @@ -// -// CSConversionVC.m -// CookSmart -// -// Created by Olga Galchenko on 1/23/14. -// Copyright (c) 2014 Olga Galchenko. All rights reserved. -// - -#import "CSConversionVC.h" -#import "CSIngredients.h" -#import "CSIngredientListVC.h" -#import "CSIngredientGroup.h" -#import "CSIngredient.h" -#import "CSScaleView.h" -#import "CSUnit.h" -#import "CSUnitCollection.h" -#import "CSScaleVC.h" - -#define CHOOSE_UNITS_TEXT @"Choose Units" - -@interface CSConversionVC () - -@property (nonatomic, readwrite, assign) NSUInteger ingredientIndex; -@property (weak, nonatomic) IBOutlet UIScrollView *ingredientPickerScrollView; - -@property (strong, nonatomic) IBOutlet CSScaleVC* scaleVC; - -@end - -@implementation CSConversionVC - -- (id)initWithIngredientGroupIndex:(NSUInteger)ingredientGroupIndex ingredientIndex:(NSUInteger)ingredientIndex -{ - self = [super initWithNibName:@"CSConversionVC" bundle:nil]; - if (self) - { - self.ingredientIndex = [[CSIngredients sharedInstance] flattenedIngredientIndexForGroupIndex:ingredientGroupIndex ingredientIndex:ingredientIndex]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(ingredientDeleted:) - name:INGREDIENT_DELETE_NOTIFICATION_NAME - object:nil]; - } - return self; -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - View Lifecycle Management - -- (void)viewDidLoad -{ - [super viewDidLoad]; - - [self addChildViewController:self.scaleVC]; - [self.view addSubview:self.scaleVC.view]; - self.scaleVC.view.translatesAutoresizingMaskIntoConstraints = NO; - self.scaleVC.delegate = self; - NSLayoutConstraint* bottom = [NSLayoutConstraint constraintWithItem:self.scaleVC.view - attribute:NSLayoutAttributeBottom - relatedBy:NSLayoutRelationEqual - toItem:self.view - attribute:NSLayoutAttributeBottom - multiplier:1.0 - constant:0]; - NSLayoutConstraint* left = [NSLayoutConstraint constraintWithItem:self.scaleVC.view - attribute:NSLayoutAttributeLeft - relatedBy:NSLayoutRelationEqual - toItem:self.view - attribute:NSLayoutAttributeLeft - multiplier:1.0 - constant:0]; - NSLayoutConstraint* right = [NSLayoutConstraint constraintWithItem:self.scaleVC.view - attribute:NSLayoutAttributeRight - relatedBy:NSLayoutRelationEqual - toItem:self.view - attribute:NSLayoutAttributeRight - multiplier:1.0 - constant:0]; - NSLayoutConstraint* top = [NSLayoutConstraint constraintWithItem:self.scaleVC.view - attribute:NSLayoutAttributeTop - relatedBy:NSLayoutRelationEqual - toItem:self.ingredientPickerScrollView - attribute:NSLayoutAttributeBottom - multiplier:1.0 - constant:10]; - [self.view addConstraints:@[bottom, left, right, top]]; - self.ingredientPickerScrollView.scrollsToTop = NO; - self.ingredientPickerScrollView.showsHorizontalScrollIndicator = NO; - self.ingredientPickerScrollView.showsVerticalScrollIndicator = NO; -} - -- (void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - // When we first appear, always select the very first ingredient – the one most recently selected. - [self selectIngredientAtIndex:self.ingredientIndex]; - logViewChange(@"conversion", [self.scaleVC analyticsAttributes]); -} - -- (void)viewDidDisappear:(BOOL)animated -{ - [super viewDidDisappear:animated]; - [self markCurrentIngredientAccess]; -} - -- (void)markCurrentIngredientAccess -{ - if (self.isViewLoaded && self.view.window != nil) { - CSIngredient *ingredient = [[CSIngredients sharedInstance] ingredientAtFlattenedIngredientIndex:self.ingredientIndex]; - [ingredient markAccess]; - } -} - -#pragma mark - Ingredient Picker - -- (NSString *)nameForIngredientAtXOrigin:(CGFloat)xOrigin -{ - NSUInteger indexOfIngredient = (NSUInteger) (xOrigin/self.ingredientPickerScrollView.bounds.size.width); - NSString *nameOfIngredient = nil; - if (indexOfIngredient < [[CSIngredients sharedInstance] flattenedCountOfIngredients]) - { - nameOfIngredient = [[[CSIngredients sharedInstance] ingredientAtFlattenedIngredientIndex:indexOfIngredient] name]; - } - return nameOfIngredient; -} - -- (void)refreshIngredientNameUI -{ - self.ingredientPickerScrollView.contentSize = CGSizeMake(self.ingredientPickerScrollView.bounds.size.width*[[CSIngredients sharedInstance] flattenedCountOfIngredients], - self.ingredientPickerScrollView.bounds.size.height); - for (UIView *subview in self.ingredientPickerScrollView.subviews) - { - [subview removeFromSuperview]; - } - CGFloat initialXOffset = self.ingredientPickerScrollView.bounds.size.width*self.ingredientIndex; - for (CGFloat xOrigin = initialXOffset; xOrigin <= initialXOffset + 2*self.ingredientPickerScrollView.bounds.size.width; xOrigin += self.ingredientPickerScrollView.bounds.size.width) - { - UIButton *ingredientButton = [UIButton buttonWithType:UIButtonTypeSystem]; - ingredientButton.frame = CGRectMake(xOrigin, 0, self.ingredientPickerScrollView.bounds.size.width, self.ingredientPickerScrollView.bounds.size.height); - [ingredientButton setTitle:[self nameForIngredientAtXOrigin:xOrigin] forState:UIControlStateNormal]; - ingredientButton.titleLabel.font = [UIFont fontWithName:@"AvenirNext-Medium" size:MAJOR_BUTTON_FONT_SIZE]; - [ingredientButton setTitleColor:RED_LINE_COLOR forState:UIControlStateNormal]; - [ingredientButton setTitleColor:[UIColor blackColor] forState:UIControlStateDisabled]; - [ingredientButton addTarget:self action:@selector(handleIngredientTap:) forControlEvents:UIControlEventTouchUpInside]; - [self.ingredientPickerScrollView addSubview:ingredientButton]; - } - self.ingredientPickerScrollView.contentOffset = CGPointMake(initialXOffset, 0); -} - -- (void)handleIngredientTap:(id)sender -{ - CSIngredientListVC* ingrListVC = [[CSIngredientListVC alloc] initWithDelegate:self]; - UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:ingrListVC]; - [self presentViewController:nav animated:YES completion:nil]; -} - -- (void)scrollViewDidScroll:(UIScrollView *)scrollView -{ - CSAssert(scrollView == self.ingredientPickerScrollView, @"conversion_vc_wrong_scrollview_delegate", - @"CSConversionVC doesn't expect to be delegate of a scrollview other than its ingredientPickerScrollView"); - CGFloat minVisibleX = self.ingredientPickerScrollView.contentOffset.x; - CGFloat maxVisibleX = minVisibleX + self.ingredientPickerScrollView.bounds.size.width; - NSUInteger numSubviews = self.ingredientPickerScrollView.subviews.count; - CGFloat contentSize = self.ingredientPickerScrollView.contentSize.width; - for (UIButton *button in self.ingredientPickerScrollView.subviews) - { - if (button.frame.origin.x + button.bounds.size.width < minVisibleX && - button.frame.origin.x + (numSubviews + 1)*button.bounds.size.width <= contentSize && - button.frame.origin.x + numSubviews*button.bounds.size.width) - { - button.frame = CGRectMake(button.frame.origin.x + numSubviews*button.bounds.size.width, 0, button.frame.size.width, button.frame.size.height); - [button setTitle:[self nameForIngredientAtXOrigin:button.frame.origin.x] forState:UIControlStateNormal]; - } - if (button.frame.origin.x > maxVisibleX && - button.frame.origin.x - numSubviews*button.bounds.size.width >= 0 && - button.frame.origin.x + (1 - numSubviews)*button.bounds.size.width >= minVisibleX) - { - button.frame = CGRectMake(button.frame.origin.x - numSubviews*button.bounds.size.width, 0, button.frame.size.width, button.frame.size.height); - [button setTitle:[self nameForIngredientAtXOrigin:button.frame.origin.x] forState:UIControlStateNormal]; - } - } - - CGFloat distanceToSnap = remainder(self.ingredientPickerScrollView.contentOffset.x, self.ingredientPickerScrollView.bounds.size.width); - CGFloat distanceToMiddle = (self.ingredientPickerScrollView.bounds.size.width/2) - fabs(distanceToSnap); - CGFloat scaleViewAlpha = distanceToMiddle/(self.ingredientPickerScrollView.bounds.size.width/2); - [self.scaleVC setScalesAlpha:scaleViewAlpha]; - - NSUInteger projectedIndex = (int)round(self.ingredientPickerScrollView.contentOffset.x/self.ingredientPickerScrollView.bounds.size.width); - projectedIndex = MIN(MAX(0, projectedIndex), self.ingredientPickerScrollView.contentSize.width/self.ingredientPickerScrollView.bounds.size.width - 1); - if (projectedIndex != self.ingredientIndex) - { - self.ingredientIndex = projectedIndex; - [self refreshScalesWithCurrentIngredient]; - [self markCurrentIngredientAccess]; - logUserAction(@"ingredient_switch", [self.scaleVC analyticsAttributes]); - } -} - -#pragma mark - CSIngredientListVCDelegate - -- (void)ingredientListVC:(CSIngredientListVC *)listVC selectedIngredientGroup:(NSUInteger)ingredientGroupIndex ingredientIndex:(NSUInteger)index -{ - CSIngredientGroup *ingredientGroup = [[CSIngredients sharedInstance] ingredientGroupAtIndex:ingredientGroupIndex]; - CSIngredient *ingredient = [ingredientGroup ingredientAtIndex:index]; - logUserAction(@"ingredient_select", @{ - @"ingredient_group_name" : ingredientGroup.name, - @"ingredient_name" : ingredient.name, - @"ingredient_density" : [NSNumber numberWithFloat:ingredient.density], - }); - [self selectIngredientAtIndex:[[CSIngredients sharedInstance] flattenedIngredientIndexForGroupIndex:ingredientGroupIndex ingredientIndex:index]]; -} - -- (void)selectIngredientAtIndex:(NSUInteger)ingredientIndex -{ - self.ingredientIndex = ingredientIndex; - [self refreshIngredientNameUI]; - [self refreshScalesWithCurrentIngredient]; - [self markCurrentIngredientAccess]; -} - -- (void)refreshScalesWithCurrentIngredient -{ - self.scaleVC.ingredient = [[CSIngredients sharedInstance] ingredientAtFlattenedIngredientIndex:self.ingredientIndex]; -} - -#pragma mark - Notifications - -- (void)ingredientDeleted:(NSNotification *)notification -{ - // When an ingredient is deleted, our index into the ingredient group might change. - // In the future we might want to put a better solution for this, but for now, we'll - // just select the very first ingredient of the very first ingredient group and be done - // with it. - [self selectIngredientAtIndex:0]; -} - -#pragma mark - scaleVC delegate methods - -- (void)scaleVCDidBeginChangingUnits:(CSScaleVC*)scaleVC -{ - [self iterateOverIngredientButtons:^(UIButton *ingredientButton) { - ingredientButton.enabled = NO; - [ingredientButton setTitle:CHOOSE_UNITS_TEXT forState:UIControlStateNormal]; - }]; - [self.ingredientPickerScrollView setScrollEnabled:NO]; -} - -- (void)scaleVCDidFinishChangingUnits:(CSScaleVC *)scaleVC -{ - [self iterateOverIngredientButtons:^(UIButton *ingredientButton) { - ingredientButton.enabled = YES; - [ingredientButton setTitle:[self nameForIngredientAtXOrigin:ingredientButton.frame.origin.x] forState:UIControlStateNormal]; - }]; - [self.ingredientPickerScrollView setScrollEnabled:YES]; -} - -- (void)iterateOverIngredientButtons:(void (^)(UIButton *))work -{ - for (UIButton *ingredientButton in self.ingredientPickerScrollView.subviews) - { - if ([ingredientButton isKindOfClass:[UIButton class]]) - { - work(ingredientButton); - } - } -} - -@end diff --git a/CookSmart/CookSmart/CSConversionVC.xib b/CookSmart/CookSmart/CSConversionVC.xib deleted file mode 100644 index 7b0b092..0000000 --- a/CookSmart/CookSmart/CSConversionVC.xib +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/CookSmart/CookSmart/Conversion/ConversionViewController.swift b/CookSmart/CookSmart/Conversion/ConversionViewController.swift index b2200f5..470cfb2 100644 --- a/CookSmart/CookSmart/Conversion/ConversionViewController.swift +++ b/CookSmart/CookSmart/Conversion/ConversionViewController.swift @@ -10,6 +10,10 @@ import Foundation import UIKit class ConversionViewController: UIViewController { + private enum Constants { + static let ingredientButtonHeight: CGFloat = 75 + } + private var ingredientIndex: UInt = 0 init() { @@ -22,55 +26,87 @@ class ConversionViewController: UIViewController { return nil } - private let ingredientLabel: UILabel = { - let label = UILabel() - label.textColor = Color.redLineColor - label.font = Fonts.regular?.withSize(20) - label.translatesAutoresizingMaskIntoConstraints = false - return label + private let ingredientButton: UIButton = { + let button = UIButton(type: .system) + button.setTitleColor(Color.redLineColor, for: .normal) + button.titleLabel?.font = Fonts.medium + button.translatesAutoresizingMaskIntoConstraints = false + button.addTarget(self, action: #selector(ingredientButtonPressed), for: .touchUpInside) + return button }() - private let ingredientLabelContainer = UIView() - private let scaleViewController = CSScaleVC(nibName: "CSScaleVC", bundle: nil) + var currentIngredient: CSIngredient? { + CSIngredients.sharedInstance()?.ingredient(atFlattenedIngredientIndex: ingredientIndex) + } + override func viewDidLoad() { super.viewDidLoad() setupViews() selectIngredientAtCurrentIndex() + + NotificationCenter.default.addObserver(forName: NSNotification.Name(INGREDIENT_DELETE_NOTIFICATION_NAME), + object: nil, + queue: nil) { [weak self] _ in + self?.ingredientIndex = 0 + self?.selectIngredientAtCurrentIndex() + } } - private func setupViews() { - view.backgroundColor = .systemBackground + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + markIngredientAccess() + } - ingredientLabelContainer.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(ingredientLabelContainer) - ingredientLabelContainer.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true - ingredientLabelContainer.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true - ingredientLabelContainer.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true - ingredientLabelContainer.heightAnchor.constraint(equalToConstant: 70).isActive = true + private func setupViews() { + view.backgroundColor = Color.background - ingredientLabelContainer.addSubview(ingredientLabel) - ingredientLabel.centerYAnchor.constraint(equalTo: ingredientLabelContainer.centerYAnchor).isActive = true - ingredientLabel.centerXAnchor.constraint(equalTo: ingredientLabelContainer.centerXAnchor).isActive = true - ingredientLabel.leadingAnchor.constraint(greaterThanOrEqualTo: ingredientLabelContainer.leadingAnchor, constant: 15).isActive = true + view.addSubview(ingredientButton) + ingredientButton.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true + ingredientButton.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true + ingredientButton.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true + ingredientButton.heightAnchor.constraint(equalToConstant: Constants.ingredientButtonHeight).isActive = true addChild(scaleViewController) view.addSubview(scaleViewController.view) scaleViewController.view.translatesAutoresizingMaskIntoConstraints = false scaleViewController.delegate = self - scaleViewController.view.topAnchor.constraint(equalTo: ingredientLabelContainer.bottomAnchor).isActive = true + scaleViewController.view.topAnchor.constraint(equalTo: ingredientButton.bottomAnchor).isActive = true scaleViewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true scaleViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true scaleViewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true } private func selectIngredientAtCurrentIndex() { - let ingredient = CSIngredients.sharedInstance()?.ingredient(atFlattenedIngredientIndex: ingredientIndex) - ingredientLabel.text = ingredient?.name + guard let ingredient = CSIngredients.sharedInstance()?.ingredient(atFlattenedIngredientIndex: ingredientIndex) else { + return + } + ingredientButton.setTitle(ingredient.name, for: .normal) scaleViewController.ingredient = ingredient + markIngredientAccess() + } + + private func markIngredientAccess() { + currentIngredient?.markAccess() + } + + @objc + private func ingredientButtonPressed() { + guard let ingredientListVC = CSIngredientListVC(delegate: self) else { + return + } + let ingredientListNav = UINavigationController(rootViewController: ingredientListVC) + present(ingredientListNav, animated: true) } } extension ConversionViewController: CSScaleVCDelegate {} + +extension ConversionViewController: CSIngredientListVCDelegate { + func ingredientListVC(_ listVC: CSIngredientListVC!, selectedIngredientGroup ingredientGroupIndex: UInt, ingredientIndex index: UInt) { + ingredientIndex = CSIngredients.sharedInstance()?.flattenedIngredientIndex(forGroupIndex: ingredientGroupIndex, ingredientIndex: index) ?? 0 + selectIngredientAtCurrentIndex() + } +} diff --git a/CookSmart/CookSmart/Core/Colors.swift b/CookSmart/CookSmart/Core/Colors.swift index 6453d4c..178c8a5 100644 --- a/CookSmart/CookSmart/Core/Colors.swift +++ b/CookSmart/CookSmart/Core/Colors.swift @@ -9,17 +9,17 @@ import UIKit enum Color { - static let redLineColor = Color.color( + static let redLineColor = Color.dynamicColor( light: UIColor(red: 187.0 / 255.0, green: 1.0 / 255.0, blue: 3.0 / 255.0, alpha: 1.0), dark: UIColor(red: 187.0 / 255.0, green: 1.0 / 255.0, blue: 3.0 / 255.0, alpha: 1.0) ) - static let background = Color.color( + static let background = Color.dynamicColor( light: UIColor(red: 245.0 / 255.0, green: 245.0 / 255.0, blue: 245.0 / 255.0, alpha: 1.0), - dark: UIColor(red: 245.0 / 255.0, green: 245.0 / 255.0, blue: 245.0 / 255.0, alpha: 1.0) + dark: UIColor(red: 10.0 / 255.0, green: 10.0 / 255.0, blue: 10.0 / 255.0, alpha: 1.0) ) - private static func color(light: UIColor, dark: UIColor) -> UIColor { + private static func dynamicColor(light: UIColor, dark: UIColor) -> UIColor { UIColor { traitCollection in switch traitCollection.userInterfaceStyle { case .dark: return dark diff --git a/CookSmart/CookSmart/Core/Fonts.swift b/CookSmart/CookSmart/Core/Fonts.swift index 8b3d6c9..f9f7cee 100644 --- a/CookSmart/CookSmart/Core/Fonts.swift +++ b/CookSmart/CookSmart/Core/Fonts.swift @@ -13,4 +13,5 @@ public enum Fonts {} extension Fonts { public static let tiny = UIFont(name: "AvenirNextCondensed-Medium", size: 12) public static let regular = UIFont(name: "AvenirNext-Regular", size: 17) + public static let medium = UIFont(name: "AvenirNext-Medium", size: 20) } diff --git a/CookSmart/CookSmart/cake-Bridging-Header.h b/CookSmart/CookSmart/cake-Bridging-Header.h index 181ef86..5b7c213 100644 --- a/CookSmart/CookSmart/cake-Bridging-Header.h +++ b/CookSmart/CookSmart/cake-Bridging-Header.h @@ -7,6 +7,6 @@ #import "CSUnit.h" #import "CSUnitCollection.h" #import "CSScaleVC.h" -#import "CSConversionVC.h" #import "CSIngredient.h" #import "CSIngredients.h" +#import "CSIngredientListVC.h" From 1b2308ee93f9c178bb349f26eeb3a736325ea709 Mon Sep 17 00:00:00 2001 From: Alex King Date: Sat, 11 Apr 2020 18:05:21 -0700 Subject: [PATCH 4/7] Cleaning up --- .../Conversion/ConversionViewController.swift | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/CookSmart/CookSmart/Conversion/ConversionViewController.swift b/CookSmart/CookSmart/Conversion/ConversionViewController.swift index 470cfb2..898aab4 100644 --- a/CookSmart/CookSmart/Conversion/ConversionViewController.swift +++ b/CookSmart/CookSmart/Conversion/ConversionViewController.swift @@ -16,7 +16,7 @@ class ConversionViewController: UIViewController { private var ingredientIndex: UInt = 0 - init() { + public init() { super.init(nibName: nil, bundle: nil) } @@ -37,7 +37,7 @@ class ConversionViewController: UIViewController { private let scaleViewController = CSScaleVC(nibName: "CSScaleVC", bundle: nil) - var currentIngredient: CSIngredient? { + private var currentIngredient: CSIngredient? { CSIngredients.sharedInstance()?.ingredient(atFlattenedIngredientIndex: ingredientIndex) } @@ -46,14 +46,19 @@ class ConversionViewController: UIViewController { setupViews() selectIngredientAtCurrentIndex() - NotificationCenter.default.addObserver(forName: NSNotification.Name(INGREDIENT_DELETE_NOTIFICATION_NAME), - object: nil, - queue: nil) { [weak self] _ in + _ = NotificationCenter.default.addObserver(forName: NSNotification.Name(INGREDIENT_DELETE_NOTIFICATION_NAME), + object: nil, + queue: nil) { [weak self] _ in self?.ingredientIndex = 0 self?.selectIngredientAtCurrentIndex() } } + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + selectIngredientAtCurrentIndex() + } + override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) markIngredientAccess() @@ -71,7 +76,6 @@ class ConversionViewController: UIViewController { addChild(scaleViewController) view.addSubview(scaleViewController.view) scaleViewController.view.translatesAutoresizingMaskIntoConstraints = false - scaleViewController.delegate = self scaleViewController.view.topAnchor.constraint(equalTo: ingredientButton.bottomAnchor).isActive = true scaleViewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true @@ -102,8 +106,6 @@ class ConversionViewController: UIViewController { } } -extension ConversionViewController: CSScaleVCDelegate {} - extension ConversionViewController: CSIngredientListVCDelegate { func ingredientListVC(_ listVC: CSIngredientListVC!, selectedIngredientGroup ingredientGroupIndex: UInt, ingredientIndex index: UInt) { ingredientIndex = CSIngredients.sharedInstance()?.flattenedIngredientIndex(forGroupIndex: ingredientGroupIndex, ingredientIndex: index) ?? 0 From 9e195d176f4a8acb645572a9bf784f986120b841 Mon Sep 17 00:00:00 2001 From: Alex King Date: Sun, 12 Apr 2020 13:15:08 -0700 Subject: [PATCH 5/7] Fix build --- CookSmart/CookSmart/Conversion/ConversionViewController.swift | 2 +- CookSmart/CookSmart/cake-Bridging-Header.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CookSmart/CookSmart/Conversion/ConversionViewController.swift b/CookSmart/CookSmart/Conversion/ConversionViewController.swift index 898aab4..e7e35ea 100644 --- a/CookSmart/CookSmart/Conversion/ConversionViewController.swift +++ b/CookSmart/CookSmart/Conversion/ConversionViewController.swift @@ -29,7 +29,7 @@ class ConversionViewController: UIViewController { private let ingredientButton: UIButton = { let button = UIButton(type: .system) button.setTitleColor(Color.redLineColor, for: .normal) - button.titleLabel?.font = Fonts.medium + button.titleLabel?.font = Fonts.medium.of(size: 17) button.translatesAutoresizingMaskIntoConstraints = false button.addTarget(self, action: #selector(ingredientButtonPressed), for: .touchUpInside) return button diff --git a/CookSmart/CookSmart/cake-Bridging-Header.h b/CookSmart/CookSmart/cake-Bridging-Header.h index 5b7c213..7e89c1f 100644 --- a/CookSmart/CookSmart/cake-Bridging-Header.h +++ b/CookSmart/CookSmart/cake-Bridging-Header.h @@ -10,3 +10,4 @@ #import "CSIngredient.h" #import "CSIngredients.h" #import "CSIngredientListVC.h" +#import "CSScaleView.h" From 1fd122b6cdf56376ed307fdefe3febc7790b6498 Mon Sep 17 00:00:00 2001 From: Alex King Date: Sun, 19 Apr 2020 11:20:12 -0700 Subject: [PATCH 6/7] Fixing merge --- .../Conversion/ConversionViewController.swift | 4 ++-- .../CookSmart/Scale View/ScalesView.swift | 9 --------- CookSmart/CookSmart/ScaleViewController.swift | 18 ++++++++++-------- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/CookSmart/CookSmart/Conversion/ConversionViewController.swift b/CookSmart/CookSmart/Conversion/ConversionViewController.swift index e7e35ea..284f3fd 100644 --- a/CookSmart/CookSmart/Conversion/ConversionViewController.swift +++ b/CookSmart/CookSmart/Conversion/ConversionViewController.swift @@ -29,13 +29,13 @@ class ConversionViewController: UIViewController { private let ingredientButton: UIButton = { let button = UIButton(type: .system) button.setTitleColor(Color.redLineColor, for: .normal) - button.titleLabel?.font = Fonts.medium.of(size: 17) + button.titleLabel?.font = AvenirFont.medium.of(size: 17) button.translatesAutoresizingMaskIntoConstraints = false button.addTarget(self, action: #selector(ingredientButtonPressed), for: .touchUpInside) return button }() - private let scaleViewController = CSScaleVC(nibName: "CSScaleVC", bundle: nil) + private lazy var scaleViewController = ScaleViewController(ingredient: currentIngredient!, shouldSyncScales: true) private var currentIngredient: CSIngredient? { CSIngredients.sharedInstance()?.ingredient(atFlattenedIngredientIndex: ingredientIndex) diff --git a/CookSmart/CookSmart/Scale View/ScalesView.swift b/CookSmart/CookSmart/Scale View/ScalesView.swift index 731191a..1b64bec 100644 --- a/CookSmart/CookSmart/Scale View/ScalesView.swift +++ b/CookSmart/CookSmart/Scale View/ScalesView.swift @@ -9,15 +9,6 @@ import Combine import Foundation -extension CSConversionVC { - @objc - func addNewScaleView(ingredient: CSIngredient) { -// let scaleView = ScalesView(ingredient: ingredient) -// view.addSubview(scaleView) -// scaleView.constrainToSuperview() - } -} - class ScalesView: UIView { var ingredient: CSIngredient diff --git a/CookSmart/CookSmart/ScaleViewController.swift b/CookSmart/CookSmart/ScaleViewController.swift index 358c6de..2dd1401 100644 --- a/CookSmart/CookSmart/ScaleViewController.swift +++ b/CookSmart/CookSmart/ScaleViewController.swift @@ -30,7 +30,12 @@ class ScaleViewController: UIViewController { // MARK: Public - var ingredient: CSIngredient + var ingredient: CSIngredient { + didSet { + scalesContainer.ingredient = ingredient + } + } + var currentVolumeUnit: CSUnit { CSUnitCollection.volumeUnits()?.unit(at: 2) ?? CSUnit() } var currentWeightUnit: CSUnit { CSUnitCollection.weightUnits()?.unit(at: 2) ?? CSUnit() } @@ -42,13 +47,10 @@ class ScaleViewController: UIViewController { private let volumeUnitButton = Button() private let weightUnitButton = Button() private lazy var scalesContainer = ScalesView(ingredient: ingredient) -// private let scaleView = ScaleView( -// unitButtonText: "Cups", -// value: 1, -// unitButtonTapped: { -// print("unit button tapped") -// } -// ) + + private var unitConversionFactor: Float { + return ingredient.density(withVolumeUnit: currentVolumeUnit, andWeightUnit: currentWeightUnit) + } private func setUpViews() { // let childView = UIHostingController(rootView: scaleView) From d1c69bf181ee37e488379a8105ce4ff8c08523c0 Mon Sep 17 00:00:00 2001 From: Alex King Date: Sat, 9 May 2020 17:06:49 -0700 Subject: [PATCH 7/7] Cleanup --- CookSmart/CookSmart/CSScaleVC.m | 10 +++++----- CookSmart/CookSmart/CSScaleView.m | 3 --- CookSmart/CookSmart/SceneDelegate.swift | 1 - 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/CookSmart/CookSmart/CSScaleVC.m b/CookSmart/CookSmart/CSScaleVC.m index fd6f98a..2c11e70 100644 --- a/CookSmart/CookSmart/CSScaleVC.m +++ b/CookSmart/CookSmart/CSScaleVC.m @@ -474,11 +474,11 @@ - (NSDictionary *)analyticsAttributes { return @{ @"ingredient_name" : self.ingredient.name, -// @"ingredient_density" : [self.ingredient isIngredientDensityValid] ? [NSNumber numberWithFloat:self.ingredient.density] : [NSNumber numberWithFloat:FLT_MAX], -// @"volume_unit" : self.currentVolumeUnit.name, -// @"weight_unit" : self.currentWeightUnit.name, -// @"volume_value" : @([self.volumeScaleScrollView getCenterValue]), -// @"weight_value" : @([self.weightScaleScrollView getCenterValue]), + @"ingredient_density" : [self.ingredient isIngredientDensityValid] ? [NSNumber numberWithFloat:self.ingredient.density] : [NSNumber numberWithFloat:FLT_MAX], + @"volume_unit" : self.currentVolumeUnit.name, + @"weight_unit" : self.currentWeightUnit.name, + @"volume_value" : @([self.volumeScaleScrollView getCenterValue]), + @"weight_value" : @([self.weightScaleScrollView getCenterValue]), }; } diff --git a/CookSmart/CookSmart/CSScaleView.m b/CookSmart/CookSmart/CSScaleView.m index 60fc53e..6cc89b2 100644 --- a/CookSmart/CookSmart/CSScaleView.m +++ b/CookSmart/CookSmart/CSScaleView.m @@ -206,9 +206,6 @@ static inline CGFloat getTargetContentOffset(CSScaleView *scaleView) static inline void setScrollViewOffset(CSScaleView *scaleView, CGPoint newContentOffset, BOOL cancelDeceleration) { - if (isnan(newContentOffset.y)) { - return; - } id delegate = scaleView.delegate; scaleView.delegate = nil; if (cancelDeceleration) diff --git a/CookSmart/CookSmart/SceneDelegate.swift b/CookSmart/CookSmart/SceneDelegate.swift index 2faa7a7..ae9cd98 100644 --- a/CookSmart/CookSmart/SceneDelegate.swift +++ b/CookSmart/CookSmart/SceneDelegate.swift @@ -20,7 +20,6 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { if let windowScene = scene as? UIWindowScene { let window = UIWindow(windowScene: windowScene) -// window.rootViewController = CSConversionVC(ingredientGroupIndex: 0, ingredientIndex: 0) window.rootViewController = ConversionViewController() self.window = window