Commit f7449e66183391dde7b6478d94bbd36e6631b122
1 parent
b0579422a5
Exists in
master
and in
1 other branch
update save step of 7 day before date now
Showing 4 changed files with 161 additions and 34 deletions Inline Diff
LifeLog/LifeLog/HomeViewController.m
| 1 | // | 1 | // |
| 2 | // HomeViewController.m | 2 | // HomeViewController.m |
| 3 | // LifeLog | 3 | // LifeLog |
| 4 | // | 4 | // |
| 5 | // Created by Nguyen Van Phong on 7/25/17. | 5 | // Created by Nguyen Van Phong on 7/25/17. |
| 6 | // Copyright © 2017 PhongNV. All rights reserved. | 6 | // Copyright © 2017 PhongNV. All rights reserved. |
| 7 | // | 7 | // |
| 8 | 8 | ||
| 9 | #import "HomeViewController.h" | 9 | #import "HomeViewController.h" |
| 10 | #import "NSDate+helper.h" | 10 | #import "NSDate+helper.h" |
| 11 | #import <CoreMotion/CoreMotion.h> | 11 | #import <CoreMotion/CoreMotion.h> |
| 12 | #import "CMMotionActivityExtra.h" | 12 | #import "CMMotionActivityExtra.h" |
| 13 | #import "TodayViewController.h" | 13 | #import "TodayViewController.h" |
| 14 | #import "Utilities.h" | 14 | #import "Utilities.h" |
| 15 | #import <MBProgressHUD/MBProgressHUD.h> | 15 | #import <MBProgressHUD/MBProgressHUD.h> |
| 16 | #import "ServerAPI.h" | 16 | #import "ServerAPI.h" |
| 17 | 17 | ||
| 18 | static NSInteger numberTotal = 10000; | 18 | static NSInteger numberTotal = 10000; |
| 19 | 19 | ||
| 20 | @interface HomeViewController () | 20 | @interface HomeViewController () |
| 21 | { | 21 | { |
| 22 | MBProgressHUD *progressHud; | 22 | MBProgressHUD *progressHud; |
| 23 | } | 23 | } |
| 24 | @property (nonatomic, weak) IBOutlet UILabel *lblTitle; | 24 | @property (nonatomic, weak) IBOutlet UILabel *lblTitle; |
| 25 | @property (nonatomic, weak) IBOutlet UIImageView *avatar; | 25 | @property (nonatomic, weak) IBOutlet UIImageView *avatar; |
| 26 | @property (nonatomic, weak) IBOutlet UILabel *lblDateCurrent; | 26 | @property (nonatomic, weak) IBOutlet UILabel *lblDateCurrent; |
| 27 | @property (nonatomic, weak) IBOutlet UILabel *lblValueStep; | 27 | @property (nonatomic, weak) IBOutlet UILabel *lblValueStep; |
| 28 | @property (nonatomic, weak) IBOutlet UILabel *lblUnitStep; | 28 | @property (nonatomic, weak) IBOutlet UILabel *lblUnitStep; |
| 29 | @property (nonatomic, weak) IBOutlet UILabel *lblValueStepOther; | 29 | @property (nonatomic, weak) IBOutlet UILabel *lblValueStepOther; |
| 30 | @property (nonatomic, weak) IBOutlet UILabel *lblPercent; | 30 | @property (nonatomic, weak) IBOutlet UILabel *lblPercent; |
| 31 | @property (nonatomic, weak) IBOutlet UILabel *lblNotice; | 31 | @property (nonatomic, weak) IBOutlet UILabel *lblNotice; |
| 32 | @property (weak, nonatomic) IBOutlet UISegmentedControl *segmentHome; | 32 | @property (weak, nonatomic) IBOutlet UISegmentedControl *segmentHome; |
| 33 | 33 | ||
| 34 | @property (nonatomic, strong) CMPedometer *pedometer; | 34 | @property (nonatomic, strong) CMPedometer *pedometer; |
| 35 | @property (nonatomic, strong) CMMotionActivityManager *motionActivityManager; | 35 | @property (nonatomic, strong) CMMotionActivityManager *motionActivityManager; |
| 36 | @property (nonatomic, strong) NSOperationQueue *operationQueue; | 36 | @property (nonatomic, strong) NSOperationQueue *operationQueue; |
| 37 | @property (nonatomic, strong) NSTimer *timer; | 37 | @property (nonatomic, strong) NSTimer *timer; |
| 38 | @property (nonatomic, assign) NSInteger bike; | 38 | @property (nonatomic, assign) NSInteger bike; |
| 39 | @property (nonatomic, assign) NSInteger walking; | 39 | @property (nonatomic, assign) NSInteger walking; |
| 40 | @property (nonatomic, assign) NSInteger running; | 40 | @property (nonatomic, assign) NSInteger running; |
| 41 | @property (nonatomic, strong) NSDate *dateCurrent; | 41 | @property (nonatomic, strong) NSDate *dateCurrent; |
| 42 | 42 | ||
| 43 | //@property (nonatomic, assign) BOOL isRequesting; | ||
| 44 | @property (nonatomic, assign) int totalRequest; | 43 | @property (nonatomic, assign) int totalRequest; |
| 45 | @property (nonatomic, assign) int countComplete; | 44 | @property (nonatomic, assign) int countComplete; |
| 46 | 45 | ||
| 47 | @end | 46 | @end |
| 48 | 47 | ||
| 49 | @implementation HomeViewController | 48 | @implementation HomeViewController |
| 50 | 49 | ||
| 51 | - (void)viewDidLoad { | 50 | - (void)viewDidLoad { |
| 52 | [super viewDidLoad]; | 51 | [super viewDidLoad]; |
| 53 | // Do any additional setup after loading the view from its nib. | 52 | |
| 54 | self.lblTitle.text = NSLocalizedString(@"lifelog.home.title", nil); | 53 | self.lblTitle.text = NSLocalizedString(@"lifelog.home.title", nil); |
| 55 | 54 | ||
| 56 | [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.lblTitle attribute:NSLayoutAttributeTop multiplier:1 constant:0]]; | 55 | [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.lblTitle attribute:NSLayoutAttributeTop multiplier:1 constant:0]]; |
| 57 | 56 | ||
| 58 | self.avatar.backgroundColor = [UIColor whiteColor]; | 57 | self.avatar.backgroundColor = [UIColor whiteColor]; |
| 59 | self.avatar.layer.borderWidth = 2.0f; | 58 | self.avatar.layer.borderWidth = 2.0f; |
| 60 | self.avatar.layer.borderColor = [[UIColor whiteColor] CGColor]; | 59 | self.avatar.layer.borderColor = [[UIColor whiteColor] CGColor]; |
| 61 | self.avatar.layer.cornerRadius = self.avatar.frame.size.width/2.0f; | 60 | self.avatar.layer.cornerRadius = self.avatar.frame.size.width/2.0f; |
| 62 | self.avatar.layer.masksToBounds = YES; | 61 | self.avatar.layer.masksToBounds = YES; |
| 63 | NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:kUser]; | 62 | NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:kUser]; |
| 64 | User *user = (User *)[NSKeyedUnarchiver unarchiveObjectWithData:data]; | 63 | User *user = (User *)[NSKeyedUnarchiver unarchiveObjectWithData:data]; |
| 65 | if (user != nil) { | 64 | if (user != nil) { |
| 66 | NSString *linkImage = [NSString stringWithFormat:@"%@%@", kServerAddress, user.profile_image]; | 65 | NSString *linkImage = [NSString stringWithFormat:@"%@%@", kServerAddress, user.profile_image]; |
| 67 | NSURL *urlImage = [NSURL URLWithString:linkImage]; | 66 | NSURL *urlImage = [NSURL URLWithString:linkImage]; |
| 68 | NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; | 67 | NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; |
| 69 | sessionConfig.timeoutIntervalForRequest = 30.0; | 68 | sessionConfig.timeoutIntervalForRequest = 30.0; |
| 70 | sessionConfig.timeoutIntervalForResource = 60.0; | 69 | sessionConfig.timeoutIntervalForResource = 60.0; |
| 71 | sessionConfig.HTTPMaximumConnectionsPerHost = 20; | 70 | sessionConfig.HTTPMaximumConnectionsPerHost = 20; |
| 72 | sessionConfig.allowsCellularAccess = YES; | 71 | sessionConfig.allowsCellularAccess = YES; |
| 73 | HomeViewController __weak *weakSelf = self; | 72 | HomeViewController __weak *weakSelf = self; |
| 74 | NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig]; | 73 | NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig]; |
| 75 | NSURLSessionDataTask *downloadPhotoTask = [session | 74 | NSURLSessionDataTask *downloadPhotoTask = [session |
| 76 | dataTaskWithURL:urlImage completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { | 75 | dataTaskWithURL:urlImage completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { |
| 77 | if (weakSelf == nil) | 76 | if (weakSelf == nil) |
| 78 | { | 77 | { |
| 79 | return; | 78 | return; |
| 80 | } | 79 | } |
| 81 | if (error == nil) { | 80 | if (error == nil) { |
| 82 | UIImage *image = [[UIImage alloc] initWithData:data]; | 81 | UIImage *image = [[UIImage alloc] initWithData:data]; |
| 83 | [[NSOperationQueue mainQueue] addOperationWithBlock:^{ | 82 | [[NSOperationQueue mainQueue] addOperationWithBlock:^{ |
| 84 | weakSelf.avatar.image = image; | 83 | weakSelf.avatar.image = image; |
| 85 | }]; | 84 | }]; |
| 86 | } | 85 | } |
| 87 | }]; | 86 | }]; |
| 88 | [downloadPhotoTask resume]; | 87 | [downloadPhotoTask resume]; |
| 89 | } | 88 | } |
| 90 | 89 | ||
| 91 | self.lblNotice.text = NSLocalizedString(@"lifelog.home.notice", nil); | 90 | self.lblNotice.text = NSLocalizedString(@"lifelog.home.notice", nil); |
| 92 | 91 | ||
| 93 | _dateCurrent = [NSDate date]; | 92 | _dateCurrent = [NSDate date]; |
| 94 | self.lblDateCurrent.text = [NSString stringWithFormat:@"%ld%@%ld%@%ld%@", (long)[_dateCurrent getYear], NSLocalizedString(@"lifelog.common.year", nil), (long)[_dateCurrent getMonth], NSLocalizedString(@"lifelog.common.month", nil), (long)[_dateCurrent getDay], NSLocalizedString(@"lifelog.common.day", nil)]; | 93 | self.lblDateCurrent.text = [NSString stringWithFormat:@"%ld%@%ld%@%ld%@", (long)[_dateCurrent getYear], NSLocalizedString(@"lifelog.common.year", nil), (long)[_dateCurrent getMonth], NSLocalizedString(@"lifelog.common.month", nil), (long)[_dateCurrent getDay], NSLocalizedString(@"lifelog.common.day", nil)]; |
| 95 | 94 | ||
| 96 | self.lblUnitStep.text = NSLocalizedString(@"lifelog.home.unit.step", nil); | 95 | self.lblUnitStep.text = NSLocalizedString(@"lifelog.home.unit.step", nil); |
| 97 | 96 | ||
| 98 | if ([CMPedometer isStepCountingAvailable]) { | 97 | if ([CMPedometer isStepCountingAvailable]) { |
| 99 | _pedometer = [[CMPedometer alloc] init]; | 98 | _pedometer = [[CMPedometer alloc] init]; |
| 100 | } | 99 | } |
| 101 | if ([CMMotionActivityManager isActivityAvailable]) { | 100 | if ([CMMotionActivityManager isActivityAvailable]) { |
| 102 | _motionActivityManager = [[CMMotionActivityManager alloc] init]; | 101 | _motionActivityManager = [[CMMotionActivityManager alloc] init]; |
| 103 | } | 102 | } |
| 104 | _operationQueue = [[NSOperationQueue alloc] init]; | 103 | _operationQueue = [[NSOperationQueue alloc] init]; |
| 105 | _bike = 0; | 104 | _bike = 0; |
| 106 | _walking = 0; | 105 | _walking = 0; |
| 107 | _running = 0; | 106 | _running = 0; |
| 108 | _segmentHome.selectedSegmentIndex = 1; | 107 | _segmentHome.selectedSegmentIndex = 1; |
| 109 | // _isRequesting = NO; | ||
| 110 | _totalRequest = 0; | 108 | _totalRequest = 0; |
| 111 | _countComplete = 0; | 109 | _countComplete = 0; |
| 112 | 110 | ||
| 113 | progressHud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; | 111 | progressHud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; |
| 114 | progressHud.mode = MBProgressHUDModeIndeterminate; | 112 | progressHud.mode = MBProgressHUDModeIndeterminate; |
| 115 | progressHud.detailsLabel.text = NSLocalizedString(@"lifelog.home.progressHud.title", nil); | 113 | progressHud.detailsLabel.text = NSLocalizedString(@"lifelog.home.progressHud.title", nil); |
| 114 | [self saveDataStep7LastDay]; | ||
| 116 | } | 115 | } |
| 117 | 116 | ||
| 118 | - (void)viewWillAppear:(BOOL)animated { | 117 | - (void)viewWillAppear:(BOOL)animated { |
| 119 | [super viewWillAppear:animated]; | 118 | [super viewWillAppear:animated]; |
| 120 | // _timer = [NSTimer scheduledTimerWithTimeInterval:1.5f target:self selector:@selector(countStep) userInfo:nil repeats:YES]; | 119 | [self saveStepForDay:self.dateCurrent]; |
| 121 | // [_timer fire]; | 120 | [self requestTopByDate:_dateCurrent]; |
| 122 | [self countStep]; | 121 | } |
| 123 | 122 | ||
| 123 | - (void)requestTopByDate:(NSDate *)date { | ||
| 124 | NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; | 124 | NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; |
| 125 | [dateFormatter setDateFormat:@"yyyy-MM-dd"]; | 125 | [dateFormatter setDateFormat:@"yyyy-MM-dd"]; |
| 126 | NSString *dateString = [dateFormatter stringFromDate:_dateCurrent]; | 126 | NSString *dateString = [dateFormatter stringFromDate:date]; |
| 127 | 127 | ||
| 128 | HomeViewController __weak *weakSelf = self; | 128 | HomeViewController __weak *weakSelf = self; |
| 129 | [[ServerAPI server] requestTopWithMode:(int)_segmentHome.selectedSegmentIndex andDate:dateString CompletionHandler:^(TopObject *topObject, NSError *error) { | 129 | int mode = 1; |
| 130 | switch (_segmentHome.selectedSegmentIndex) { | ||
| 131 | case 0: | ||
| 132 | mode = 3; | ||
| 133 | break; | ||
| 134 | |||
| 135 | case 1: | ||
| 136 | mode = 1; | ||
| 137 | break; | ||
| 138 | |||
| 139 | case 2: | ||
| 140 | mode = 2; | ||
| 141 | break; | ||
| 142 | |||
| 143 | default: | ||
| 144 | break; | ||
| 145 | } | ||
| 146 | [[ServerAPI server] requestTopWithMode:mode andDate:dateString CompletionHandler:^(TopObject *topObject, NSError *error) { | ||
| 130 | if(weakSelf == nil) { | 147 | if(weakSelf == nil) { |
| 131 | return ; | 148 | return ; |
| 132 | } | 149 | } |
| 133 | if (error == nil) { | 150 | if (error == nil) { |
| 134 | NSLog(@"TopObject: %@", topObject); | 151 | NSLog(@"TopObject: %@", topObject); |
| 135 | } | 152 | } |
| 136 | else { | 153 | else { |
| 137 | dispatch_async(dispatch_get_main_queue(), ^{ | 154 | dispatch_async(dispatch_get_main_queue(), ^{ |
| 138 | NSString *message = [error.userInfo objectForKey:@"message"]; | 155 | NSString *message = [error.userInfo objectForKey:@"message"]; |
| 139 | [Utilities showErrorMessage:message withViewController:weakSelf]; | 156 | [Utilities showErrorMessage:message withViewController:weakSelf]; |
| 140 | }); | 157 | }); |
| 141 | } | 158 | } |
| 142 | }]; | 159 | }]; |
| 143 | } | 160 | } |
| 144 | 161 | ||
| 145 | - (void)viewWillDisappear:(BOOL)animated { | 162 | - (void)viewWillDisappear:(BOOL)animated { |
| 146 | [super viewWillDisappear:animated]; | 163 | [super viewWillDisappear:animated]; |
| 147 | //[_timer invalidate]; | ||
| 148 | } | 164 | } |
| 149 | 165 | ||
| 150 | - (void)didReceiveMemoryWarning { | 166 | - (void)didReceiveMemoryWarning { |
| 151 | [super didReceiveMemoryWarning]; | 167 | [super didReceiveMemoryWarning]; |
| 152 | // Dispose of any resources that can be recreated. | 168 | // Dispose of any resources that can be recreated. |
| 153 | } | 169 | } |
| 154 | 170 | ||
| 155 | #pragma mark - IBAction | 171 | #pragma mark - IBAction |
| 156 | - (IBAction)menuButtonTouchUpInside:(id)sender | 172 | - (IBAction)menuButtonTouchUpInside:(id)sender |
| 157 | { | 173 | { |
| 158 | 174 | ||
| 159 | } | 175 | } |
| 160 | 176 | ||
| 161 | - (IBAction)todayButtonTouchUpInside:(id)sender | 177 | - (IBAction)todayButtonTouchUpInside:(id)sender |
| 162 | { | 178 | { |
| 163 | TodayViewController *todayVC = [[TodayViewController alloc] initWithNibName:@"TodayViewController" bundle:nil]; | 179 | TodayViewController *todayVC = [[TodayViewController alloc] initWithNibName:@"TodayViewController" bundle:nil]; |
| 164 | [self.navigationController pushViewController:todayVC animated:YES]; | 180 | [self.navigationController pushViewController:todayVC animated:YES]; |
| 165 | } | 181 | } |
| 166 | 182 | ||
| 167 | - (IBAction)leftButtonTouchUpInside:(id)sender | 183 | - (IBAction)leftButtonTouchUpInside:(id)sender |
| 168 | { | 184 | { |
| 169 | self.dateCurrent = [self.dateCurrent dateByAddingTimeInterval:-(24*60*60)]; | 185 | self.dateCurrent = [self.dateCurrent dateByAddingTimeInterval:-(24*60*60)]; |
| 170 | self.lblDateCurrent.text = [NSString stringWithFormat:@"%ld%@%ld%@%ld%@", (long)[_dateCurrent getYear], NSLocalizedString(@"lifelog.common.year", nil), (long)[_dateCurrent getMonth], NSLocalizedString(@"lifelog.common.month", nil), (long)[_dateCurrent getDay], NSLocalizedString(@"lifelog.common.day", nil)]; | 186 | self.lblDateCurrent.text = [NSString stringWithFormat:@"%ld%@%ld%@%ld%@", (long)[_dateCurrent getYear], NSLocalizedString(@"lifelog.common.year", nil), (long)[_dateCurrent getMonth], NSLocalizedString(@"lifelog.common.month", nil), (long)[_dateCurrent getDay], NSLocalizedString(@"lifelog.common.day", nil)]; |
| 171 | [self countStep]; | 187 | [self saveStepForDay:self.dateCurrent]; |
| 172 | } | 188 | } |
| 173 | 189 | ||
| 174 | - (IBAction)rightButtonTouchUpInside:(id)sender | 190 | - (IBAction)rightButtonTouchUpInside:(id)sender |
| 175 | { | 191 | { |
| 176 | self.dateCurrent = [self.dateCurrent dateByAddingTimeInterval:24*60*60]; | 192 | self.dateCurrent = [self.dateCurrent dateByAddingTimeInterval:24*60*60]; |
| 177 | self.lblDateCurrent.text = [NSString stringWithFormat:@"%ld%@%ld%@%ld%@", (long)[_dateCurrent getYear], NSLocalizedString(@"lifelog.common.year", nil), (long)[_dateCurrent getMonth], NSLocalizedString(@"lifelog.common.month", nil), (long)[_dateCurrent getDay], NSLocalizedString(@"lifelog.common.day", nil)]; | 193 | self.lblDateCurrent.text = [NSString stringWithFormat:@"%ld%@%ld%@%ld%@", (long)[_dateCurrent getYear], NSLocalizedString(@"lifelog.common.year", nil), (long)[_dateCurrent getMonth], NSLocalizedString(@"lifelog.common.month", nil), (long)[_dateCurrent getDay], NSLocalizedString(@"lifelog.common.day", nil)]; |
| 178 | [self countStep]; | 194 | [self saveStepForDay:self.dateCurrent]; |
| 179 | } | 195 | } |
| 180 | 196 | ||
| 181 | - (IBAction)segmentValueChange:(id)sender { | 197 | - (IBAction)segmentValueChange:(id)sender { |
| 182 | [self updateStepUI]; | 198 | [self updateStepUI]; |
| 183 | } | 199 | } |
| 184 | 200 | ||
| 185 | #pragma mark - Functions Private | 201 | #pragma mark - Functions Private |
| 186 | - (void)countStep | 202 | - (void)saveStepForDay:(NSDate *)date |
| 187 | { | 203 | { |
| 188 | // if (self.isRequesting == YES) { | ||
| 189 | // return; | ||
| 190 | // } | ||
| 191 | if ([CMMotionActivityManager isActivityAvailable]) { | 204 | if ([CMMotionActivityManager isActivityAvailable]) { |
| 192 | [progressHud showAnimated:YES]; | 205 | [progressHud showAnimated:YES]; |
| 193 | [progressHud setHidden:NO]; | 206 | [progressHud setHidden:NO]; |
| 194 | // self.isRequesting = YES; | ||
| 195 | self.bike = 0; | 207 | self.bike = 0; |
| 196 | self.walking = 0; | 208 | self.walking = 0; |
| 197 | self.running = 0; | 209 | self.running = 0; |
| 198 | NSDate *startDate = [self.dateCurrent beginningAtMidnightOfDay]; | 210 | NSDate *startDate = [date beginningAtMidnightOfDay]; |
| 199 | NSDate *endDate = [startDate dateByAddingTimeInterval:(24*60*60 - 1)]; | 211 | NSDate *endDate = [startDate dateByAddingTimeInterval:(24*60*60 - 1)]; |
| 200 | 212 | ||
| 201 | HomeViewController __weak *weakSelf = self; | 213 | HomeViewController __weak *weakSelf = self; |
| 202 | dispatch_queue_t myQueue = dispatch_queue_create("mobileworld.jp.lifelog", NULL); | 214 | dispatch_queue_t myQueue = dispatch_queue_create("mobileworld.jp.lifelog.forDay", NULL); |
| 203 | dispatch_async(myQueue, ^{ | 215 | dispatch_async(myQueue, ^{ |
| 204 | if (weakSelf == nil) { | 216 | if (weakSelf == nil) { |
| 205 | return ; | 217 | return ; |
| 206 | } | 218 | } |
| 207 | 219 | ||
| 208 | [weakSelf.motionActivityManager queryActivityStartingFromDate:startDate toDate:endDate toQueue:_operationQueue withHandler:^(NSArray<CMMotionActivity *> * _Nullable activities, NSError * _Nullable error) { | 220 | [weakSelf.motionActivityManager queryActivityStartingFromDate:startDate toDate:endDate toQueue:_operationQueue withHandler:^(NSArray<CMMotionActivity *> * _Nullable activities, NSError * _Nullable error) { |
| 209 | if (error || activities.count <= 0) { | 221 | if (error || activities.count <= 0) { |
| 210 | weakSelf.totalRequest = 0; | 222 | weakSelf.totalRequest = 0; |
| 211 | weakSelf.countComplete = 0; | 223 | weakSelf.countComplete = 0; |
| 212 | dispatch_async(dispatch_get_main_queue(), ^{ | 224 | dispatch_async(dispatch_get_main_queue(), ^{ |
| 213 | [weakSelf updateStepUI]; | 225 | [weakSelf updateStepUI]; |
| 214 | }); | 226 | }); |
| 215 | return ; | 227 | return ; |
| 216 | } | 228 | } |
| 217 | // set EndDate | 229 | // set EndDate |
| 218 | weakSelf.totalRequest = (int)activities.count; | 230 | weakSelf.totalRequest = (int)activities.count; |
| 219 | NSMutableArray *arrayActivities = [[NSMutableArray alloc] init]; | 231 | NSMutableArray *arrayActivities = [[NSMutableArray alloc] init]; |
| 220 | for (int i = 0; i < activities.count; i++) { | 232 | for (int i = 0; i < activities.count; i++) { |
| 221 | CMMotionActivity *activity = [activities objectAtIndex:i]; | 233 | CMMotionActivity *activity = [activities objectAtIndex:i]; |
| 222 | CMMotionActivityExtra *activityExtra = [[CMMotionActivityExtra alloc] init]; | 234 | CMMotionActivityExtra *activityExtra = [[CMMotionActivityExtra alloc] init]; |
| 223 | activityExtra.activity = activity; | 235 | activityExtra.activity = activity; |
| 224 | if (i == activities.count - 1) { | 236 | if (i == activities.count - 1) { |
| 225 | activityExtra.endDate = endDate; | 237 | activityExtra.endDate = endDate; |
| 226 | } | 238 | } |
| 227 | else { | 239 | else { |
| 228 | CMMotionActivity *activityNext = [activities objectAtIndex:i+1]; | 240 | CMMotionActivity *activityNext = [activities objectAtIndex:i+1]; |
| 229 | activityExtra.endDate = activityNext.startDate; | 241 | activityExtra.endDate = activityNext.startDate; |
| 230 | } | 242 | } |
| 231 | [arrayActivities addObject:activityExtra]; | 243 | [arrayActivities addObject:activityExtra]; |
| 232 | } | 244 | } |
| 233 | 245 | ||
| 234 | for (CMMotionActivityExtra *activityExtra in arrayActivities) { | 246 | for (CMMotionActivityExtra *activityExtra in arrayActivities) { |
| 235 | // NSLog(@"%@", activityExtra.activity.startDate); | ||
| 236 | [weakSelf.pedometer queryPedometerDataFromDate:activityExtra.activity.startDate toDate:activityExtra.endDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) { | 247 | [weakSelf.pedometer queryPedometerDataFromDate:activityExtra.activity.startDate toDate:activityExtra.endDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) { |
| 237 | NSInteger numberStep = [pedometerData.numberOfSteps integerValue]; | 248 | NSInteger numberStep = [pedometerData.numberOfSteps integerValue]; |
| 238 | int mode = 1; | 249 | int mode = 1; |
| 239 | if (activityExtra.activity.cycling) { | 250 | if (activityExtra.activity.cycling) { |
| 240 | // self.bike | 251 | // self.bike |
| 241 | weakSelf.bike += numberStep; | 252 | weakSelf.bike += numberStep; |
| 242 | //NSLog(@"Step cycling"); | ||
| 243 | mode = 3; | 253 | mode = 3; |
| 244 | } | 254 | } |
| 245 | else if (activityExtra.activity.walking) { | 255 | else if (activityExtra.activity.walking) { |
| 246 | // self.walking | 256 | // self.walking |
| 247 | weakSelf.walking += numberStep; | 257 | weakSelf.walking += numberStep; |
| 248 | //NSLog(@"Step walking"); | ||
| 249 | mode = 1; | 258 | mode = 1; |
| 250 | } | 259 | } |
| 251 | else if (activityExtra.activity.running) { | 260 | else if (activityExtra.activity.running) { |
| 252 | weakSelf.running += numberStep; | 261 | weakSelf.running += numberStep; |
| 253 | //NSLog(@"Step running"); | ||
| 254 | mode = 2; | 262 | mode = 2; |
| 255 | } | 263 | } |
| 256 | else { | 264 | else { |
| 257 | // unknown | 265 | // unknown |
| 258 | //NSLog(@"Step unknown"); | ||
| 259 | } | 266 | } |
| 260 | // NSLog(@"Number of step--> %ld", numberStep); | ||
| 261 | weakSelf.countComplete += 1; | 267 | weakSelf.countComplete += 1; |
| 262 | 268 | ||
| 263 | // save step to server | 269 | // save step to server |
| 264 | if (numberStep > 0) { | 270 | if (numberStep > 0) { |
| 265 | NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; | 271 | NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; |
| 266 | [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; | 272 | [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; |
| 267 | NSString *dateBegin = [dateFormatter stringFromDate:activityExtra.activity.startDate]; | 273 | NSString *dateBegin = [dateFormatter stringFromDate:activityExtra.activity.startDate]; |
| 268 | NSString *dateEnd = [dateFormatter stringFromDate:activityExtra.endDate]; | 274 | NSString *dateEnd = [dateFormatter stringFromDate:activityExtra.endDate]; |
| 269 | [[ServerAPI server] requestCreateLog:mode withStep:(int)numberStep startDate:dateBegin endDate:dateEnd CompletionHandler:^(NSError *error) { | 275 | [[ServerAPI server] requestCreateLog:mode withStep:(int)numberStep startDate:dateBegin endDate:dateEnd CompletionHandler:^(NSError *error) { |
| 270 | if (error) { | 276 | if (error) { |
| 271 | NSLog(@"Error: %@", error); | 277 | NSLog(@"Error: %@", error); |
| 272 | } | 278 | } |
| 273 | }]; | 279 | }]; |
| 274 | } | 280 | } |
| 275 | dispatch_async(dispatch_get_main_queue(), ^{ | 281 | dispatch_async(dispatch_get_main_queue(), ^{ |
| 276 | [weakSelf updateStepUI]; | 282 | [weakSelf updateStepUI]; |
| 277 | }); | 283 | }); |
| 278 | }]; | 284 | }]; |
| 279 | } | 285 | } |
| 280 | // NSLog(@"-----------------------------------------------------"); | ||
| 281 | }]; | 286 | }]; |
| 282 | }); | 287 | }); |
| 283 | } | 288 | } |
| 284 | else { | 289 | else { |
| 285 | [progressHud setHidden:YES]; | 290 | [progressHud setHidden:YES]; |
| 286 | } | 291 | } |
| 287 | } | 292 | } |
| 288 | 293 | ||
| 289 | - (void)updateStepUI //:(NSInteger)numberStep | 294 | - (void)updateStepUI |
| 290 | { | 295 | { |
| 291 | if (self.totalRequest == self.countComplete) { | 296 | if (self.totalRequest == self.countComplete) { |
| 292 | switch (self.segmentHome.selectedSegmentIndex) { | 297 | switch (self.segmentHome.selectedSegmentIndex) { |
| 293 | case 0: | 298 | case 0: |
| 294 | self.lblValueStep.text = [Utilities addCommaFromNumber:self.bike]; | 299 | self.lblValueStep.text = [Utilities addCommaFromNumber:self.bike]; |
| 295 | self.lblValueStepOther.text = [NSString stringWithFormat:@"%@ %ld", NSLocalizedString(@"lifelog.today.remaining.other", nil), numberTotal - self.bike]; | 300 | self.lblValueStepOther.text = [NSString stringWithFormat:@"%@ %ld", NSLocalizedString(@"lifelog.today.remaining.other", nil), numberTotal - self.bike]; |
| 296 | self.lblPercent.text = [NSString stringWithFormat:@"%@ %i%@", NSLocalizedString(@"lifelog.today.text.percent", nil), (int)(self.bike*100/numberTotal), NSLocalizedString(@"lifelog.today.percent", nil)]; | 301 | self.lblPercent.text = [NSString stringWithFormat:@"%@ %i%@", NSLocalizedString(@"lifelog.today.text.percent", nil), (int)(self.bike*100/numberTotal), NSLocalizedString(@"lifelog.today.percent", nil)]; |
| 297 | break; | 302 | break; |
| 298 | 303 | ||
| 299 | case 1: | 304 | case 1: |
| 300 | self.lblValueStep.text = [Utilities addCommaFromNumber:self.walking]; | 305 | self.lblValueStep.text = [Utilities addCommaFromNumber:self.walking]; |
| 301 | self.lblValueStepOther.text = [NSString stringWithFormat:@"%@ %ld", NSLocalizedString(@"lifelog.today.remaining.other", nil), numberTotal - self.walking]; | 306 | self.lblValueStepOther.text = [NSString stringWithFormat:@"%@ %ld", NSLocalizedString(@"lifelog.today.remaining.other", nil), numberTotal - self.walking]; |
| 302 | self.lblPercent.text = [NSString stringWithFormat:@"%@ %i%@", NSLocalizedString(@"lifelog.today.text.percent", nil), (int)(self.walking*100/numberTotal), NSLocalizedString(@"lifelog.today.percent", nil)]; | 307 | self.lblPercent.text = [NSString stringWithFormat:@"%@ %i%@", NSLocalizedString(@"lifelog.today.text.percent", nil), (int)(self.walking*100/numberTotal), NSLocalizedString(@"lifelog.today.percent", nil)]; |
| 303 | break; | 308 | break; |
| 304 | 309 | ||
| 305 | case 2: | 310 | case 2: |
| 306 | self.lblValueStep.text = [Utilities addCommaFromNumber:self.running]; | 311 | self.lblValueStep.text = [Utilities addCommaFromNumber:self.running]; |
| 307 | self.lblValueStepOther.text = [NSString stringWithFormat:@"%@ %ld", NSLocalizedString(@"lifelog.today.remaining.other", nil), numberTotal - self.running]; | 312 | self.lblValueStepOther.text = [NSString stringWithFormat:@"%@ %ld", NSLocalizedString(@"lifelog.today.remaining.other", nil), numberTotal - self.running]; |
| 308 | self.lblPercent.text = [NSString stringWithFormat:@"%@ %i%@", NSLocalizedString(@"lifelog.today.text.percent", nil), (int)(self.running*100/numberTotal), NSLocalizedString(@"lifelog.today.percent", nil)]; | 313 | self.lblPercent.text = [NSString stringWithFormat:@"%@ %i%@", NSLocalizedString(@"lifelog.today.text.percent", nil), (int)(self.running*100/numberTotal), NSLocalizedString(@"lifelog.today.percent", nil)]; |
| 309 | break; | 314 | break; |
| 310 | 315 | ||
| 311 | default: | 316 | default: |
| 312 | break; | 317 | break; |
| 313 | } | 318 | } |
| 314 | // NSLog(@"Walking: %ld || Running: %ld || Bike: %ld", self.walking, self.running, self.bike); | ||
| 315 | // self.isRequesting = NO; | ||
| 316 | self.countComplete = 0; | 319 | self.countComplete = 0; |
| 317 | self.totalRequest = 0; | 320 | self.totalRequest = 0; |
| 318 | [progressHud setHidden:YES]; | 321 | [progressHud setHidden:YES]; |
| 322 | } | ||
| 323 | } | ||
| 324 | |||
| 325 | - (void)saveDataStep7LastDay | ||
| 326 | { | ||
| 327 | NSDate *dateNow = [NSDate date]; | ||
| 328 | for (int index = 0; index < 7; index++) { | ||
| 329 | dateNow = [dateNow dateByAddingTimeInterval:-(24*60*60)]; | ||
| 330 | [self saveStepByDate:dateNow]; | ||
| 331 | } | ||
| 332 | } | ||
| 333 | |||
| 334 | - (void)saveStepByDate:(NSDate *)date | ||
| 335 | { | ||
| 336 | if ([CMMotionActivityManager isActivityAvailable]) { | ||
| 337 | NSDate *startDate = [date beginningAtMidnightOfDay]; | ||
| 338 | NSDate *endDate = [startDate dateByAddingTimeInterval:(24*60*60 - 1)]; | ||
| 339 | |||
| 340 | HomeViewController __weak *weakSelf = self; | ||
| 341 | dispatch_queue_t myQueue = dispatch_queue_create("mobileworld.jp.lifelog.7lastday", NULL); | ||
| 342 | dispatch_async(myQueue, ^{ | ||
| 343 | if (weakSelf == nil) { | ||
| 344 | return ; | ||
| 345 | } | ||
| 346 | |||
| 347 | [weakSelf.motionActivityManager queryActivityStartingFromDate:startDate toDate:endDate toQueue:_operationQueue withHandler:^(NSArray<CMMotionActivity *> * _Nullable activities, NSError * _Nullable error) { | ||
| 348 | if (error || activities.count <= 0) { | ||
| 349 | return ; | ||
| 350 | } | ||
| 351 | // set EndDate | ||
| 352 | NSMutableArray *arrayActivities = [[NSMutableArray alloc] init]; | ||
| 353 | for (int i = 0; i < activities.count; i++) { | ||
| 354 | CMMotionActivity *activity = [activities objectAtIndex:i]; | ||
| 355 | CMMotionActivityExtra *activityExtra = [[CMMotionActivityExtra alloc] init]; | ||
| 356 | activityExtra.activity = activity; | ||
| 357 | if (i == activities.count - 1) { | ||
| 358 | activityExtra.endDate = endDate; | ||
| 359 | } | ||
| 360 | else { | ||
| 361 | CMMotionActivity *activityNext = [activities objectAtIndex:i+1]; | ||
| 362 | activityExtra.endDate = activityNext.startDate; | ||
| 363 | } | ||
| 364 | [arrayActivities addObject:activityExtra]; | ||
| 365 | } | ||
| 366 | |||
| 367 | for (CMMotionActivityExtra *activityExtra in arrayActivities) { | ||
| 368 | [weakSelf.pedometer queryPedometerDataFromDate:activityExtra.activity.startDate toDate:activityExtra.endDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) { | ||
| 369 | NSInteger numberStep = [pedometerData.numberOfSteps integerValue]; | ||
| 370 | int mode = 1; | ||
| 371 | if (activityExtra.activity.cycling) { | ||
| 372 | mode = 3; | ||
| 373 | } | ||
| 374 | else if (activityExtra.activity.walking) { | ||
| 375 | mode = 1; | ||
| 376 | } | ||
| 377 | else if (activityExtra.activity.running) { | ||
| 378 | mode = 2; | ||
| 379 | } | ||
| 380 | else { | ||
| 381 | // unknown | ||
| 382 | } | ||
| 383 | |||
| 384 | // save step to server | ||
| 385 | if (numberStep > 0) { | ||
| 386 | NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; | ||
| 387 | [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; | ||
| 388 | NSString *dateBegin = [dateFormatter stringFromDate:activityExtra.activity.startDate]; |
LifeLog/LifeLog/MapViewController.m
| 1 | // | 1 | // |
| 2 | // MapViewController.m | 2 | // MapViewController.m |
| 3 | // LifeLog | 3 | // LifeLog |
| 4 | // | 4 | // |
| 5 | // Created by Nguyen Van Phong on 7/25/17. | 5 | // Created by Nguyen Van Phong on 7/25/17. |
| 6 | // Copyright © 2017 PhongNV. All rights reserved. | 6 | // Copyright © 2017 PhongNV. All rights reserved. |
| 7 | // | 7 | // |
| 8 | 8 | ||
| 9 | #import "MapViewController.h" | 9 | #import "MapViewController.h" |
| 10 | #import <MapKit/MapKit.h> | 10 | #import <MapKit/MapKit.h> |
| 11 | #import<CoreLocation/CoreLocation.h> | 11 | #import<CoreLocation/CoreLocation.h> |
| 12 | #import <CoreMotion/CoreMotion.h> | 12 | #import <CoreMotion/CoreMotion.h> |
| 13 | #import "NSDate+helper.h" | 13 | #import "NSDate+helper.h" |
| 14 | #import "Utilities.h" | 14 | #import "Utilities.h" |
| 15 | 15 | ||
| 16 | @interface MapViewController ()<CLLocationManagerDelegate, MKMapViewDelegate> | 16 | @interface MapViewController ()<CLLocationManagerDelegate, MKMapViewDelegate> |
| 17 | { | 17 | { |
| 18 | CLGeocoder *geocoder; | 18 | CLGeocoder *geocoder; |
| 19 | CLPlacemark *placemark; | 19 | CLPlacemark *placemark; |
| 20 | CLLocation *previousLocation; | 20 | CLLocation *previousLocation; |
| 21 | } | 21 | } |
| 22 | @property (weak, nonatomic) IBOutlet MKMapView *mapView; | 22 | @property (weak, nonatomic) IBOutlet MKMapView *mapView; |
| 23 | @property (weak, nonatomic) IBOutlet UILabel *lblTime; | 23 | @property (weak, nonatomic) IBOutlet UILabel *lblTime; |
| 24 | @property (weak, nonatomic) IBOutlet UISlider *slider; | 24 | @property (weak, nonatomic) IBOutlet UISlider *slider; |
| 25 | 25 | ||
| 26 | @property (nonatomic, weak) IBOutlet UILabel *lblValueStep; | 26 | @property (nonatomic, weak) IBOutlet UILabel *lblValueStep; |
| 27 | @property (nonatomic, weak) IBOutlet UILabel *lblUnitStep; | 27 | @property (nonatomic, weak) IBOutlet UILabel *lblUnitStep; |
| 28 | 28 | ||
| 29 | @property (strong, nonatomic) CLLocationManager *locationManager; | 29 | @property (strong, nonatomic) CLLocationManager *locationManager; |
| 30 | 30 | ||
| 31 | @property (nonatomic, strong) CMPedometer *pedometer; | 31 | @property (nonatomic, strong) CMPedometer *pedometer; |
| 32 | @property (nonatomic, strong) CMMotionActivityManager *motionActivityManager; | 32 | @property (nonatomic, strong) CMMotionActivityManager *motionActivityManager; |
| 33 | @property (nonatomic, strong) NSOperationQueue *operationQueue; | 33 | @property (nonatomic, strong) NSOperationQueue *operationQueue; |
| 34 | @property (nonatomic, strong) NSTimer *timer; | 34 | @property (nonatomic, strong) NSTimer *timer; |
| 35 | @property (nonatomic) int countTime; | 35 | @property (nonatomic) int countTime; |
| 36 | @property (nonatomic, assign) BOOL isRequesting; | 36 | @property (nonatomic, assign) BOOL isRequesting; |
| 37 | @end | 37 | @end |
| 38 | 38 | ||
| 39 | @implementation MapViewController | 39 | @implementation MapViewController |
| 40 | 40 | ||
| 41 | - (void)viewDidLoad { | 41 | - (void)viewDidLoad { |
| 42 | [super viewDidLoad]; | 42 | [super viewDidLoad]; |
| 43 | // Do any additional setup after loading the view from its nib. | 43 | // Do any additional setup after loading the view from its nib. |
| 44 | self.title = NSLocalizedString(@"lifelog.tapbar.map", nil); | 44 | self.title = NSLocalizedString(@"lifelog.tapbar.map", nil); |
| 45 | [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.mapView attribute:NSLayoutAttributeTop multiplier:1 constant:0]]; | 45 | [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.mapView attribute:NSLayoutAttributeTop multiplier:1 constant:0]]; |
| 46 | geocoder = [[CLGeocoder alloc] init]; | 46 | geocoder = [[CLGeocoder alloc] init]; |
| 47 | [self setupLocation]; | 47 | [self setupLocation]; |
| 48 | [self setupMapView]; | 48 | [self setupMapView]; |
| 49 | previousLocation = nil; | 49 | previousLocation = nil; |
| 50 | 50 | ||
| 51 | if ([CMPedometer isStepCountingAvailable]) { | 51 | if ([CMPedometer isStepCountingAvailable]) { |
| 52 | _pedometer = [[CMPedometer alloc] init]; | 52 | _pedometer = [[CMPedometer alloc] init]; |
| 53 | } | 53 | } |
| 54 | if ([CMMotionActivityManager isActivityAvailable]) { | 54 | if ([CMMotionActivityManager isActivityAvailable]) { |
| 55 | _motionActivityManager = [[CMMotionActivityManager alloc] init]; | 55 | _motionActivityManager = [[CMMotionActivityManager alloc] init]; |
| 56 | } | 56 | } |
| 57 | self.isRequesting = NO; | 57 | self.isRequesting = NO; |
| 58 | _countTime = 0; | 58 | _countTime = 0; |
| 59 | self.lblUnitStep.text = NSLocalizedString(@"lifelog.home.unit.step", nil); | 59 | self.lblUnitStep.text = NSLocalizedString(@"lifelog.home.unit.step", nil); |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | - (void)didReceiveMemoryWarning { | 62 | - (void)didReceiveMemoryWarning { |
| 63 | [super didReceiveMemoryWarning]; | 63 | [super didReceiveMemoryWarning]; |
| 64 | // Dispose of any resources that can be recreated. | 64 | // Dispose of any resources that can be recreated. |
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | - (void)viewWillAppear:(BOOL)animated { | 67 | - (void)viewWillAppear:(BOOL)animated { |
| 68 | [super viewWillAppear:animated]; | 68 | [super viewWillAppear:animated]; |
| 69 | _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(countStep) userInfo:nil repeats:YES]; | 69 | _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(countStep) userInfo:nil repeats:YES]; |
| 70 | [_timer fire]; | 70 | [_timer fire]; |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | - (void)viewWillDisappear:(BOOL)animated { | 73 | //- (void)viewWillDisappear:(BOOL)animated { |
| 74 | [super viewWillDisappear:animated]; | 74 | // [super viewWillDisappear:animated]; |
| 75 | [_timer invalidate]; | 75 | // [_timer invalidate]; |
| 76 | } | 76 | //} |
| 77 | 77 | ||
| 78 | #pragma mark - CLLocationManagerDelegate | 78 | #pragma mark - CLLocationManagerDelegate |
| 79 | -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { | 79 | -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { |
| 80 | 80 | ||
| 81 | CLLocation *newLocation = [locations lastObject]; | 81 | CLLocation *newLocation = [locations lastObject]; |
| 82 | if (previousLocation == nil) { | 82 | if (previousLocation == nil) { |
| 83 | [self addAnnotationsOnMap:newLocation]; | 83 | [self addAnnotationsOnMap:newLocation]; |
| 84 | } | 84 | } |
| 85 | else { | 85 | else { |
| 86 | CLLocationCoordinate2D area[2]; | 86 | CLLocationCoordinate2D area[2]; |
| 87 | area[0] = previousLocation.coordinate; | 87 | area[0] = previousLocation.coordinate; |
| 88 | area[1] = newLocation.coordinate; | 88 | area[1] = newLocation.coordinate; |
| 89 | MKPolyline *polyLine = [MKPolyline polylineWithCoordinates:area count:2]; | 89 | MKPolyline *polyLine = [MKPolyline polylineWithCoordinates:area count:2]; |
| 90 | [_mapView addOverlay:polyLine]; | 90 | [_mapView addOverlay:polyLine]; |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | previousLocation = newLocation; | 93 | previousLocation = newLocation; |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error | 96 | - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error |
| 97 | { | 97 | { |
| 98 | NSLog(@"Cannot find the location."); | 98 | NSLog(@"Cannot find the location."); |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | #pragma mark - MKMapViewDelegate | 101 | #pragma mark - MKMapViewDelegate |
| 102 | - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay | 102 | - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay |
| 103 | { | 103 | { |
| 104 | if ([overlay isKindOfClass:[MKPolyline class]]) { | 104 | if ([overlay isKindOfClass:[MKPolyline class]]) { |
| 105 | MKPolylineRenderer *pr = [[MKPolylineRenderer alloc] initWithOverlay:overlay]; | 105 | MKPolylineRenderer *pr = [[MKPolylineRenderer alloc] initWithOverlay:overlay]; |
| 106 | pr.strokeColor = [UIColor redColor]; | 106 | pr.strokeColor = [UIColor redColor]; |
| 107 | pr.lineWidth = 5; | 107 | pr.lineWidth = 5; |
| 108 | return pr; | 108 | return pr; |
| 109 | } | 109 | } |
| 110 | return nil; | 110 | return nil; |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | #pragma mark - Functions Private | 113 | #pragma mark - Functions Private |
| 114 | 114 | ||
| 115 | - (void)addAnnotationsOnMap:(CLLocation *)locationToPoint { | 115 | - (void)addAnnotationsOnMap:(CLLocation *)locationToPoint { |
| 116 | MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init]; | 116 | MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init]; |
| 117 | annotation.coordinate = locationToPoint.coordinate; | 117 | annotation.coordinate = locationToPoint.coordinate; |
| 118 | [geocoder reverseGeocodeLocation:locationToPoint completionHandler:^(NSArray *placemarks, NSError *error) { | 118 | [geocoder reverseGeocodeLocation:locationToPoint completionHandler:^(NSArray *placemarks, NSError *error) { |
| 119 | if (error == nil && [placemarks count] >0) { | 119 | if (error == nil && [placemarks count] >0) { |
| 120 | placemark = [placemarks firstObject]; | 120 | placemark = [placemarks firstObject]; |
| 121 | NSDictionary *addressDict = placemark.addressDictionary; | 121 | NSDictionary *addressDict = placemark.addressDictionary; |
| 122 | annotation.title = [NSString stringWithFormat:@"%@", addressDict[@"Name"]]; | 122 | annotation.title = [NSString stringWithFormat:@"%@", addressDict[@"Name"]]; |
| 123 | [_mapView addAnnotation:annotation]; | 123 | [_mapView addAnnotation:annotation]; |
| 124 | } | 124 | } |
| 125 | }]; | 125 | }]; |
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | - (void)setupLocation { | 128 | - (void)setupLocation { |
| 129 | _locationManager = [[CLLocationManager alloc] init]; | 129 | _locationManager = [[CLLocationManager alloc] init]; |
| 130 | _locationManager.desiredAccuracy = kCLLocationAccuracyBest; | 130 | _locationManager.desiredAccuracy = kCLLocationAccuracyBest; |
| 131 | _locationManager.delegate = self; | 131 | _locationManager.delegate = self; |
| 132 | CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; | 132 | CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; |
| 133 | if (status == kCLAuthorizationStatusNotDetermined || status == kCLAuthorizationStatusDenied || status == kCLAuthorizationStatusAuthorizedWhenInUse) { | 133 | if (status == kCLAuthorizationStatusNotDetermined || status == kCLAuthorizationStatusDenied || status == kCLAuthorizationStatusAuthorizedWhenInUse) { |
| 134 | [_locationManager requestWhenInUseAuthorization]; | 134 | [_locationManager requestWhenInUseAuthorization]; |
| 135 | [_locationManager requestAlwaysAuthorization]; | 135 | [_locationManager requestAlwaysAuthorization]; |
| 136 | } | 136 | } |
| 137 | [_locationManager startUpdatingLocation]; | 137 | [_locationManager startUpdatingLocation]; |
| 138 | [_locationManager startUpdatingHeading]; | 138 | [_locationManager startUpdatingHeading]; |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | - (void)setupMapView { | 141 | - (void)setupMapView { |
| 142 | _mapView.delegate = self; | 142 | _mapView.delegate = self; |
| 143 | _mapView.showsUserLocation = YES; | 143 | _mapView.showsUserLocation = YES; |
| 144 | _mapView.mapType = MKMapTypeStandard; | 144 | _mapView.mapType = MKMapTypeStandard; |
| 145 | _mapView.userTrackingMode = MKUserTrackingModeFollowWithHeading; | 145 | _mapView.userTrackingMode = MKUserTrackingModeFollowWithHeading; |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | #pragma mark - Functions Private | 148 | #pragma mark - Functions Private |
| 149 | - (void)countStep | 149 | - (void)countStep |
| 150 | { | 150 | { |
| 151 | _countTime++; | 151 | _countTime++; |
| 152 | _lblTime.text = [self convertTime:_countTime]; | 152 | _lblTime.text = [self convertTime:_countTime]; |
| 153 | _slider.value = _countTime; | 153 | _slider.value = _countTime; |
| 154 | if (self.isRequesting == YES) { | 154 | if (self.isRequesting == YES) { |
| 155 | return; | 155 | return; |
| 156 | } | 156 | } |
| 157 | if ([CMMotionActivityManager isActivityAvailable]) { | 157 | if ([CMMotionActivityManager isActivityAvailable]) { |
| 158 | self.isRequesting = YES; | 158 | self.isRequesting = YES; |
| 159 | NSDate *endDate = [NSDate date]; | 159 | NSDate *endDate = [NSDate date]; |
| 160 | NSDate *startDate = [endDate beginningAtMidnightOfDay]; | 160 | NSDate *startDate = [endDate beginningAtMidnightOfDay]; |
| 161 | MapViewController __weak *weakSelf = self; | 161 | MapViewController __weak *weakSelf = self; |
| 162 | dispatch_queue_t myQueue = dispatch_queue_create("mobileworld.jp.lifelog", NULL); | 162 | dispatch_queue_t myQueue = dispatch_queue_create("mobileworld.jp.lifelog", NULL); |
| 163 | dispatch_async(myQueue, ^{ | 163 | dispatch_async(myQueue, ^{ |
| 164 | if (weakSelf == nil) { | 164 | if (weakSelf == nil) { |
| 165 | return ; | 165 | return ; |
| 166 | } | 166 | } |
| 167 | [weakSelf.pedometer queryPedometerDataFromDate:startDate toDate:endDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) { | 167 | [weakSelf.pedometer queryPedometerDataFromDate:startDate toDate:endDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) { |
| 168 | NSInteger numberStep = [pedometerData.numberOfSteps integerValue]; | 168 | NSInteger numberStep = [pedometerData.numberOfSteps integerValue]; |
| 169 | dispatch_async(dispatch_get_main_queue(), ^{ | 169 | dispatch_async(dispatch_get_main_queue(), ^{ |
| 170 | [weakSelf updateStepUI:numberStep]; | 170 | [weakSelf updateStepUI:numberStep]; |
| 171 | }); | 171 | }); |
| 172 | }]; | 172 | }]; |
| 173 | }); | 173 | }); |
| 174 | } | 174 | } |
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | - (NSString *)convertTime:(int)time | 177 | - (NSString *)convertTime:(int)time |
| 178 | { | 178 | { |
| 179 | NSString *result = @""; | 179 | NSString *result = @""; |
| 180 | int hour = time/3600; | 180 | int hour = time/3600; |
| 181 | int minute = time/60; | 181 | int minute = time/60; |
| 182 | int second = time % 60; | 182 | int second = time % 60; |
| 183 | result = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, minute, second]; | 183 | result = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, minute, second]; |
| 184 | return result; | 184 | return result; |
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | - (void)updateStepUI:(NSInteger)numberStep | 187 | - (void)updateStepUI:(NSInteger)numberStep |
| 188 | { | 188 | { |
| 189 | // NSLog(@"Number of step: %ld", numberStep); | 189 | // NSLog(@"Number of step: %ld", numberStep); |
| 190 | self.isRequesting = NO; | 190 | self.isRequesting = NO; |
| 191 | self.lblValueStep.text = [Utilities addCommaFromNumber:numberStep]; | 191 | self.lblValueStep.text = [Utilities addCommaFromNumber:numberStep]; |
| 192 | } | 192 | } |
| 193 | 193 | ||
| 194 | @end | 194 | @end |
| 195 | 195 |
LifeLog/LifeLog/TodayViewController.m
| 1 | // | 1 | // |
| 2 | // TodayViewController.m | 2 | // TodayViewController.m |
| 3 | // LifeLog | 3 | // LifeLog |
| 4 | // | 4 | // |
| 5 | // Created by Nguyen Van Phong on 7/29/17. | 5 | // Created by Nguyen Van Phong on 7/29/17. |
| 6 | // Copyright © 2017 PhongNV. All rights reserved. | 6 | // Copyright © 2017 PhongNV. All rights reserved. |
| 7 | // | 7 | // |
| 8 | 8 | ||
| 9 | #import "TodayViewController.h" | 9 | #import "TodayViewController.h" |
| 10 | #import <CircleProgressBar/CircleProgressBar.h> | 10 | #import <CircleProgressBar/CircleProgressBar.h> |
| 11 | #import <CoreMotion/CoreMotion.h> | 11 | #import <CoreMotion/CoreMotion.h> |
| 12 | #import "NSDate+helper.h" | 12 | #import "NSDate+helper.h" |
| 13 | #import "Utilities.h" | 13 | #import "Utilities.h" |
| 14 | 14 | ||
| 15 | static NSInteger numberTotal = 10000; | 15 | static NSInteger numberTotal = 10000; |
| 16 | 16 | ||
| 17 | @interface TodayViewController () | 17 | @interface TodayViewController () |
| 18 | @property (nonatomic, weak) IBOutlet UILabel *lblTitle; | 18 | @property (nonatomic, weak) IBOutlet UILabel *lblTitle; |
| 19 | @property (weak, nonatomic) IBOutlet CircleProgressBar *circleProgressToday; | 19 | @property (weak, nonatomic) IBOutlet CircleProgressBar *circleProgressToday; |
| 20 | @property (weak, nonatomic) IBOutlet UILabel *lblValueStep; | 20 | @property (weak, nonatomic) IBOutlet UILabel *lblValueStep; |
| 21 | @property (weak, nonatomic) IBOutlet UILabel *lblTotalStep; | 21 | @property (weak, nonatomic) IBOutlet UILabel *lblTotalStep; |
| 22 | @property (weak, nonatomic) IBOutlet UILabel *lblRemainingStep; | 22 | @property (weak, nonatomic) IBOutlet UILabel *lblRemainingStep; |
| 23 | @property (weak, nonatomic) IBOutlet UILabel *lblTotalStepOther; | 23 | @property (weak, nonatomic) IBOutlet UILabel *lblTotalStepOther; |
| 24 | @property (weak, nonatomic) IBOutlet UILabel *lblRemainingStepOther; | 24 | @property (weak, nonatomic) IBOutlet UILabel *lblRemainingStepOther; |
| 25 | @property (weak, nonatomic) IBOutlet UILabel *lblPercent; | 25 | @property (weak, nonatomic) IBOutlet UILabel *lblPercent; |
| 26 | 26 | ||
| 27 | @property (nonatomic, strong) CMPedometer *pedometer; | 27 | @property (nonatomic, strong) CMPedometer *pedometer; |
| 28 | @property (nonatomic, strong) CMMotionActivityManager *motionActivityManager; | 28 | @property (nonatomic, strong) CMMotionActivityManager *motionActivityManager; |
| 29 | @property (nonatomic, strong) NSOperationQueue *operationQueue; | 29 | @property (nonatomic, strong) NSOperationQueue *operationQueue; |
| 30 | @property (nonatomic, strong) NSTimer *timer; | 30 | @property (nonatomic, strong) NSTimer *timer; |
| 31 | 31 | ||
| 32 | @property (nonatomic, assign) BOOL isRequesting; | 32 | @property (nonatomic, assign) BOOL isRequesting; |
| 33 | @end | 33 | @end |
| 34 | 34 | ||
| 35 | @implementation TodayViewController | 35 | @implementation TodayViewController |
| 36 | 36 | ||
| 37 | - (void)viewDidLoad { | 37 | - (void)viewDidLoad { |
| 38 | [super viewDidLoad]; | 38 | [super viewDidLoad]; |
| 39 | // Do any additional setup after loading the view from its nib. | 39 | // Do any additional setup after loading the view from its nib. |
| 40 | self.lblTitle.text = NSLocalizedString(@"lifelog.today.title", nil); | 40 | self.lblTitle.text = NSLocalizedString(@"lifelog.today.title", nil); |
| 41 | 41 | ||
| 42 | [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.lblTitle attribute:NSLayoutAttributeTop multiplier:1 constant:0]]; | 42 | [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.lblTitle attribute:NSLayoutAttributeTop multiplier:1 constant:0]]; |
| 43 | 43 | ||
| 44 | if ([CMPedometer isStepCountingAvailable]) { | 44 | if ([CMPedometer isStepCountingAvailable]) { |
| 45 | _pedometer = [[CMPedometer alloc] init]; | 45 | _pedometer = [[CMPedometer alloc] init]; |
| 46 | } | 46 | } |
| 47 | if ([CMMotionActivityManager isActivityAvailable]) { | 47 | if ([CMMotionActivityManager isActivityAvailable]) { |
| 48 | _motionActivityManager = [[CMMotionActivityManager alloc] init]; | 48 | _motionActivityManager = [[CMMotionActivityManager alloc] init]; |
| 49 | } | 49 | } |
| 50 | self.isRequesting = NO; | 50 | self.isRequesting = NO; |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | - (void)viewWillAppear:(BOOL)animated { | 53 | - (void)viewWillAppear:(BOOL)animated { |
| 54 | [super viewWillAppear:animated]; | 54 | [super viewWillAppear:animated]; |
| 55 | _timer = [NSTimer scheduledTimerWithTimeInterval:0.3f target:self selector:@selector(countStep) userInfo:nil repeats:YES]; | 55 | _timer = [NSTimer scheduledTimerWithTimeInterval:0.3f target:self selector:@selector(countStep) userInfo:nil repeats:YES]; |
| 56 | [_timer fire]; | 56 | [_timer fire]; |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | - (void)viewWillDisappear:(BOOL)animated { | 59 | - (void)viewWillDisappear:(BOOL)animated { |
| 60 | [super viewWillDisappear:animated]; | 60 | [super viewWillDisappear:animated]; |
| 61 | [_timer invalidate]; | 61 | [_timer invalidate]; |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | - (void)didReceiveMemoryWarning { | 64 | - (void)didReceiveMemoryWarning { |
| 65 | [super didReceiveMemoryWarning]; | 65 | [super didReceiveMemoryWarning]; |
| 66 | // Dispose of any resources that can be recreated. | 66 | // Dispose of any resources that can be recreated. |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | #pragma mark - IBAction | 69 | #pragma mark - IBAction |
| 70 | - (IBAction)menuButtonTouchUpInside:(id)sender | 70 | - (IBAction)menuButtonTouchUpInside:(id)sender |
| 71 | { | 71 | { |
| 72 | 72 | ||
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | - (IBAction)backButtonTouchUpInside:(id)sender | 75 | - (IBAction)backButtonTouchUpInside:(id)sender |
| 76 | { | 76 | { |
| 77 | [self.navigationController popViewControllerAnimated:YES]; | 77 | [self.navigationController popViewControllerAnimated:YES]; |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | - (IBAction)buttonShareTouchUpInside:(id)sender { | ||
| 81 | |||
| 82 | } | ||
| 83 | |||
| 84 | - (IBAction)buttonFacebookTouchUpInside:(id)sender { | ||
| 85 | NSString * content = @"Finish 500 steps"; | ||
| 86 | TodayViewController __weak *weakSelf = self; | ||
| 87 | [Utilities shareFacebook:content withViewController:weakSelf]; | ||
| 88 | } | ||
| 89 | |||
| 90 | - (IBAction)buttonLineTouchUpInside:(id)sender { | ||
| 91 | NSString * content = @"Finish 500 steps"; | ||
| 92 | TodayViewController __weak *weakSelf = self; | ||
| 93 | [Utilities shareLine:content withViewController:weakSelf]; | ||
| 94 | } | ||
| 95 | |||
| 80 | #pragma mark - Functions Private | 96 | #pragma mark - Functions Private |
| 81 | - (void)countStep | 97 | - (void)countStep |
| 82 | { | 98 | { |
| 83 | if (self.isRequesting == YES) { | 99 | if (self.isRequesting == YES) { |
| 84 | return; | 100 | return; |
| 85 | } | 101 | } |
| 86 | if ([CMMotionActivityManager isActivityAvailable]) { | 102 | if ([CMMotionActivityManager isActivityAvailable]) { |
| 87 | self.isRequesting = YES; | 103 | self.isRequesting = YES; |
| 88 | NSDate *endDate = [NSDate date]; | 104 | NSDate *endDate = [NSDate date]; |
| 89 | NSDate *startDate = [endDate beginningAtMidnightOfDay]; | 105 | NSDate *startDate = [endDate beginningAtMidnightOfDay]; |
| 90 | TodayViewController __weak *weakSelf = self; | 106 | TodayViewController __weak *weakSelf = self; |
| 91 | dispatch_queue_t myQueue = dispatch_queue_create("mobileworld.jp.lifelog", NULL); | 107 | dispatch_queue_t myQueue = dispatch_queue_create("mobileworld.jp.lifelog", NULL); |
| 92 | dispatch_async(myQueue, ^{ | 108 | dispatch_async(myQueue, ^{ |
| 93 | if (weakSelf == nil) { | 109 | if (weakSelf == nil) { |
| 94 | return ; | 110 | return ; |
| 95 | } | 111 | } |
| 96 | [weakSelf.pedometer queryPedometerDataFromDate:startDate toDate:endDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) { | 112 | [weakSelf.pedometer queryPedometerDataFromDate:startDate toDate:endDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) { |
| 97 | NSInteger numberStep = [pedometerData.numberOfSteps integerValue]; | 113 | NSInteger numberStep = [pedometerData.numberOfSteps integerValue]; |
| 98 | dispatch_async(dispatch_get_main_queue(), ^{ | 114 | dispatch_async(dispatch_get_main_queue(), ^{ |
| 99 | [weakSelf updateStepUI:numberStep]; | 115 | [weakSelf updateStepUI:numberStep]; |
| 100 | }); | 116 | }); |
| 101 | }]; | 117 | }]; |
| 102 | }); | 118 | }); |
| 103 | } | 119 | } |
| 104 | } | 120 | } |
| 105 | 121 | ||
| 106 | - (void)updateStepUI:(NSInteger)numberStep | 122 | - (void)updateStepUI:(NSInteger)numberStep |
| 107 | { | 123 | { |
| 108 | // NSLog(@"Number of step: %ld", numberStep); | 124 | // NSLog(@"Number of step: %ld", numberStep); |
| 109 | self.isRequesting = NO; | 125 | self.isRequesting = NO; |
| 110 | float valueProgress = numberStep*1.f/numberTotal; | 126 | float valueProgress = numberStep*1.f/numberTotal; |
| 111 | [self.circleProgressToday setProgress:valueProgress animated:YES]; | 127 | [self.circleProgressToday setProgress:valueProgress animated:YES]; |
| 112 | self.lblValueStep.text = [Utilities addCommaFromNumber:numberStep]; | 128 | self.lblValueStep.text = [Utilities addCommaFromNumber:numberStep]; |
| 113 | self.lblTotalStep.text = [NSString stringWithFormat:@"/ %@", [Utilities addCommaFromNumber:numberTotal]]; | 129 | self.lblTotalStep.text = [NSString stringWithFormat:@"/ %@", [Utilities addCommaFromNumber:numberTotal]]; |
| 114 | self.lblRemainingStep.text = [NSString stringWithFormat:@"%@%ld%@", NSLocalizedString(@"lifelog.today.remaining.step.1", nil), (numberTotal - numberStep), NSLocalizedString(@"lifelog.today.remaining.step.2", nil)]; | 130 | self.lblRemainingStep.text = [NSString stringWithFormat:@"%@%ld%@", NSLocalizedString(@"lifelog.today.remaining.step.1", nil), (numberTotal - numberStep), NSLocalizedString(@"lifelog.today.remaining.step.2", nil)]; |
| 115 | self.lblTotalStepOther.text = [NSString stringWithFormat:@"%@%@%@", NSLocalizedString(@"lifelog.today.total.other", nil), [Utilities addCommaFromNumber:numberTotal], NSLocalizedString(@"lifelog.today.unit.step", nil)]; | 131 | self.lblTotalStepOther.text = [NSString stringWithFormat:@"%@%@%@", NSLocalizedString(@"lifelog.today.total.other", nil), [Utilities addCommaFromNumber:numberTotal], NSLocalizedString(@"lifelog.today.unit.step", nil)]; |
| 116 | self.lblRemainingStepOther.text = [NSString stringWithFormat:@"%@%ld%@", NSLocalizedString(@"lifelog.today.remaining.other", nil), (numberTotal - numberStep), NSLocalizedString(@"lifelog.today.unit.step", nil)]; | 132 | self.lblRemainingStepOther.text = [NSString stringWithFormat:@"%@%ld%@", NSLocalizedString(@"lifelog.today.remaining.other", nil), (numberTotal - numberStep), NSLocalizedString(@"lifelog.today.unit.step", nil)]; |
| 117 | self.lblPercent.text = [NSString stringWithFormat:@"%@%i%@", NSLocalizedString(@"lifelog.today.text.percent", nil), (int)(numberStep*100/numberTotal), NSLocalizedString(@"lifelog.today.percent", nil)]; | 133 | self.lblPercent.text = [NSString stringWithFormat:@"%@%i%@", NSLocalizedString(@"lifelog.today.text.percent", nil), (int)(numberStep*100/numberTotal), NSLocalizedString(@"lifelog.today.percent", nil)]; |
| 118 | } | 134 | } |
| 119 | 135 | ||
| 120 | @end | 136 | @end |
| 121 | 137 |
LifeLog/LifeLog/TodayViewController.xib
| 1 | <?xml version="1.0" encoding="UTF-8"?> | 1 | <?xml version="1.0" encoding="UTF-8"?> |
| 2 | <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="12121" systemVersion="16F73" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES"> | 2 | <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES"> |
| 3 | <device id="retina4_7" orientation="portrait"> | 3 | <device id="retina4_7" orientation="portrait"> |
| 4 | <adaptation id="fullscreen"/> | 4 | <adaptation id="fullscreen"/> |
| 5 | </device> | 5 | </device> |
| 6 | <dependencies> | 6 | <dependencies> |
| 7 | <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/> | 7 | <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/> |
| 8 | <capability name="Aspect ratio constraints" minToolsVersion="5.1"/> | 8 | <capability name="Aspect ratio constraints" minToolsVersion="5.1"/> |
| 9 | <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/> | 9 | <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/> |
| 10 | <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | 10 | <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> |
| 11 | </dependencies> | 11 | </dependencies> |
| 12 | <objects> | 12 | <objects> |
| 13 | <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TodayViewController"> | 13 | <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TodayViewController"> |
| 14 | <connections> | 14 | <connections> |
| 15 | <outlet property="circleProgressToday" destination="oRx-7J-bma" id="ljj-Xx-OOH"/> | 15 | <outlet property="circleProgressToday" destination="oRx-7J-bma" id="ljj-Xx-OOH"/> |
| 16 | <outlet property="lblPercent" destination="11m-je-qZ1" id="Tjq-td-B22"/> | 16 | <outlet property="lblPercent" destination="11m-je-qZ1" id="Tjq-td-B22"/> |
| 17 | <outlet property="lblRemainingStep" destination="dEz-7j-nXc" id="03L-hQ-Kiv"/> | 17 | <outlet property="lblRemainingStep" destination="dEz-7j-nXc" id="03L-hQ-Kiv"/> |
| 18 | <outlet property="lblRemainingStepOther" destination="V2B-wZ-Efk" id="XNr-bG-LbN"/> | 18 | <outlet property="lblRemainingStepOther" destination="V2B-wZ-Efk" id="XNr-bG-LbN"/> |
| 19 | <outlet property="lblTitle" destination="2SZ-sd-ADD" id="Ztf-W5-jwd"/> | 19 | <outlet property="lblTitle" destination="2SZ-sd-ADD" id="Ztf-W5-jwd"/> |
| 20 | <outlet property="lblTotalStep" destination="Fvu-lz-xIk" id="i1e-DL-7QA"/> | 20 | <outlet property="lblTotalStep" destination="Fvu-lz-xIk" id="i1e-DL-7QA"/> |
| 21 | <outlet property="lblTotalStepOther" destination="dQq-cp-R2A" id="ugW-Wi-BFI"/> | 21 | <outlet property="lblTotalStepOther" destination="dQq-cp-R2A" id="ugW-Wi-BFI"/> |
| 22 | <outlet property="lblValueStep" destination="iCl-1r-Bwp" id="Zpf-6A-8cO"/> | 22 | <outlet property="lblValueStep" destination="iCl-1r-Bwp" id="Zpf-6A-8cO"/> |
| 23 | <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/> | 23 | <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/> |
| 24 | </connections> | 24 | </connections> |
| 25 | </placeholder> | 25 | </placeholder> |
| 26 | <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> | 26 | <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> |
| 27 | <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT"> | 27 | <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT"> |
| 28 | <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> | 28 | <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> |
| 29 | <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | 29 | <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> |
| 30 | <subviews> | 30 | <subviews> |
| 31 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="TODAY" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2SZ-sd-ADD" userLabel="LabelTitle"> | 31 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="TODAY" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2SZ-sd-ADD" userLabel="LabelTitle"> |
| 32 | <rect key="frame" x="0.0" y="0.0" width="375" height="44"/> | 32 | <rect key="frame" x="0.0" y="0.0" width="375" height="44"/> |
| 33 | <color key="backgroundColor" red="0.098039215690000001" green="0.098039215690000001" blue="0.098039215690000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | 33 | <color key="backgroundColor" red="0.098039215690000001" green="0.098039215690000001" blue="0.098039215690000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> |
| 34 | <constraints> | 34 | <constraints> |
| 35 | <constraint firstAttribute="height" constant="44" id="Qgv-Kk-P8u"/> | 35 | <constraint firstAttribute="height" constant="44" id="Qgv-Kk-P8u"/> |
| 36 | </constraints> | 36 | </constraints> |
| 37 | <fontDescription key="fontDescription" type="system" pointSize="23"/> | 37 | <fontDescription key="fontDescription" type="system" pointSize="23"/> |
| 38 | <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | 38 | <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> |
| 39 | <nil key="highlightedColor"/> | 39 | <nil key="highlightedColor"/> |
| 40 | </label> | 40 | </label> |
| 41 | <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="RSj-iV-Oaf" userLabel="ButtonMenu"> | 41 | <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="RSj-iV-Oaf" userLabel="ButtonMenu"> |
| 42 | <rect key="frame" x="335" y="7" width="30" height="30"/> | 42 | <rect key="frame" x="335" y="7" width="30" height="30"/> |
| 43 | <constraints> | 43 | <constraints> |
| 44 | <constraint firstAttribute="width" secondItem="RSj-iV-Oaf" secondAttribute="height" multiplier="1:1" id="Paf-pW-iOE"/> | 44 | <constraint firstAttribute="width" secondItem="RSj-iV-Oaf" secondAttribute="height" multiplier="1:1" id="Paf-pW-iOE"/> |
| 45 | <constraint firstAttribute="width" constant="30" id="ZEC-Fx-ygL"/> | 45 | <constraint firstAttribute="width" constant="30" id="ZEC-Fx-ygL"/> |
| 46 | </constraints> | 46 | </constraints> |
| 47 | <state key="normal" image="icon_menu"/> | 47 | <state key="normal" image="icon_menu"/> |
| 48 | <connections> | 48 | <connections> |
| 49 | <action selector="menuButtonTouchUpInside:" destination="-1" eventType="touchUpInside" id="74L-R4-bfn"/> | 49 | <action selector="menuButtonTouchUpInside:" destination="-1" eventType="touchUpInside" id="74L-R4-bfn"/> |
| 50 | </connections> | 50 | </connections> |
| 51 | </button> | 51 | </button> |
| 52 | <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yOP-KX-J14" userLabel="ButtonBack"> | 52 | <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yOP-KX-J14" userLabel="ButtonBack"> |
| 53 | <rect key="frame" x="5" y="3" width="73" height="37"/> | 53 | <rect key="frame" x="5" y="3" width="73" height="37"/> |
| 54 | <constraints> | 54 | <constraints> |
| 55 | <constraint firstAttribute="height" constant="37" id="A6m-b2-WXH"/> | 55 | <constraint firstAttribute="height" constant="37" id="A6m-b2-WXH"/> |
| 56 | <constraint firstAttribute="width" constant="73" id="YO8-PV-PiT"/> | 56 | <constraint firstAttribute="width" constant="73" id="YO8-PV-PiT"/> |
| 57 | </constraints> | 57 | </constraints> |
| 58 | <state key="normal" image="today_back_button"/> | 58 | <state key="normal" image="today_back_button"/> |
| 59 | <connections> | 59 | <connections> |
| 60 | <action selector="backButtonTouchUpInside:" destination="-1" eventType="touchUpInside" id="on4-Ru-Xpf"/> | 60 | <action selector="backButtonTouchUpInside:" destination="-1" eventType="touchUpInside" id="on4-Ru-Xpf"/> |
| 61 | </connections> | 61 | </connections> |
| 62 | </button> | 62 | </button> |
| 63 | <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_share" translatesAutoresizingMaskIntoConstraints="NO" id="PW6-AR-UCs"> | 63 | <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_share" translatesAutoresizingMaskIntoConstraints="NO" id="PW6-AR-UCs"> |
| 64 | <rect key="frame" x="8" y="137" width="42" height="57"/> | 64 | <rect key="frame" x="8" y="137" width="42" height="57"/> |
| 65 | <constraints> | 65 | <constraints> |
| 66 | <constraint firstAttribute="height" constant="57" id="7WA-3l-0cr"/> | 66 | <constraint firstAttribute="height" constant="57" id="7WA-3l-0cr"/> |
| 67 | <constraint firstAttribute="width" constant="42" id="abX-W4-Ho4"/> | 67 | <constraint firstAttribute="width" constant="42" id="abX-W4-Ho4"/> |
| 68 | </constraints> | 68 | </constraints> |
| 69 | </imageView> | 69 | </imageView> |
| 70 | <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="1ak-Ne-wz9" userLabel="ButtonShare"> | ||
| 71 | <rect key="frame" x="8" y="137" width="42" height="57"/> | ||
| 72 | <connections> | ||
| 73 | <action selector="buttonShareTouchUpInside:" destination="-1" eventType="touchUpInside" id="dkw-ed-JhQ"/> | ||
| 74 | </connections> | ||
| 75 | </button> | ||
| 70 | <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_facebook" translatesAutoresizingMaskIntoConstraints="NO" id="Jtx-be-zjg"> | 76 | <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_facebook" translatesAutoresizingMaskIntoConstraints="NO" id="Jtx-be-zjg"> |
| 71 | <rect key="frame" x="8" y="202" width="40" height="40"/> | 77 | <rect key="frame" x="8" y="202" width="40" height="40"/> |
| 72 | <constraints> | 78 | <constraints> |
| 73 | <constraint firstAttribute="width" constant="40" id="2Fe-7S-LCC"/> | 79 | <constraint firstAttribute="width" constant="40" id="2Fe-7S-LCC"/> |
| 74 | <constraint firstAttribute="height" constant="40" id="5hP-gZ-Qrl"/> | 80 | <constraint firstAttribute="height" constant="40" id="5hP-gZ-Qrl"/> |
| 75 | </constraints> | 81 | </constraints> |
| 76 | </imageView> | 82 | </imageView> |
| 83 | <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="HLr-Qj-bm4" userLabel="ButtonFacebook"> | ||
| 84 | <rect key="frame" x="8" y="202" width="40" height="40"/> | ||
| 85 | <connections> | ||
| 86 | <action selector="buttonFacebookTouchUpInside:" destination="-1" eventType="touchUpInside" id="MHi-pC-vsR"/> | ||
| 87 | </connections> | ||
| 88 | </button> | ||
| 77 | <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_line" translatesAutoresizingMaskIntoConstraints="NO" id="wHy-xz-GJV"> | 89 | <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_line" translatesAutoresizingMaskIntoConstraints="NO" id="wHy-xz-GJV"> |
| 78 | <rect key="frame" x="8" y="250" width="40" height="40"/> | 90 | <rect key="frame" x="8" y="250" width="40" height="40"/> |
| 79 | <constraints> | 91 | <constraints> |
| 80 | <constraint firstAttribute="width" constant="40" id="ElF-BB-cgs"/> | 92 | <constraint firstAttribute="width" constant="40" id="ElF-BB-cgs"/> |
| 81 | <constraint firstAttribute="height" constant="40" id="myc-Ev-aCy"/> | 93 | <constraint firstAttribute="height" constant="40" id="myc-Ev-aCy"/> |
| 82 | </constraints> | 94 | </constraints> |
| 83 | </imageView> | 95 | </imageView> |
| 96 | <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="equ-yC-hU1" userLabel="ButtonLine"> | ||
| 97 | <rect key="frame" x="8" y="250" width="40" height="40"/> | ||
| 98 | <connections> | ||
| 99 | <action selector="buttonLineTouchUpInside:" destination="-1" eventType="touchUpInside" id="9mi-bX-Uqp"/> | ||
| 100 | </connections> | ||
| 101 | </button> | ||
| 84 | <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oRx-7J-bma" customClass="CircleProgressBar"> | 102 | <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oRx-7J-bma" customClass="CircleProgressBar"> |
| 85 | <rect key="frame" x="60" y="94" width="255" height="255"/> | 103 | <rect key="frame" x="60" y="94" width="255" height="255"/> |
| 86 | <subviews> | 104 | <subviews> |
| 87 | <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qQS-5K-MuA" userLabel="ViewContent"> | 105 | <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qQS-5K-MuA" userLabel="ViewContent"> |
| 88 | <rect key="frame" x="59" y="43" width="136" height="170"/> | 106 | <rect key="frame" x="59" y="43" width="136" height="170"/> |
| 89 | <subviews> | 107 | <subviews> |
| 90 | <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_walking" translatesAutoresizingMaskIntoConstraints="NO" id="VwM-9C-Dye"> | 108 | <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_walking" translatesAutoresizingMaskIntoConstraints="NO" id="VwM-9C-Dye"> |
| 91 | <rect key="frame" x="61" y="2" width="14" height="25"/> | 109 | <rect key="frame" x="61" y="2" width="14" height="25"/> |
| 92 | <constraints> | 110 | <constraints> |
| 93 | <constraint firstAttribute="width" constant="14" id="mn6-eU-59Y"/> | 111 | <constraint firstAttribute="width" constant="14" id="mn6-eU-59Y"/> |
| 94 | <constraint firstAttribute="height" constant="25" id="rok-3H-sX5"/> | 112 | <constraint firstAttribute="height" constant="25" id="rok-3H-sX5"/> |
| 95 | </constraints> | 113 | </constraints> |
| 96 | </imageView> | 114 | </imageView> |
| 97 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="6,513" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iCl-1r-Bwp"> | 115 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="6,513" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iCl-1r-Bwp"> |
| 98 | <rect key="frame" x="0.0" y="35" width="136" height="54"/> | 116 | <rect key="frame" x="0.0" y="35" width="136" height="54"/> |
| 99 | <constraints> | 117 | <constraints> |
| 100 | <constraint firstAttribute="height" constant="54" id="OWK-YU-E5c"/> | 118 | <constraint firstAttribute="height" constant="54" id="OWK-YU-E5c"/> |
| 101 | </constraints> | 119 | </constraints> |
| 102 | <fontDescription key="fontDescription" type="boldSystem" pointSize="45"/> | 120 | <fontDescription key="fontDescription" type="boldSystem" pointSize="45"/> |
| 103 | <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | 121 | <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> |
| 104 | <nil key="highlightedColor"/> | 122 | <nil key="highlightedColor"/> |
| 105 | </label> | 123 | </label> |
| 106 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="/ 10,000" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Fvu-lz-xIk"> | 124 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="/ 10,000" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Fvu-lz-xIk"> |
| 107 | <rect key="frame" x="0.0" y="97" width="136" height="24"/> | 125 | <rect key="frame" x="0.0" y="97" width="136" height="24"/> |
| 108 | <constraints> | 126 | <constraints> |
| 109 | <constraint firstAttribute="height" constant="24" id="ID6-U3-pcq"/> | 127 | <constraint firstAttribute="height" constant="24" id="ID6-U3-pcq"/> |
| 110 | </constraints> | 128 | </constraints> |
| 111 | <fontDescription key="fontDescription" type="system" pointSize="20"/> | 129 | <fontDescription key="fontDescription" type="system" pointSize="20"/> |
| 112 | <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | 130 | <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> |
| 113 | <nil key="highlightedColor"/> | 131 | <nil key="highlightedColor"/> |
| 114 | </label> | 132 | </label> |
| 115 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="目模まであと3487歩です" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dEz-7j-nXc"> | 133 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="目模まであと3487歩です" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dEz-7j-nXc"> |
| 116 | <rect key="frame" x="0.0" y="129" width="136" height="48"/> | 134 | <rect key="frame" x="0.0" y="129" width="136" height="48"/> |
| 117 | <constraints> | 135 | <constraints> |
| 118 | <constraint firstAttribute="height" constant="48" id="IhK-uP-msA"/> | 136 | <constraint firstAttribute="height" constant="48" id="IhK-uP-msA"/> |
| 119 | </constraints> | 137 | </constraints> |
| 120 | <fontDescription key="fontDescription" type="system" pointSize="20"/> | 138 | <fontDescription key="fontDescription" type="system" pointSize="20"/> |
| 121 | <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | 139 | <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> |
| 122 | <nil key="highlightedColor"/> | 140 | <nil key="highlightedColor"/> |
| 123 | </label> | 141 | </label> |
| 124 | </subviews> | 142 | </subviews> |
| 125 | <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> | 143 | <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> |
| 126 | <constraints> | 144 | <constraints> |
| 127 | <constraint firstItem="VwM-9C-Dye" firstAttribute="top" secondItem="qQS-5K-MuA" secondAttribute="top" constant="2" id="3wt-gj-JSb"/> | 145 | <constraint firstItem="VwM-9C-Dye" firstAttribute="top" secondItem="qQS-5K-MuA" secondAttribute="top" constant="2" id="3wt-gj-JSb"/> |
| 128 | <constraint firstItem="dEz-7j-nXc" firstAttribute="top" secondItem="Fvu-lz-xIk" secondAttribute="bottom" constant="8" id="8HX-cn-RI5"/> | 146 | <constraint firstItem="dEz-7j-nXc" firstAttribute="top" secondItem="Fvu-lz-xIk" secondAttribute="bottom" constant="8" id="8HX-cn-RI5"/> |
| 129 | <constraint firstItem="iCl-1r-Bwp" firstAttribute="top" secondItem="VwM-9C-Dye" secondAttribute="bottom" constant="8" id="8th-yr-ele"/> | 147 | <constraint firstItem="iCl-1r-Bwp" firstAttribute="top" secondItem="VwM-9C-Dye" secondAttribute="bottom" constant="8" id="8th-yr-ele"/> |
| 130 | <constraint firstItem="Fvu-lz-xIk" firstAttribute="leading" secondItem="qQS-5K-MuA" secondAttribute="leading" id="A6X-AZ-Tlm"/> | 148 | <constraint firstItem="Fvu-lz-xIk" firstAttribute="leading" secondItem="qQS-5K-MuA" secondAttribute="leading" id="A6X-AZ-Tlm"/> |
| 131 | <constraint firstAttribute="trailing" secondItem="iCl-1r-Bwp" secondAttribute="trailing" id="ALp-VX-Oqk"/> | 149 | <constraint firstAttribute="trailing" secondItem="iCl-1r-Bwp" secondAttribute="trailing" id="ALp-VX-Oqk"/> |
| 132 | <constraint firstAttribute="trailing" secondItem="Fvu-lz-xIk" secondAttribute="trailing" id="ELm-PN-7hB"/> | 150 | <constraint firstAttribute="trailing" secondItem="Fvu-lz-xIk" secondAttribute="trailing" id="ELm-PN-7hB"/> |
| 133 | <constraint firstItem="VwM-9C-Dye" firstAttribute="centerX" secondItem="qQS-5K-MuA" secondAttribute="centerX" id="Erd-eu-Lgw"/> | 151 | <constraint firstItem="VwM-9C-Dye" firstAttribute="centerX" secondItem="qQS-5K-MuA" secondAttribute="centerX" id="Erd-eu-Lgw"/> |
| 134 | <constraint firstItem="dEz-7j-nXc" firstAttribute="leading" secondItem="qQS-5K-MuA" secondAttribute="leading" id="nvf-Kg-Ivk"/> | 152 | <constraint firstItem="dEz-7j-nXc" firstAttribute="leading" secondItem="qQS-5K-MuA" secondAttribute="leading" id="nvf-Kg-Ivk"/> |
| 135 | <constraint firstItem="Fvu-lz-xIk" firstAttribute="top" secondItem="iCl-1r-Bwp" secondAttribute="bottom" constant="8" id="rFD-e5-Oke"/> | 153 | <constraint firstItem="Fvu-lz-xIk" firstAttribute="top" secondItem="iCl-1r-Bwp" secondAttribute="bottom" constant="8" id="rFD-e5-Oke"/> |
| 136 | <constraint firstItem="iCl-1r-Bwp" firstAttribute="leading" secondItem="qQS-5K-MuA" secondAttribute="leading" id="ykV-Hh-2Se"/> | 154 | <constraint firstItem="iCl-1r-Bwp" firstAttribute="leading" secondItem="qQS-5K-MuA" secondAttribute="leading" id="ykV-Hh-2Se"/> |
| 137 | <constraint firstAttribute="trailing" secondItem="dEz-7j-nXc" secondAttribute="trailing" id="zdo-Fa-Bk6"/> | 155 | <constraint firstAttribute="trailing" secondItem="dEz-7j-nXc" secondAttribute="trailing" id="zdo-Fa-Bk6"/> |
| 138 | </constraints> | 156 | </constraints> |
| 139 | </view> | 157 | </view> |
| 140 | </subviews> | 158 | </subviews> |
| 141 | <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> | 159 | <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> |
| 142 | <constraints> | 160 | <constraints> |
| 143 | <constraint firstItem="qQS-5K-MuA" firstAttribute="height" secondItem="oRx-7J-bma" secondAttribute="height" multiplier="200/299" id="KK9-9I-hBs"/> | 161 | <constraint firstItem="qQS-5K-MuA" firstAttribute="height" secondItem="oRx-7J-bma" secondAttribute="height" multiplier="200/299" id="KK9-9I-hBs"/> |
| 144 | <constraint firstItem="qQS-5K-MuA" firstAttribute="centerX" secondItem="oRx-7J-bma" secondAttribute="centerX" id="iHf-Qo-LsK"/> | 162 | <constraint firstItem="qQS-5K-MuA" firstAttribute="centerX" secondItem="oRx-7J-bma" secondAttribute="centerX" id="iHf-Qo-LsK"/> |
| 145 | <constraint firstItem="qQS-5K-MuA" firstAttribute="width" secondItem="oRx-7J-bma" secondAttribute="width" multiplier="160/299" id="nAQ-00-V9H"/> | 163 | <constraint firstItem="qQS-5K-MuA" firstAttribute="width" secondItem="oRx-7J-bma" secondAttribute="width" multiplier="160/299" id="nAQ-00-V9H"/> |
| 146 | <constraint firstItem="qQS-5K-MuA" firstAttribute="centerY" secondItem="oRx-7J-bma" secondAttribute="centerY" id="oCW-BR-PvV"/> | 164 | <constraint firstItem="qQS-5K-MuA" firstAttribute="centerY" secondItem="oRx-7J-bma" secondAttribute="centerY" id="oCW-BR-PvV"/> |
| 147 | <constraint firstAttribute="width" secondItem="oRx-7J-bma" secondAttribute="height" multiplier="1:1" id="of6-Gd-VOP"/> | 165 | <constraint firstAttribute="width" secondItem="oRx-7J-bma" secondAttribute="height" multiplier="1:1" id="of6-Gd-VOP"/> |
| 148 | </constraints> | 166 | </constraints> |
| 149 | <userDefinedRuntimeAttributes> | 167 | <userDefinedRuntimeAttributes> |
| 150 | <userDefinedRuntimeAttribute type="color" keyPath="progressBarProgressColor"> | 168 | <userDefinedRuntimeAttribute type="color" keyPath="progressBarProgressColor"> |
| 151 | <color key="value" red="0.2196078431372549" green="0.74117647058823533" blue="0.90196078431372551" alpha="1" colorSpace="calibratedRGB"/> | 169 | <color key="value" red="0.2196078431372549" green="0.74117647058823533" blue="0.90196078431372551" alpha="1" colorSpace="calibratedRGB"/> |
| 152 | </userDefinedRuntimeAttribute> | 170 | </userDefinedRuntimeAttribute> |
| 153 | <userDefinedRuntimeAttribute type="color" keyPath="progressBarTrackColor"> | 171 | <userDefinedRuntimeAttribute type="color" keyPath="progressBarTrackColor"> |
| 154 | <color key="value" red="0.21176470588235294" green="0.21176470588235294" blue="0.21176470588235294" alpha="1" colorSpace="calibratedRGB"/> | 172 | <color key="value" red="0.21176470588235294" green="0.21176470588235294" blue="0.21176470588235294" alpha="1" colorSpace="calibratedRGB"/> |
| 155 | </userDefinedRuntimeAttribute> | 173 | </userDefinedRuntimeAttribute> |
| 156 | <userDefinedRuntimeAttribute type="number" keyPath="progressBarWidth"> | 174 | <userDefinedRuntimeAttribute type="number" keyPath="progressBarWidth"> |
| 157 | <real key="value" value="12"/> | 175 | <real key="value" value="12"/> |
| 158 | </userDefinedRuntimeAttribute> | 176 | </userDefinedRuntimeAttribute> |
| 159 | <userDefinedRuntimeAttribute type="number" keyPath="startAngle"> | 177 | <userDefinedRuntimeAttribute type="number" keyPath="startAngle"> |
| 160 | <real key="value" value="-90"/> | 178 | <real key="value" value="-90"/> |
| 161 | </userDefinedRuntimeAttribute> | 179 | </userDefinedRuntimeAttribute> |
| 162 | <userDefinedRuntimeAttribute type="number" keyPath="progress"> | 180 | <userDefinedRuntimeAttribute type="number" keyPath="progress"> |
| 163 | <real key="value" value="0.40999999999999998"/> | 181 | <real key="value" value="0.40999999999999998"/> |
| 164 | </userDefinedRuntimeAttribute> | 182 | </userDefinedRuntimeAttribute> |
| 165 | </userDefinedRuntimeAttributes> | 183 | </userDefinedRuntimeAttributes> |
| 166 | </view> | 184 | </view> |
| 167 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="目標10,000歩" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dQq-cp-R2A" userLabel="Label1"> | 185 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="目標10,000歩" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dQq-cp-R2A" userLabel="Label1"> |
| 168 | <rect key="frame" x="315" y="155.5" width="60" height="33.5"/> | 186 | <rect key="frame" x="315" y="155.5" width="60" height="33.5"/> |
| 169 | <constraints> | 187 | <constraints> |
| 170 | <constraint firstAttribute="height" constant="33.5" id="pNJ-9e-Qhb"/> | 188 | <constraint firstAttribute="height" constant="33.5" id="pNJ-9e-Qhb"/> |
| 171 | </constraints> | 189 | </constraints> |
| 172 | <fontDescription key="fontDescription" type="system" pointSize="14"/> | 190 | <fontDescription key="fontDescription" type="system" pointSize="14"/> |
| 173 | <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | 191 | <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> |
| 174 | <nil key="highlightedColor"/> | 192 | <nil key="highlightedColor"/> |
| 175 | </label> | 193 | </label> |
| 176 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="残歩数3487歩" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="V2B-wZ-Efk" userLabel="Label2"> | 194 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="残歩数3487歩" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="V2B-wZ-Efk" userLabel="Label2"> |
| 177 | <rect key="frame" x="315" y="197" width="60" height="50"/> | 195 | <rect key="frame" x="315" y="197" width="60" height="50"/> |
| 178 | <constraints> | 196 | <constraints> |
| 179 | <constraint firstAttribute="height" constant="50" id="9oI-Ia-C0h"/> | 197 | <constraint firstAttribute="height" constant="50" id="9oI-Ia-C0h"/> |
| 180 | </constraints> | 198 | </constraints> |
| 181 | <fontDescription key="fontDescription" type="system" pointSize="14"/> | 199 | <fontDescription key="fontDescription" type="system" pointSize="14"/> |
| 182 | <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | 200 | <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> |
| 183 | <nil key="highlightedColor"/> | 201 | <nil key="highlightedColor"/> |
| 184 | </label> | 202 | </label> |
| 185 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="達成率78%" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="11m-je-qZ1" userLabel="Label3"> | 203 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="達成率78%" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="11m-je-qZ1" userLabel="Label3"> |
| 186 | <rect key="frame" x="315" y="255" width="60" height="33.5"/> | 204 | <rect key="frame" x="315" y="255" width="60" height="33.5"/> |
| 187 | <constraints> | 205 | <constraints> |
| 188 | <constraint firstAttribute="height" constant="33.5" id="ale-7X-6Gx"/> | 206 | <constraint firstAttribute="height" constant="33.5" id="ale-7X-6Gx"/> |
| 189 | </constraints> | 207 | </constraints> |
| 190 | <fontDescription key="fontDescription" type="system" pointSize="14"/> | 208 | <fontDescription key="fontDescription" type="system" pointSize="14"/> |
| 191 | <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | 209 | <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> |
| 192 | <nil key="highlightedColor"/> | 210 | <nil key="highlightedColor"/> |
| 193 | </label> | 211 | </label> |
| 194 | </subviews> | 212 | </subviews> |
| 195 | <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> | 213 | <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> |
| 196 | <constraints> | 214 | <constraints> |
| 197 | <constraint firstAttribute="trailing" secondItem="11m-je-qZ1" secondAttribute="trailing" id="5wQ-9t-fkx"/> | 215 | <constraint firstAttribute="trailing" secondItem="11m-je-qZ1" secondAttribute="trailing" id="5wQ-9t-fkx"/> |
| 216 | <constraint firstItem="1ak-Ne-wz9" firstAttribute="top" secondItem="PW6-AR-UCs" secondAttribute="top" id="7Lu-Sw-8Vd"/> | ||
| 198 | <constraint firstItem="V2B-wZ-Efk" firstAttribute="centerY" secondItem="oRx-7J-bma" secondAttribute="centerY" id="Bhj-5W-tqM"/> | 217 | <constraint firstItem="V2B-wZ-Efk" firstAttribute="centerY" secondItem="oRx-7J-bma" secondAttribute="centerY" id="Bhj-5W-tqM"/> |
| 199 | <constraint firstItem="yOP-KX-J14" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="5" id="Bp4-Am-rzQ"/> | 218 | <constraint firstItem="yOP-KX-J14" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="5" id="Bp4-Am-rzQ"/> |
| 200 | <constraint firstItem="Jtx-be-zjg" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="8" id="C4T-QJ-aV0"/> | 219 | <constraint firstItem="Jtx-be-zjg" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="8" id="C4T-QJ-aV0"/> |
| 201 | <constraint firstItem="dQq-cp-R2A" firstAttribute="leading" secondItem="oRx-7J-bma" secondAttribute="trailing" id="CSy-Of-ifG"/> | 220 | <constraint firstItem="dQq-cp-R2A" firstAttribute="leading" secondItem="oRx-7J-bma" secondAttribute="trailing" id="CSy-Of-ifG"/> |
| 202 | <constraint firstAttribute="trailing" secondItem="dQq-cp-R2A" secondAttribute="trailing" id="Ct9-ZA-fqo"/> | 221 | <constraint firstAttribute="trailing" secondItem="dQq-cp-R2A" secondAttribute="trailing" id="Ct9-ZA-fqo"/> |
| 222 | <constraint firstItem="HLr-Qj-bm4" firstAttribute="bottom" secondItem="Jtx-be-zjg" secondAttribute="bottom" id="DGk-ic-g00"/> | ||
| 203 | <constraint firstItem="oRx-7J-bma" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="60" id="DKw-80-JuB"/> | 223 | <constraint firstItem="oRx-7J-bma" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="60" id="DKw-80-JuB"/> |
| 204 | <constraint firstItem="11m-je-qZ1" firstAttribute="leading" secondItem="oRx-7J-bma" secondAttribute="trailing" id="FOq-gH-CTf"/> | 224 | <constraint firstItem="11m-je-qZ1" firstAttribute="leading" secondItem="oRx-7J-bma" secondAttribute="trailing" id="FOq-gH-CTf"/> |
| 225 | <constraint firstItem="HLr-Qj-bm4" firstAttribute="leading" secondItem="Jtx-be-zjg" secondAttribute="leading" id="FhM-mA-AWq"/> | ||
| 205 | <constraint firstItem="RSj-iV-Oaf" firstAttribute="centerY" secondItem="2SZ-sd-ADD" secondAttribute="centerY" id="JTA-NC-8qU"/> | 226 | <constraint firstItem="RSj-iV-Oaf" firstAttribute="centerY" secondItem="2SZ-sd-ADD" secondAttribute="centerY" id="JTA-NC-8qU"/> |
| 206 | <constraint firstItem="V2B-wZ-Efk" firstAttribute="top" secondItem="dQq-cp-R2A" secondAttribute="bottom" constant="8" id="KF9-QN-1Vc"/> | 227 | <constraint firstItem="V2B-wZ-Efk" firstAttribute="top" secondItem="dQq-cp-R2A" secondAttribute="bottom" constant="8" id="KF9-QN-1Vc"/> |
| 207 | <constraint firstItem="wHy-xz-GJV" firstAttribute="top" secondItem="Jtx-be-zjg" secondAttribute="bottom" constant="8" id="LFj-zM-kIs"/> | 228 | <constraint firstItem="wHy-xz-GJV" firstAttribute="top" secondItem="Jtx-be-zjg" secondAttribute="bottom" constant="8" id="LFj-zM-kIs"/> |
| 208 | <constraint firstAttribute="trailing" secondItem="RSj-iV-Oaf" secondAttribute="trailing" constant="10" id="Ldg-q1-Jsy"/> | 229 | <constraint firstAttribute="trailing" secondItem="RSj-iV-Oaf" secondAttribute="trailing" constant="10" id="Ldg-q1-Jsy"/> |
| 209 | <constraint firstItem="V2B-wZ-Efk" firstAttribute="leading" secondItem="oRx-7J-bma" secondAttribute="trailing" id="Ls8-7Q-gjM"/> | 230 | <constraint firstItem="V2B-wZ-Efk" firstAttribute="leading" secondItem="oRx-7J-bma" secondAttribute="trailing" id="Ls8-7Q-gjM"/> |
| 210 | <constraint firstItem="Jtx-be-zjg" firstAttribute="top" secondItem="PW6-AR-UCs" secondAttribute="bottom" constant="8" id="MMi-Mg-qDV"/> | 231 | <constraint firstItem="Jtx-be-zjg" firstAttribute="top" secondItem="PW6-AR-UCs" secondAttribute="bottom" constant="8" id="MMi-Mg-qDV"/> |
| 232 | <constraint firstItem="1ak-Ne-wz9" firstAttribute="leading" secondItem="PW6-AR-UCs" secondAttribute="leading" id="NK3-Gl-NZu"/> | ||
| 211 | <constraint firstAttribute="trailing" secondItem="2SZ-sd-ADD" secondAttribute="trailing" id="O9f-yA-cZ5"/> | 233 | <constraint firstAttribute="trailing" secondItem="2SZ-sd-ADD" secondAttribute="trailing" id="O9f-yA-cZ5"/> |
| 234 | <constraint firstItem="equ-yC-hU1" firstAttribute="leading" secondItem="wHy-xz-GJV" secondAttribute="leading" id="Oe7-aI-2zb"/> | ||
| 212 | <constraint firstItem="Jtx-be-zjg" firstAttribute="centerY" secondItem="oRx-7J-bma" secondAttribute="centerY" id="U3o-rO-Gcb"/> | 235 | <constraint firstItem="Jtx-be-zjg" firstAttribute="centerY" secondItem="oRx-7J-bma" secondAttribute="centerY" id="U3o-rO-Gcb"/> |
| 213 | <constraint firstItem="oRx-7J-bma" firstAttribute="top" secondItem="2SZ-sd-ADD" secondAttribute="bottom" constant="50" id="WGj-Jf-jSz"/> | 236 | <constraint firstItem="oRx-7J-bma" firstAttribute="top" secondItem="2SZ-sd-ADD" secondAttribute="bottom" constant="50" id="WGj-Jf-jSz"/> |
| 237 | <constraint firstItem="equ-yC-hU1" firstAttribute="bottom" secondItem="wHy-xz-GJV" secondAttribute="bottom" id="ad4-KH-cYo"/> | ||
| 238 | <constraint firstItem="equ-yC-hU1" firstAttribute="top" secondItem="wHy-xz-GJV" secondAttribute="top" id="adt-MK-oHP"/> | ||
| 214 | <constraint firstItem="PW6-AR-UCs" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="8" id="bsc-pa-ApI"/> | 239 | <constraint firstItem="PW6-AR-UCs" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="8" id="bsc-pa-ApI"/> |
| 240 | <constraint firstItem="HLr-Qj-bm4" firstAttribute="trailing" secondItem="Jtx-be-zjg" secondAttribute="trailing" id="h5E-wF-FZV"/> | ||
| 241 | <constraint firstItem="1ak-Ne-wz9" firstAttribute="trailing" secondItem="PW6-AR-UCs" secondAttribute="trailing" id="jXm-mH-e3x"/> | ||
| 215 | <constraint firstAttribute="trailing" secondItem="V2B-wZ-Efk" secondAttribute="trailing" id="kQV-FL-4Zq"/> | 242 | <constraint firstAttribute="trailing" secondItem="V2B-wZ-Efk" secondAttribute="trailing" id="kQV-FL-4Zq"/> |
| 243 | <constraint firstItem="HLr-Qj-bm4" firstAttribute="top" secondItem="Jtx-be-zjg" secondAttribute="top" id="lE9-vw-sw6"/> | ||
| 216 | <constraint firstItem="2SZ-sd-ADD" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="q0L-8m-E0D"/> | 244 | <constraint firstItem="2SZ-sd-ADD" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="q0L-8m-E0D"/> |
| 245 | <constraint firstItem="equ-yC-hU1" firstAttribute="trailing" secondItem="wHy-xz-GJV" secondAttribute="trailing" id="vDi-q7-eov"/> | ||
| 246 | <constraint firstItem="1ak-Ne-wz9" firstAttribute="bottom" secondItem="PW6-AR-UCs" secondAttribute="bottom" id="vlQ-WK-pY4"/> | ||
| 217 | <constraint firstItem="11m-je-qZ1" firstAttribute="top" secondItem="V2B-wZ-Efk" secondAttribute="bottom" constant="8" id="vrX-sS-hWJ"/> | 247 | <constraint firstItem="11m-je-qZ1" firstAttribute="top" secondItem="V2B-wZ-Efk" secondAttribute="bottom" constant="8" id="vrX-sS-hWJ"/> |
| 218 | <constraint firstItem="2SZ-sd-ADD" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" placeholder="YES" id="w1M-Il-jBT"/> | 248 | <constraint firstItem="2SZ-sd-ADD" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" placeholder="YES" id="w1M-Il-jBT"/> |
| 219 | <constraint firstAttribute="trailing" secondItem="oRx-7J-bma" secondAttribute="trailing" constant="60" id="y6f-vv-nWJ"/> | 249 | <constraint firstAttribute="trailing" secondItem="oRx-7J-bma" secondAttribute="trailing" constant="60" id="y6f-vv-nWJ"/> |
| 220 | <constraint firstItem="wHy-xz-GJV" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="8" id="yEj-yT-PGx"/> | 250 | <constraint firstItem="wHy-xz-GJV" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="8" id="yEj-yT-PGx"/> |
| 221 | <constraint firstItem="yOP-KX-J14" firstAttribute="centerY" secondItem="2SZ-sd-ADD" secondAttribute="centerY" id="ym9-6w-9C5"/> | 251 | <constraint firstItem="yOP-KX-J14" firstAttribute="centerY" secondItem="2SZ-sd-ADD" secondAttribute="centerY" id="ym9-6w-9C5"/> |
| 222 | </constraints> | 252 | </constraints> |
| 223 | <point key="canvasLocation" x="33.5" y="54.5"/> | 253 | <point key="canvasLocation" x="33.5" y="54.5"/> |
| 224 | </view> | 254 | </view> |
| 225 | </objects> | 255 | </objects> |
| 226 | <resources> | 256 | <resources> |
| 227 | <image name="icon_facebook" width="40" height="40"/> | 257 | <image name="icon_facebook" width="40" height="40"/> |
| 228 | <image name="icon_line" width="40" height="40"/> | 258 | <image name="icon_line" width="40" height="40"/> |
| 229 | <image name="icon_menu" width="30" height="30"/> | 259 | <image name="icon_menu" width="30" height="30"/> |
| 230 | <image name="icon_share" width="42" height="57"/> | 260 | <image name="icon_share" width="42" height="57"/> |
| 231 | <image name="icon_walking" width="14" height="25"/> | 261 | <image name="icon_walking" width="14" height="25"/> |
| 232 | <image name="today_back_button" width="73" height="37"/> | 262 | <image name="today_back_button" width="73" height="37"/> |
| 233 | </resources> | 263 | </resources> |
| 234 | </document> | 264 | </document> |
| 235 | 265 |