Skip to content

Instantly share code, notes, and snippets.

@boundsj
boundsj / ViewController.swift
Last active May 7, 2020 04:53 — forked from hhartz/ViewController.swift
Mapbox offline pack resume bug
// Source code for mapbox offline pack resume bug
//
// Adapted from https://www.mapbox.com/ios-sdk/examples/offline-pack/.
// To download, use the shake gesture (ctrl-cmd-Z), and kill the app. When the app is resumed
// it will find a partial pack and resume it. Notice how the network and disk activity shows
// that a download is indeed ocurring, while there are no notifications posted on progress.
import UIKit
import Mapbox
@boundsj
boundsj / ios_heatmap_example.md
Created February 22, 2017 15:24
iOS Heatmap Example using runtime styling and clustering
    
    // Ported from https://www.mapbox.com/mapbox-gl-js/example/heatmap/
  
    func mapViewDidFinishLoadingMap(_ mapView: MGLMapView) {
        let source = MGLSource(identifier: "source")

        let symbolLayer = MGLSymbolStyleLayer(identifier: "place-city-sm", source: source)
        let url = URL(string: "https://www.mapbox.com/mapbox-gl-js/assets/earthquakes.geojson")!
        let options = [MGLShapeSourceOption.clustered: NSNumber(booleanLiteral: true),
@boundsj
boundsj / glbufferdata_crash.md
Created September 27, 2016 19:54
glBufferData crash
libc++abi.dylib: terminating with uncaught exception of type mbgl::gl::Error: glBufferData(target, pos, array, GL_STATIC_DRAW): Error GL_INVALID_OPERATION at /Users/boundsj/workspace/mbgl/src/mbgl/geometry/buffer.hpp:59
(lldb) bt
* thread #1: tid = 0x2a3a90, 0x000000010a1eddda libsystem_kernel.dylib`__pthread_kill + 10, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
    frame #0: 0x000000010a1eddda libsystem_kernel.dylib`__pthread_kill + 10
    frame #1: 0x000000010a225797 libsystem_pthread.dylib`pthread_kill + 90
    frame #2: 0x0000000109f67ff7 libsystem_c.dylib`abort + 129
    frame #3: 0x0000000109d3395a libc++abi.dylib`abort_message + 266
    frame #4: 0x0000000109d58ce7 libc++abi.dylib`default_terminate_handler() + 243
    frame #5: 0x000000010647f4b4 libobjc.A.dylib`_objc_terminate() + 124
@boundsj
boundsj / example_swift_geojson_clustering_filters.md
Created September 26, 2016 22:46
Swift GeoJSON + Clustering + Filters Example
    func mapViewDidFinishLoadingMap(_ mapView: MGLMapView) {
        let source = MGLSource(sourceIdentifier: "source")!
        
        let symbolLayer = MGLSymbolStyleLayer(layerIdentifier: "place-city-sm", source: source)
        let url = URL(string: "https://www.mapbox.com/mapbox-gl-js/assets/earthquakes.geojson")!
        let options = [MGLGeoJSONClusterOption: NSNumber(booleanLiteral: true),
                       MGLGeoJSONClusterRadiusOption: NSNumber(integerLiteral: 20),
                       MGLGeoJSONClusterMaximumZoomLevelOption: NSNumber(integerLiteral: 15)]
        let geoJSONSource = MGLGeoJSONSource(sourceIdentifier: "earthquakes", url: url, options: options)
@boundsj
boundsj / style_vector_layer.md
Created September 7, 2016 18:08
style_vector_layer
- (void)mapViewDidFinishLoadingMap:(MGLMapView *)mapView
{
    [self.mapView setStyleURL:[MGLStyle darkStyleURLWithVersion:9]];
    
    NSURL *url = [[NSURL alloc] initWithString:@"mapbox://mapbox.mapbox-terrain-v2"];
    MGLVectorSource *vectorSource = [[MGLVectorSource alloc] initWithSourceIdentifier:@"terrain-data" URL:url];
    [self.mapView.style addSource:vectorSource];
    
    MGLBackgroundStyleLayer *backgroundLayer = [[MGLBackgroundStyleLayer alloc] initWithLayerIdentifier:@"background"];
@boundsj
boundsj / earthquake_clusters.md
Last active September 21, 2016 01:27
earthquake clusters
    NSURL *url = [NSURL URLWithString:@"https://www.mapbox.com/mapbox-gl-js/assets/earthquakes.geojson"];
    MGLSource *source = [[MGLSource alloc] initWithSourceIdentifier:@"source"];
    MGLSymbolStyleLayer *symbolLayer = [[MGLSymbolStyleLayer alloc] initWithLayerIdentifier:@"place-city-sm" source:source];
    
    NSDictionary *options = @{MGLGeoJSONClusterOption: @(YES),
                              MGLGeoJSONClusterRadiusOption: @10,
                              MGLGeoJSONClusterMaximumZoomLevelOption: @15};
    
    MGLGeoJSONSource *geoJSONSource = [[MGLGeoJSONSource alloc] initWithSourceIdentifier:@"earthquakes" URL:url options:options];
@boundsj
boundsj / force_touch_annotations.md
Last active August 4, 2016 16:14
Force touch annotations

Since an MGLAnnotationView is a UIView you can use familiar APIs to manipulate it. For example, on devices that support 3D touch, you can transform the view as a function of the touch force.

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    super.touchesMoved(touches, withEvent: event)

    if let touch = touches.first {
        let normalizedForce = touch.force / touch.maximumPossibleForce * 2.5
        self.transform = CGAffineTransformMakeScale(1 + normalizedForce, 1 + normalizedForce)
    }
### Keybase proof
I hereby claim:
* I am boundsj on github.
* I am boundsj (https://keybase.io/boundsj) on keybase.
* I have a public key whose fingerprint is 8C6A AF5D 5922 5BF4 45A2 1278 54F0 7E43 1D15 92FF
To claim this, I am signing this object:
@boundsj
boundsj / TapableTextView.m
Last active August 29, 2015 14:05
Tappable Attributed UITextView
// in a tap gesture recognizer handler in view controller
// assuming you have a text view in controller called "myTextView"
- (void)myTextViewTapped:(UITapGestureRecognizer *)recognizer {
// get tap location in view in question
CGPoint location = [recognizer locationInView:self.myTextView];
// adjust location for text view's offsets
location.x -= self.myTextView.textContainerInset.left;
location.y -= self.myTextView.textContainerInset.top;
@boundsj
boundsj / MyTextView.h
Created June 9, 2014 13:55
Subclass with Internal Delegate and Message Forwarding
#import <UIKit/UIKit.h>
@interface MyTextView : UITextView
@end