Commit 910bc08b by Rune Madsen

Merge pull request #6 from Shopify/runmad.5-buyproductviewcontroller-pushviewcontroller-support

BUYProductViewController pushViewController: support
parents 4d5f72ed 49faa9dd
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
// THE SOFTWARE. // THE SOFTWARE.
// //
#import <Foundation/Foundation.h> @import Foundation;
@import Buy; @import Buy;
@class GetShopOperation; @class GetShopOperation;
......
...@@ -43,6 +43,8 @@ ...@@ -43,6 +43,8 @@
<array> <array>
<string>armv7</string> <string>armv7</string>
</array> </array>
<key>UIRequiresFullScreen</key>
<true/>
<key>UIStatusBarTintParameters</key> <key>UIStatusBarTintParameters</key>
<dict> <dict>
<key>UINavigationBar</key> <key>UINavigationBar</key>
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
@property (nonatomic, strong) NSArray *themeTintColors; @property (nonatomic, strong) NSArray *themeTintColors;
@property (nonatomic, assign) NSInteger themeTintColorSelectedIndex; @property (nonatomic, assign) NSInteger themeTintColorSelectedIndex;
@property (nonatomic, assign) BOOL showsProductImageBackground; @property (nonatomic, assign) BOOL showsProductImageBackground;
@property (nonatomic, assign) BOOL presentViewController;
@end @end
...@@ -73,10 +74,12 @@ ...@@ -73,10 +74,12 @@
[self.tableView registerClass:[ProductViewControllerThemeStyleTableViewCell class] forCellReuseIdentifier:@"ThemeStyleCell"]; [self.tableView registerClass:[ProductViewControllerThemeStyleTableViewCell class] forCellReuseIdentifier:@"ThemeStyleCell"];
[self.tableView registerClass:[ProductViewControllerThemeTintColorTableViewCell class] forCellReuseIdentifier:@"ThemeTintColorCell"]; [self.tableView registerClass:[ProductViewControllerThemeTintColorTableViewCell class] forCellReuseIdentifier:@"ThemeTintColorCell"];
[self.tableView registerClass:[ProductViewControllerToggleTableViewCell class] forCellReuseIdentifier:@"ThemeShowsBackgroundToggleCell"]; [self.tableView registerClass:[ProductViewControllerToggleTableViewCell class] forCellReuseIdentifier:@"ThemeShowsBackgroundToggleCell"];
[self.tableView registerClass:[ProductViewControllerToggleTableViewCell class] forCellReuseIdentifier:@"ProductViewControllerPresentViewControllerToggleCell"];
self.themeTintColors = @[[UIColor colorWithRed:0.48f green:0.71f blue:0.36f alpha:1.0f], [UIColor colorWithRed:0.88 green:0.06 blue:0.05 alpha:1], [UIColor colorWithRed:0.02 green:0.54 blue:1 alpha:1]]; self.themeTintColors = @[[UIColor colorWithRed:0.48f green:0.71f blue:0.36f alpha:1.0f], [UIColor colorWithRed:0.88 green:0.06 blue:0.05 alpha:1], [UIColor colorWithRed:0.02 green:0.54 blue:1 alpha:1]];
self.themeTintColorSelectedIndex = 0; self.themeTintColorSelectedIndex = 0;
self.showsProductImageBackground = YES; self.showsProductImageBackground = YES;
self.presentViewController = YES;
if (self.collection) { if (self.collection) {
// If we're presenting with a collection, add the ability to sort // If we're presenting with a collection, add the ability to sort
...@@ -175,7 +178,7 @@ ...@@ -175,7 +178,7 @@
switch (section) { switch (section) {
case 0: case 0:
if (self.demoProductViewController) { if (self.demoProductViewController) {
return 4; return 5;
} else { } else {
return 1; return 1;
} }
...@@ -225,6 +228,15 @@ ...@@ -225,6 +228,15 @@
cell = toggleCell; cell = toggleCell;
} }
break; break;
case 4: {
ProductViewControllerToggleTableViewCell *toggleCell = (ProductViewControllerToggleTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"ProductViewControllerPresentViewControllerToggleCell" forIndexPath:indexPath];
toggleCell.textLabel.text = @"Modal Presentation";
[toggleCell.toggleSwitch setOn:self.presentViewController];
[toggleCell.toggleSwitch addTarget:self action:@selector(togglePresentViewController:) forControlEvents:UIControlEventValueChanged];
cell = toggleCell;
}
break;
default: default:
break; break;
} }
...@@ -295,7 +307,11 @@ ...@@ -295,7 +307,11 @@
BUYProductViewController *productViewController = [self productViewController]; BUYProductViewController *productViewController = [self productViewController];
[productViewController loadWithProduct:product completion:^(BOOL success, NSError *error) { [productViewController loadWithProduct:product completion:^(BOOL success, NSError *error) {
if (error == nil) { if (error == nil) {
if (self.presentViewController) {
[productViewController presentPortraitInViewController:self]; [productViewController presentPortraitInViewController:self];
} else {
[self.navigationController pushViewController:productViewController animated:YES];
}
} }
}]; }];
} }
...@@ -339,6 +355,11 @@ ...@@ -339,6 +355,11 @@
self.showsProductImageBackground = toggleSwitch.on; self.showsProductImageBackground = toggleSwitch.on;
} }
- (void)togglePresentViewController:(UISwitch*)toggleSwitch
{
self.presentViewController = toggleSwitch.on;
}
- (BUYAddress *)address - (BUYAddress *)address
{ {
BUYAddress *address = [[BUYAddress alloc] init]; BUYAddress *address = [[BUYAddress alloc] init];
...@@ -376,7 +397,11 @@ ...@@ -376,7 +397,11 @@
-(void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit -(void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{ {
if (self.presentViewController) {
[self presentViewController:viewControllerToCommit animated:YES completion:NULL]; [self presentViewController:viewControllerToCommit animated:YES completion:NULL];
} else {
[self.navigationController pushViewController:viewControllerToCommit animated:YES];
}
} }
@end @end
{ {
"DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "B8AB7D59AD74F224C9D65CE20D7D3C30D5100598", "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "150992371D08DE0BC2C0F7D24AB62392DB6F1E4C",
"DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : {
}, },
"DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : {
"27386CDE6C45B5519FB1AD62B45ACA8C18A2EFF0" : 0, "150992371D08DE0BC2C0F7D24AB62392DB6F1E4C" : 0,
"B8AB7D59AD74F224C9D65CE20D7D3C30D5100598" : 0 "B8AB7D59AD74F224C9D65CE20D7D3C30D5100598" : 0,
"27386CDE6C45B5519FB1AD62B45ACA8C18A2EFF0" : 0
}, },
"DVTSourceControlWorkspaceBlueprintIdentifierKey" : "F65CB188-9FFA-4AD7-8982-12C88FB79C9D", "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "F65CB188-9FFA-4AD7-8982-12C88FB79C9D",
"DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
"27386CDE6C45B5519FB1AD62B45ACA8C18A2EFF0" : "mobile-buy-sdk-private\/Submodules", "150992371D08DE0BC2C0F7D24AB62392DB6F1E4C" : "mobile-buy-sdk-ios\/",
"B8AB7D59AD74F224C9D65CE20D7D3C30D5100598" : "mobile-buy-sdk-private" "B8AB7D59AD74F224C9D65CE20D7D3C30D5100598" : "mobile-buy-sdk-private",
"27386CDE6C45B5519FB1AD62B45ACA8C18A2EFF0" : "mobile-buy-sdk-private\/Submodules"
}, },
"DVTSourceControlWorkspaceBlueprintNameKey" : "Mobile Buy SDK", "DVTSourceControlWorkspaceBlueprintNameKey" : "Mobile Buy SDK",
"DVTSourceControlWorkspaceBlueprintVersion" : 204, "DVTSourceControlWorkspaceBlueprintVersion" : 204,
"DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "Mobile Buy SDK.xcworkspace", "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "Mobile Buy SDK.xcworkspace",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [
{ {
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:Shopify\/mobile-buy-sdk-ios.git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "150992371D08DE0BC2C0F7D24AB62392DB6F1E4C"
},
{
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:Shopify\/BUYPaymentButton.git", "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:Shopify\/BUYPaymentButton.git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "27386CDE6C45B5519FB1AD62B45ACA8C18A2EFF0" "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "27386CDE6C45B5519FB1AD62B45ACA8C18A2EFF0"
......
...@@ -125,9 +125,17 @@ ...@@ -125,9 +125,17 @@
/** /**
* The inset for the table view and scroll indicator, allowing for custom insets. * The inset for the table view and scroll indicator, allowing for custom insets.
* *
* @param edgeInsets The edge inset to set for the table view * @param edgeInsets The edge inset to set for the table view.
* @param appendToCurrentInset A flag that allows for adding the edge insets to the current edgeinsets of the table view. * @param appendToCurrentInset A flag that allows for adding the edge insets to the current edgeinsets of the table view.
*/ */
- (void)setInsets:(UIEdgeInsets)edgeInsets appendToCurrentInset:(BOOL)appendToCurrentInset; - (void)setInsets:(UIEdgeInsets)edgeInsets appendToCurrentInset:(BOOL)appendToCurrentInset;
/**
* Sets the top inset specifically for when the product view is pushed into a navigation controller stack
* instead of presented modally.
*
* @param topInset The inset to use for insetting the product view inside the container.
*/
- (void)setTopInset:(CGFloat)topInset;
@end @end
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
@property (nonatomic, strong) UILabel *poweredByShopifyLabel; @property (nonatomic, strong) UILabel *poweredByShopifyLabel;
@property (nonatomic, strong) NSLayoutConstraint *poweredByShopifyLabelConstraint; @property (nonatomic, strong) NSLayoutConstraint *poweredByShopifyLabelConstraint;
@property (nonatomic, strong) BUYProductViewErrorView *errorView; @property (nonatomic, strong) BUYProductViewErrorView *errorView;
@property (nonatomic, strong) NSLayoutConstraint *topInsetConstraint;
@end @end
...@@ -121,11 +122,20 @@ ...@@ -121,11 +122,20 @@
options:0 options:0
metrics:nil metrics:nil
views:NSDictionaryOfVariableBindings(_tableView)]]; views:NSDictionaryOfVariableBindings(_tableView)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_tableView]|" [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_tableView]|"
options:0 options:0
metrics:nil metrics:nil
views:NSDictionaryOfVariableBindings(_tableView)]]; views:NSDictionaryOfVariableBindings(_tableView)]];
_topInsetConstraint = [NSLayoutConstraint constraintWithItem:self.tableView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:0];
[self addConstraint:_topInsetConstraint];
CGFloat size = MIN(CGRectGetWidth(rect), CGRectGetHeight(rect)); CGFloat size = MIN(CGRectGetWidth(rect), CGRectGetHeight(rect));
if ([product.images count] > 0) { if ([product.images count] > 0) {
_productViewHeader = [[BUYProductViewHeader alloc] initWithFrame:CGRectMake(0, 0, size, size) theme:theme]; _productViewHeader = [[BUYProductViewHeader alloc] initWithFrame:CGRectMake(0, 0, size, size) theme:theme];
...@@ -233,6 +243,10 @@ ...@@ -233,6 +243,10 @@
if (footerViewHeight <= 0) { if (footerViewHeight <= 0) {
footerViewHeight = 0; footerViewHeight = 0;
} }
// Add the top inset for the navigation bar (when pushed in a navigation controller stack, not presented)
footerViewHeight += -self.topInsetConstraint.constant;
self.footerHeightLayoutConstraint.constant = footerViewHeight; self.footerHeightLayoutConstraint.constant = footerViewHeight;
self.footerOffsetLayoutConstraint.constant = -footerViewHeight; self.footerOffsetLayoutConstraint.constant = -footerViewHeight;
...@@ -325,4 +339,9 @@ ...@@ -325,4 +339,9 @@
self.tableView.contentInset = self.tableView.scrollIndicatorInsets = UIEdgeInsetsMake(top, left, bottom, right); self.tableView.contentInset = self.tableView.scrollIndicatorInsets = UIEdgeInsetsMake(top, left, bottom, right);
} }
- (void)setTopInset:(CGFloat)topInset
{
self.topInsetConstraint.constant = topInset;
}
@end @end
...@@ -118,6 +118,8 @@ CGFloat const BUYMaxProductViewHeight = 640.0; ...@@ -118,6 +118,8 @@ CGFloat const BUYMaxProductViewHeight = 640.0;
attribute:NSLayoutAttributeCenterX attribute:NSLayoutAttributeCenterX
multiplier:1.0 multiplier:1.0
constant:0.0]]; constant:0.0]];
} }
return self; return self;
} }
...@@ -195,7 +197,7 @@ CGFloat const BUYMaxProductViewHeight = 640.0; ...@@ -195,7 +197,7 @@ CGFloat const BUYMaxProductViewHeight = 640.0;
- (void)setupNavigationBarAppearance - (void)setupNavigationBarAppearance
{ {
if (self.navigationBar == nil && _productView) { if (self.navigationBar == nil && _productView && self.presentingViewController != nil) {
for (UIView *view in [self.navigationController.navigationBar subviews]) { for (UIView *view in [self.navigationController.navigationBar subviews]) {
if (CGRectGetHeight(view.bounds) >= 44) { if (CGRectGetHeight(view.bounds) >= 44) {
// Get a reference to the UINavigationBar // Get a reference to the UINavigationBar
...@@ -211,6 +213,8 @@ CGFloat const BUYMaxProductViewHeight = 640.0; ...@@ -211,6 +213,8 @@ CGFloat const BUYMaxProductViewHeight = 640.0;
} }
// Hide the navigation bar // Hide the navigation bar
[self scrollViewDidScroll:self.productView.tableView]; [self scrollViewDidScroll:self.productView.tableView];
} else if (self.navigationController && _productView && self.presentingViewController == nil) {
[self.productView setTopInset:CGRectGetHeight(self.navigationController.navigationBar.bounds) + self.navigationController.topLayoutGuide.length];
} }
} }
...@@ -460,9 +464,11 @@ CGFloat const BUYMaxProductViewHeight = 640.0; ...@@ -460,9 +464,11 @@ CGFloat const BUYMaxProductViewHeight = 640.0;
[(BUYNavigationController*)self.navigationController updateCloseButtonImageWithTintColor:YES duration:0]; [(BUYNavigationController*)self.navigationController updateCloseButtonImageWithTintColor:YES duration:0];
self.navigationBar.alpha = 1; self.navigationBar.alpha = 1;
self.navigationBarTitle.alpha = 1; self.navigationBarTitle.alpha = 1;
// When using 3D Touch, the initial height of the navigation bar (without UIStatusBar) doesn't match the final height (with UIStatusBar) CGFloat topInset = 0;
// so we're forced to set it manually in case it's not tall enough. Of course, this is only valid for products with no product images. if (self.presentingViewController) {
[self.productView setInsets:UIEdgeInsetsMake(MAX(CGRectGetHeight(self.navigationBar.bounds), 64), 0, 0, 0) appendToCurrentInset:YES]; topInset = CGRectGetHeight([[(UINavigationController*)self.presentingViewController navigationBar] bounds]) + self.presentingViewController.topLayoutGuide.length;
}
[self.productView setInsets:UIEdgeInsetsMake(topInset, 0, 0, 0) appendToCurrentInset:YES];
} }
} }
} }
......
...@@ -30,7 +30,7 @@ If you would like to not include the Mobile Buy SDK Project within your existing ...@@ -30,7 +30,7 @@ If you would like to not include the Mobile Buy SDK Project within your existing
1. Open the `Mobile Buy SDK.xcodeproj` and build the `Universal Framework` Target 1. Open the `Mobile Buy SDK.xcodeproj` and build the `Universal Framework` Target
2. Drag the `Buy.framework` that was just created from `Mobile Buy SDK Sample Apps` onto the `Linked Frameworks and Libraries` section for the target you want to add the framework to. Check Copy items if needed so the framework is copied to your project 2. Drag the `Buy.framework` that was just created from `Mobile Buy SDK Sample Apps` onto the `Linked Frameworks and Libraries` section for the target you want to add the framework to. Check Copy items if needed so the framework is copied to your project
3. In the `Build Settings` tab, add `-all_load` to `Other Linker Flags`. 3. In the `Build Settings` tab, add `-all_load` to `Other Linker Flags`
#### CocoaPods #### CocoaPods
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment