Google Maps SDK for iOS

// 抓取螢幕四個角落座標
- (void)showVisibleRegion
{
  NSLog(@"\n%@,%@\n%@,%@\n%@,%@\n%@,%@\n",
        [NSNumber numberWithDouble:_mapView.projection.visibleRegion.farLeft.latitude],
        [NSNumber numberWithDouble:_mapView.projection.visibleRegion.farLeft.longitude],
        [NSNumber numberWithDouble:_mapView.projection.visibleRegion.farRight.latitude],
        [NSNumber numberWithDouble:_mapView.projection.visibleRegion.farRight.longitude],
        [NSNumber numberWithDouble:_mapView.projection.visibleRegion.nearLeft.latitude],
        [NSNumber numberWithDouble:_mapView.projection.visibleRegion.nearLeft.longitude],
        [NSNumber numberWithDouble:_mapView.projection.visibleRegion.nearRight.latitude],
        [NSNumber numberWithDouble:_mapView.projection.visibleRegion.nearRight.longitude]);
}

#pragma mark - delegate

- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture
{
    // ...
}

// This is invoked once the camera position on GMSMapView becomes idle, and specifies the camera positon in question.
// At this point, all animations and gestures have stopped.
- (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position
{
  if (_isNeedsRemoveMarkers) {
    [self removeMarks];
//  [self showVisibleRegion];
    [self prepareDataFromMemoryWithTimeId:_currentTimeId];
  }
  else {
    _isNeedsRemoveMarkers = YES;
  }
}

- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker
{
  _isNeedsRemoveMarkers = NO;
  [_mapView animateToLocation:marker.position];
  _mapView.selectedMarker = marker;
  return YES;
}

- (void)mapView:(GMSMapView *)mapView didTapInfoWindowOfMarker:(GMSMarker *)marker
{
  NSLog(@"clicked title:%@",marker.title); // And now this should work.
  _clickItem = marker.userData;
  [self performSegueWithIdentifier:@"SegueFromMapToStoreDetail" sender:nil];  
}

Checking Visible Region

- (void)prepareDataFromMemoryWithTimeId:(NSInteger)TimeId
{
  // filter data by the lat and lon
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Lat <= %f AND Lat >= %f AND Lng <= %f AND Lng >= %f", _mapView.projection.visibleRegion.farLeft.latitude, _mapView.projection.visibleRegion.nearRight.latitude, _mapView.projection.visibleRegion.farRight.longitude, _mapView.projection.visibleRegion.nearLeft.longitude];
  _sortedArrayDataSource = [_sortedArrayOriginDataSource filteredArrayUsingPredicate:predicate];
  
  [self generateMarkers];
}