2015-09-13 2 views
2

Я новичок в разработке iOS, но мне нужно реализовать 3d touch на UIButton, когда пользователь наложил силу на контекстное меню кнопки, даже если кто-то может просто предоставить мне пример кода в ObjectiveC для 3d touch, будет оценен , Заранее спасибо.Возможно ли реализовать 3d touch на UIButton?

+1

Принимали ли вы посмотрите на код, при условии яблоком в своем списке изменений в iOS 9.1? https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9_1.html#//apple_ref/doc/uid/TP40016572-SW1 – luk2302

+0

Да, я изучил его, но проблема все образцы кода находятся в быстрой последовательности, и я попытался найти их в Objective C, но он не работает в соответствии с моей потребностью во-вторых, симулятор также не поддерживает 3d touch сейчас, поэтому мне нужен совершенный код, чтобы сэкономить некоторое время, если вы могли бы просто предоставить мне структуру использования 3d touch в Objective, что было бы большой помощью. –

+0

@HarryNg Я в том же положении, что и Абдул. Да, у вас могут быть приложения, которые запускают как Obj-C, так и Swift, но в коде AppDelegate должен быть реализован много кода для 3D Touch, поэтому вы либо конвертируете каждую строку кода в этот файл, либо создаете способ ввода 3D Touch с использованием Obj-C. Он прав, что все образцы кода Swift ... ваш комментарий воняет. – user717452

ответ

8

Да, у меня есть демонстрация того, как обнаружить 3d touch на UIButton в примере приложения на github ниже. Для части всплывающих окон меню я оставлю это для вас, но это даст вам силу/3d touch.

https://github.com/foggzilla/DFContinuousForceTouchGestureRecognizer

Как я делаю это, чтобы использовать DFContinuousForceTouchGestureRecognizer, что я сделал доступной в проекте образца.

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

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

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

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

    [self.button addGestureRecognizer:_forceTouchRecognizer]; 
} 

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

#pragma DFContinuousForceTouchDelegate 

- (void)forceTouchRecognized:(DFContinuousForceTouchGestureRecognizer *)recognizer { 
    self.button.transform = CGAffineTransformIdentity; 
    [self.button setNeedsDisplay]; 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [[[UIAlertView alloc] initWithTitle:@"Force Touch Button" 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.button.transform = CGAffineTransformMakeScale(transformDelta, transformDelta); 
    [self.button setNeedsDisplay]; 
} 

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

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

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

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

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

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

Если добавить это на iOS8 это приведет к краху, так условно добавить распознаватель на основе того, что IOS версии вы работаете, если вы поддерживаете версии старше прошивкой 9.

+0

есть ли что-нибудь из этого в swift? – theAlse

+0

Библиотека находится в Objective C, но я не понимаю, почему она не должна работать через мосты. – shim

5

Вы можете перегрузить UIButton и изучить force имущества на UITouch эсов в

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event;

- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event;

Основываясь на том, что происходит здесь, вы можете отправить свое собственное действие для силы прикосновений, с :

- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents;

+0

Зачем кому-то делать это? – Fattie

Смежные вопросы