2015-09-14 2 views
3

У любого есть идея, как мы можем реализовать функцию 3d touch в objective C? Я уже проверяю документацию приложения, но ни один пример не связан с объектным кодом C.

Любой образец кода или пример, как его реализовать? Заранее спасибо.iOS 3D Touch в Objective C

+1

'UITouch' дает вам информацию о силе в через свойство 'force' (iOS9 +), и вы можете захватить текущее событие' UITouch' через любой класс 'UIResponser' (iOS2 +); остальное или то, как вы можете использовать это, ограничено только вашим воображением. – holex

+0

Если кому-то нужен ответ для Свифта, проверьте мой ответ здесь http://stackoverflow.com/a/32593044/4106559 – ooenomel2003

ответ

1

Вот пример адаптирован из примера yeungkaho на GitHub

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ 
    [self handleTouches:touches]; 
} 
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ 
    [self handleTouches:touches]; 
} 
-(void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ 
    [self setForcePercentage:0]; 
} 
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ 
    [self setForcePercentage:0]; 
} 
-(void)handleTouches:(NSSet<UITouch *> *)touches{ 

    for (UITouch *touch in touches) { 
     CGFloat force = touch.force; 
     CGFloat percentage = force/touch.maximumPossibleForce; 
     [self setForcePercentage:percentage]; 
     break; 
    } 
} 

-(void)setForcePercentage:(CGFloat)percentage{ 

    NSLog(@"LEVEL = %f",percentage*100); 
} 
3

Как я делаю это, чтобы использовать DFContinuousForceTouchGestureRecognizer что я сделал доступен. Это расширение распознавателя жестов, которое обнаруживает силовое прикосновение и работает вместе с другими распознавателями жестов.

DFContinuousForceTouchGestureRecognizer содержит постоянные обновления о изменениях давления, поэтому вы можете делать приятные вещи, например, увеличивать представление, поскольку пользователь меняет свое давление на него, а не просто вызывает одно событие. Если вам просто нужно одно событие, вы можете игнорировать eveything в DFContinuousForceTouchDelegate, за исключением обратного вызова - (void) forceTouchRecognized.

https://github.com/foggzilla/DFContinuousForceTouchGestureRecognizer

Вы можете скачать этот и запустить пример приложения на устройстве, которое поддерживает силы нажмите, чтобы увидеть, как это чувствует.

В вашем UIViewController реализация:

- (void) viewDidLoad { 
    [super viewDidLoad]; 
    _forceTouchRecognizer = [[DFContinuousForceTouchGestureRecognizer alloc] init]; 
    _forceTouchRecognizer.forceTouchDelegate = self; 

    [self.imageView addGestureRecognizer:_forceTouchRecognizer]; 
} 

реализует протокол делегата для силового контакта:

#pragma DFContinuousForceTouchDelegate 

- (void) forceTouchRecognized:(DFContinuousForceTouchGestureRecognizer*)recognizer { 
    self.imageView.transform = CGAffineTransformIdentity; 
    [self.imageView setNeedsDisplay]; 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [[[UIAlertView alloc] initWithTitle:@"Force Touch" message:@"YEAH!!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; 
    }); 
} 
- (void) forceTouchRecognizer:(DFContinuousForceTouchGestureRecognizer*)recognizer didStartWithForce:(CGFloat)force maxForce:(CGFloat)maxForce { 
    CGFloat transformDelta = 1.0f + ((force/maxForce)/3.0f); 
    self.imageView.transform = CGAffineTransformMakeScale(transformDelta, transformDelta); 
    [self.imageView setNeedsDisplay]; 
} 

- (void) forceTouchRecognizer:(DFContinuousForceTouchGestureRecognizer*)recognizer didMoveWithForce:(CGFloat)force maxForce:(CGFloat)maxForce { 
    CGFloat transformDelta = 1.0f + ((force/maxForce)/3.0f); 
    self.imageView.transform = CGAffineTransformMakeScale(transformDelta, transformDelta); 
    [self.imageView setNeedsDisplay]; 
} 

- (void) forceTouchRecognizer:(DFContinuousForceTouchGestureRecognizer*)recognizer didCancelWithForce:(CGFloat)force maxForce:(CGFloat)maxForce { 
    self.imageView.transform = CGAffineTransformIdentity; 
    [self.imageView setNeedsDisplay]; 
} 

- (void) forceTouchRecognizer:(DFContinuousForceTouchGestureRecognizer*)recognizer didEndWithForce:(CGFloat)force maxForce:(CGFloat)maxForce { 
    self.imageView.transform = CGAffineTransformIdentity; 
    [self.imageView setNeedsDisplay]; 
} 

- (void) forceTouchDidTimeout:(DFContinuousForceTouchGestureRecognizer*)recognizer { 
    self.imageView.transform = CGAffineTransformIdentity; 
    [self.imageView setNeedsDisplay]; 
} 

Обратите внимание, что это будет полезно только на устройстве, которое поддерживает силу прикосновения.

Кроме того, вы не должны добавить UIContinuousForceTouchGestureRecognizer к виду, если вы работаете на iOS8 или под, так как он использует новый force свойство на UITouch доступны только в iOS9.

Если вы добавите это на iOS8, это сработает, поэтому условно добавьте этот распознаватель на основе версии iOS, на которой вы работаете, если вы поддерживаете версии старше iOS9.

0

Я делюсь исходный код, нажав на значок приложения заселить 4 пункт в списке

Шаг 1: - Импорт класса в appDelegate.m

импорт SYS/utsname.ч

Шаг 2: -

#pragma MARK for Get Machine Name 

- (NSString *) machineName { 
    struct utsname systemInfo; 
    uname(&systemInfo); 
    return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    if([[self machineName] isEqualToString:@"iPhone8,2"]|| [[self machineName] isEqualToString:@"iPhone8,1"]) { 
     [self addEventsFor3DTouchEvents]; 
    } 
    return YES; 
} 

Прагма MARK для добавления действий для трех D сенсорных событий

- (void) addEventsFor3DTouchEvents { 
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) { 
     UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"dynamic1" localizedTitle:TITLE_NAME_1 localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:TITLE_IMAGE_NAME_1] userInfo:nil]; 

     UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"dynamic1" localizedTitle:TITLE_NAME_2 localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:TITLE_IMAGE_NAME_2] userInfo:nil]; 

     UIApplicationShortcutItem *item3 = [[UIApplicationShortcutItem alloc] initWithType:@"dynamic1" localizedTitle:TITLE_NAME_3 localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:TITLE_IMAGE_NAME_3] userInfo:nil]; 

     UIApplicationShortcutItem *item4 = [[UIApplicationShortcutItem alloc] initWithType:@"dynamic1" localizedTitle:TITLE_NAME_4 localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:TITLE_IMAGE_NAME_4] userInfo:nil]; 

     [[UIApplication sharedApplication] setShortcutItems: @[ item1, item2, item3, item4 ]]; 
    } 
} 


#pragma mark - 3DTouch Delegate Methods 

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler { 
    [self moveThrough3DTouch:shortcutItem]; 
} 

#pragma MARK for Handling Action for Three D Touch Events 

- (void)moveThrough3DTouch:(UIApplicationShortcutItem *)temp { 

    if ([temp.localizedTitle isEqualToString:TITLE_NAME_1]) { 

      [self.tabBarController setSelectedIndex:0]; 
    } else if([temp.localizedTitle isEqualToString:TITLE_NAME_2]) { 

      [self.tabBarController setSelectedIndex:1]; 
    } else if([temp.localizedTitle isEqualToString:TITLE_NAME_3]) { 

      [self.tabBarController setSelectedIndex:2]; 
    } else if([temp.localizedTitle isEqualToString:TITLE_NAME_4]) { 

      [self.tabBarController setSelectedIndex:3]; 
    } 
} 

** Я использую контроллер Tab Bar в мое приложение, если хотите двигаться в поле зрения

- (void) moveToControllerScene { 
     UIStoryboard *storyboard    = [UIStoryboard storyboardWithName:STORY_BOARD_IDENTIFIER bundle:nil]; 
     YOUR_CONTROLLER_OBJECT *obj   = [storyboard instantiateViewControllerWithIdentifier:@"YOUR_CONTROLLER_OBJECT"]; 
     [navController pushViewController:obj animated:YES]; 
} 
Смежные вопросы