[iOS] New pin color picker

This commit is contained in:
Kirill Zhdanovich 2013-05-28 23:44:09 +03:00 committed by Alex Zolotarev
parent c9324a88ab
commit 97fde6bce3
5 changed files with 252 additions and 96 deletions

View file

@ -4,15 +4,18 @@
@class BalloonView;
@interface PlacePageVC : UITableViewController <UITextFieldDelegate, UIActionSheetDelegate, MFMailComposeViewControllerDelegate, MFMessageComposeViewControllerDelegate>
@interface PlacePageVC : UITableViewController <UITextFieldDelegate, UIActionSheetDelegate, MFMailComposeViewControllerDelegate, MFMessageComposeViewControllerDelegate, UIPickerViewDelegate>
{
BOOL m_hideNavBar;
// @TODO store as a property to retain reference
BalloonView * m_balloon;
// If YES, pin should be removed when closing this dialog
BOOL m_removePinOnClose;
int selectedRow;
}
@property (nonatomic, retain) NSArray * pinsArray;
- (id) initWithBalloonView:(BalloonView *)view;
@end

View file

@ -1,16 +1,93 @@
#import "PlacePageVC.h"
#import "BalloonView.h"
#import "SelectSetVC.h"
#import "SelectColorVC.h"
#import "EditDescriptionVC.h"
#import "Statistics.h"
#import "MapsAppDelegate.h"
#import "MapViewController.h"
@interface PinPickerView : UIView
- (id)initWithImage:(UIImage *)image;
+ (CGFloat)viewWidth;
+ (CGFloat)viewHeight;
@end
@interface PinPickerView ()
@property (nonatomic, retain) UILabel * titleLabel;
@end
@implementation PinPickerView
CGFloat const pWidth = 200;
CGFloat const pHeight = 36;
CGFloat const pMargin = 10;
+ (CGFloat)viewWidth
{
return pWidth;
}
+ (CGFloat)viewHeight
{
return pHeight;
}
- (id)initWithImage:(UIImage *)image
{
self = [super initWithFrame:CGRectMake(0.0, 0.0, pWidth, pHeight)];
if (self)
{
CGFloat y = (self.bounds.size.height - image.size.height) / 2;
UIImageView * imageView = [[UIImageView alloc] initWithFrame:
CGRectMake(pMargin,
y,
image.size.width,
image.size.height)];
imageView.image = image;
[self addSubview:imageView];
[imageView release];
}
return self;
}
// Enable accessibility for this view.
- (BOOL)isAccessibilityElement
{
return YES;
}
// Return a string that describes this view.
- (NSString *)accessibilityLabel
{
return self.titleLabel.text;
}
@end
#define TEXTFIELD_TAG 999
static NSString * const g_colors [] =
{
@"placemark-red",
@"placemark-blue",
@"placemark-brown",
@"placemark-green",
@"placemark-orange",
@"placemark-pink",
@"placemark-purple"
};
@interface PlacePageVC()
@property (nonatomic, retain) UIView * viewWithPicker;
@end
@implementation PlacePageVC
@synthesize pinsArray, viewWithPicker;
- (id) initWithBalloonView:(BalloonView *)view
{
self = [super initWithStyle:UITableViewStyleGrouped];
@ -19,10 +96,29 @@
m_balloon = view;
self.title = m_balloon.title;
m_balloon.isCurrentPosition = NO;
NSMutableArray * viewArray = [[NSMutableArray alloc] init];
for (size_t i = 0; i < ARRAY_SIZE(g_colors); ++i)
{
PinPickerView * pinView = [[PinPickerView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"%@.png", g_colors[i]]]];
[viewArray addObject:pinView];
[pinView release];
}
self.pinsArray = viewArray;
[viewArray release];
}
return self;
}
- (void) dealloc
{
[pinsArray release];
[viewWithPicker release];
[super dealloc];
}
- (void)viewWillAppear:(BOOL)animated
{
m_hideNavBar = YES;
@ -44,6 +140,8 @@
self.contentSizeForViewInPopover = size;
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged) name:UIDeviceOrientationDidChangeNotification object:nil];
[super viewWillAppear:animated];
}
@ -74,6 +172,7 @@
[m_balloon clear];
}
}
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super viewWillDisappear:animated];
}
@ -234,10 +333,7 @@
case 2:
{
m_hideNavBar = NO;
SelectColorVC * vc = [[SelectColorVC alloc] initWithBalloonView:m_balloon];
[self pushToNavigationControllerAndSetControllerToPopoverSize:vc];
[vc release];
[self createAndShowColorPicker];
}
break;
}
@ -384,4 +480,151 @@
[self.navigationController pushViewController:vc animated:YES];
}
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{
return [PinPickerView viewWidth];
}
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
return [PinPickerView viewHeight];
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return [pinsArray count];
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
#pragma mark - UIPickerViewDelegate
// tell the picker which view to use for a given component and row, we have an array of views to show
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row
forComponent:(NSInteger)component reusingView:(UIView *)view
{
return [pinsArray objectAtIndex:row];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
selectedRow = row;
}
-(void)pickerDoneClicked
{
if (![m_balloon.color isEqualToString:g_colors[selectedRow]])
{
m_balloon.pinImage.image = [UIImage imageNamed:g_colors[selectedRow]];
[[Statistics instance] logEvent:@"Select Bookmark color"];
m_balloon.color = g_colors[selectedRow];
[self.tableView reloadData];
}
[self pickerCancelClicked];
}
-(void)pickerCancelClicked
{
self.tableView.scrollEnabled = YES;
[viewWithPicker removeFromSuperview];
self.viewWithPicker = nil;
}
-(void)createAndShowColorPicker
{
double height, width;
CGRect rect;
[self getScreenHeight:height width:width rect:rect];
viewWithPicker = [[UIView alloc] initWithFrame:rect];
UIPickerView * picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 0.0, 0.0)];
picker.delegate = self;
picker.showsSelectionIndicator = YES;
CGRect r = picker.frame;
[picker setCenter:CGPointMake(width / 2, height - r.size.height / 2)];
[viewWithPicker addSubview:picker];
UIToolbar * pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, picker.frame.origin.y - 44, width, 44)];
pickerToolbar.barStyle = UIBarStyleBlackOpaque;
//[pickerToolbar sizeToFit];
NSMutableArray *barItems = [[NSMutableArray alloc] init];
UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDoneClicked)];
UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(pickerCancelClicked)];
[barItems addObject:doneBtn];
[barItems addObject:cancelBtn];
[pickerToolbar setItems:barItems animated:YES];
[barItems release];
[picker release];
[viewWithPicker addSubview:pickerToolbar];
[pickerToolbar release];
if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad)
{
UIWindow* window = [UIApplication sharedApplication].keyWindow;
if (!window)
window = [[UIApplication sharedApplication].windows objectAtIndex:0];
[[[window subviews] objectAtIndex:0] addSubview:viewWithPicker];
}
else
{
[self.view.superview addSubview:viewWithPicker];
}
self.tableView.scrollEnabled = NO;
selectedRow = 0;
}
-(void) orientationChanged
{
if (viewWithPicker)
{
double height, width;
CGRect rect;
[self getScreenHeight:height width:width rect:rect];
[viewWithPicker setFrame:rect];
NSArray *subviews = [viewWithPicker subviews];
UIPickerView * p = nil;
UIToolbar * t = nil;
for (UIView *subview in subviews)
{
if ([subview isKindOfClass:[UIPickerView class]])
p = (UIPickerView *)subview;
else if ([subview isKindOfClass:[UIToolbar class]])
t = (UIToolbar *)subview;
}
[p setFrame:CGRectMake(0, height - p.frame.size.height, width, p.frame.size.height)];
[t setFrame:CGRectMake(0, p.frame.origin.y - 44, width, 44)];
}
}
-(void)getScreenHeight:(double &)height width:(double &)width rect:(CGRect &)rect
{
if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad)
{
rect = [UIScreen mainScreen].bounds;
height = self.view.window.frame.size.height;
width = self.view.window.frame.size.width;
if(!UIInterfaceOrientationIsPortrait(self.interfaceOrientation))
std::swap(height, width);
}
else
{
height = self.view.superview.frame.size.height;
width = self.view.superview.frame.size.width;
rect = self.view.superview.frame;
}
}
@end

View file

@ -1,13 +0,0 @@
#import <UIKit/UIKit.h>
@class BalloonView;
@interface SelectColorVC : UITableViewController
{
// @TODO store as a property to retain reference
BalloonView * m_balloon;
}
- (id) initWithBalloonView:(BalloonView *)view;
@end

View file

@ -1,69 +0,0 @@
#import "SelectColorVC.h"
#import "BalloonView.h"
#import "Statistics.h"
static NSString * g_colors [] = {
@"placemark-red",
@"placemark-blue",
@"placemark-brown",
@"placemark-green",
@"placemark-orange",
@"placemark-pink",
@"placemark-purple"
};
@implementation SelectColorVC
- (id) initWithBalloonView:(BalloonView *)view
{
self = [super initWithStyle:UITableViewStyleGrouped];
if (self)
{
m_balloon = view;
self.title = NSLocalizedString(@"bookmark_color", @"Bookmark Color dialog title");
}
return self;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Number of supported bookmark colors
return sizeof(g_colors)/sizeof(g_colors[0]);
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString * kCellId = @"SelectColorCell";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:kCellId];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellId] autorelease];
// Customize cell
cell.imageView.image = [UIImage imageNamed:g_colors[indexPath.row]];
if (cell.imageView.image == m_balloon.pinImage.image)
cell.accessoryType = UITableViewCellAccessoryCheckmark;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];
m_balloon.pinImage.image = cell.imageView.image;
m_balloon.color = g_colors[indexPath.row];
[self.navigationController popViewControllerAnimated:YES];
[[Statistics instance] logEvent:@"Select Bookmark color"];
}
@end

View file

@ -192,8 +192,6 @@
FA765AB41737BC6D00279CFF /* 44x58-lite.png in Resources */ = {isa = PBXBuildFile; fileRef = FA765AB01737BC6D00279CFF /* 44x58-lite.png */; };
FA765AB51737BC6D00279CFF /* 64-lite.png in Resources */ = {isa = PBXBuildFile; fileRef = FA765AB11737BC6D00279CFF /* 64-lite.png */; };
FA765AB61737BC6D00279CFF /* 320-lite.png in Resources */ = {isa = PBXBuildFile; fileRef = FA765AB21737BC6D00279CFF /* 320-lite.png */; };
FA77353C15615E2300DB495F /* SelectColorVC.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA77353B15615E2300DB495F /* SelectColorVC.mm */; };
FA77353D15615E2300DB495F /* SelectColorVC.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA77353B15615E2300DB495F /* SelectColorVC.mm */; };
FA81AE3314D061BF00A0D70D /* SearchCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA81AE3214D061BF00A0D70D /* SearchCell.mm */; };
FA85F633145DDDC20090E1A0 /* packed_polygons.bin in Resources */ = {isa = PBXBuildFile; fileRef = FA85F632145DDDC20090E1A0 /* packed_polygons.bin */; };
FA87151B12B1518F00592DAF /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA87151A12B1518F00592DAF /* SystemConfiguration.framework */; };
@ -1529,8 +1527,6 @@
FA765AB01737BC6D00279CFF /* 44x58-lite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "44x58-lite.png"; sourceTree = "<group>"; };
FA765AB11737BC6D00279CFF /* 64-lite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "64-lite.png"; sourceTree = "<group>"; };
FA765AB21737BC6D00279CFF /* 320-lite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "320-lite.png"; sourceTree = "<group>"; };
FA77353A15615E2300DB495F /* SelectColorVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SelectColorVC.h; path = Bookmarks/SelectColorVC.h; sourceTree = SOURCE_ROOT; };
FA77353B15615E2300DB495F /* SelectColorVC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SelectColorVC.mm; path = Bookmarks/SelectColorVC.mm; sourceTree = SOURCE_ROOT; };
FA81AE3114D061BF00A0D70D /* SearchCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchCell.h; sourceTree = "<group>"; };
FA81AE3214D061BF00A0D70D /* SearchCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SearchCell.mm; sourceTree = "<group>"; };
FA85F632145DDDC20090E1A0 /* packed_polygons.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; name = packed_polygons.bin; path = ../../data/packed_polygons.bin; sourceTree = SOURCE_ROOT; };
@ -2434,8 +2430,6 @@
F785EB3E16386FC4003A38A8 /* BookmarkCell.h */,
F785EB3F16386FC4003A38A8 /* BookmarkCell.mm */,
FA36B8171540466A004560CC /* Images */,
FA77353A15615E2300DB495F /* SelectColorVC.h */,
FA77353B15615E2300DB495F /* SelectColorVC.mm */,
FAA614B6155F16950031C345 /* AddSetVC.h */,
FAA614B7155F16950031C345 /* AddSetVC.mm */,
FA054610155C465E001F4E37 /* SelectSetVC.h */,
@ -4485,7 +4479,6 @@
FAF457E715597D4600DCCC49 /* Framework.cpp in Sources */,
FA054612155C465E001F4E37 /* SelectSetVC.mm in Sources */,
FAA614B8155F16950031C345 /* AddSetVC.mm in Sources */,
FA77353C15615E2300DB495F /* SelectColorVC.mm in Sources */,
FAAEA7D5161D8D3100CCD661 /* BookmarksRootVC.mm in Sources */,
F785EB4016386FC4003A38A8 /* BookmarkCell.mm in Sources */,
CB252D6F16FF82C9001E41E9 /* Statistics.m in Sources */,
@ -4521,7 +4514,6 @@
FAF457E815597D4600DCCC49 /* Framework.cpp in Sources */,
FA054613155C465E001F4E37 /* SelectSetVC.mm in Sources */,
FAA614B9155F16950031C345 /* AddSetVC.mm in Sources */,
FA77353D15615E2300DB495F /* SelectColorVC.mm in Sources */,
FAAEA7D6161D8D3100CCD661 /* BookmarksRootVC.mm in Sources */,
F785EB4116386FC4003A38A8 /* BookmarkCell.mm in Sources */,
CB252D7016FF82C9001E41E9 /* Statistics.m in Sources */,