Как бы вы создали UISegmentedControl с распознавателем двойного касания на каждом сегменте?
Я попытался использовать InterfaceBuilder, чтобы мы перевели touchDownRepeat моего UISegmentedControl на IBAction в его родительском viewController, но IBAction никогда не запускается независимо от того, сколько раз подряд вы нажимаете на UISegmentedControl. Почему они показывают этот вывод из UISegmentedControl во всплывающем меню в InterfaceBuilder, если он ничего не делает? Как вы заставляете его делать то, что он должен делать? (Извините, если это нубский вопрос.)
Кроме того, может ли каждый сегмент UISegmentedControl напрямую ссылаться как объект? Как насчет его подклассов? Если нет, то почему нет, и что такое хороший обходной путь?
Я хочу, чтобы двойное касание сегмента запускало представление для редактирования режима, представленного этим сегментом. Благодарю.
3 ответа
На самом деле я наконец-то понял это решение. Подкласс UISegmentedControl. Внутри есть:
- (customUISegmentedControl *)init {
NSTimeInterval interval = 0.0;
_lastSameTouchTime = [NSDate dateWithTimeIntervalSince1970:interval];
return self;
}
+ (BOOL)isIOS7 {
static BOOL isIOS7 = NO;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSUInteger deviceSystemMajorVersion = [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] objectAtIndex:0] intValue];
if (deviceSystemMajorVersion >= 7) {
isIOS7 = YES;
}
else {
isIOS7 = NO;
}
});
return isIOS7;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSInteger previousSelectedSegmentIndex = self.selectedSegmentIndex;
[super touchesBegan:touches withEvent:event];
if (![[self class] isIOS7]) {
// before iOS7 the segment is selected in touchesBegan
if (previousSelectedSegmentIndex == self.selectedSegmentIndex) {
// if the selectedSegmentIndex before the selection process is equal to the selectedSegmentIndex
// after the selection process the superclass won't send a UIControlEventValueChanged event.
// So we have to do this in here.
NSTimeInterval diff = [[NSDate date] timeIntervalSinceDate:_lastSameTouchTime];
_lastSameTouchTime = [NSDate date];
if(diff <= 1.0)
NSLog(@"doubletapped!");
diff = [[NSDate date] timeIntervalSinceDate:_changedTime];
if(diff <= 1.0)
NSLog(@"doubletapped!");
}
else {
_changedTime = [NSDate date];
}
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
NSInteger previousSelectedSegmentIndex = self.selectedSegmentIndex;
[super touchesEnded:touches withEvent:event];
if ([[self class] isIOS7]) {
// on iOS7 the segment is selected in touchesEnded
if (previousSelectedSegmentIndex == self.selectedSegmentIndex) {
NSTimeInterval diff = [[NSDate date] timeIntervalSinceDate:_lastSameTouchTime];
_lastSameTouchTime = [NSDate date];
if(diff <= 1.0)
NSLog(@"doubletapped!");
diff = [[NSDate date] timeIntervalSinceDate:_changedTime];
if(diff <= 1.0)
NSLog(@"doubletapped!");
}
else {
_changedTime = [NSDate date];
}
}
}
В основном теперь заменить код NSLog(@"doubletapped!")
с кодом, который делает все, что должно произойти, когда произошла двойная запись:D И, конечно, объявите соответствующие свойства NSDate для _changedTime и _lastSameTouchTime.
Почему ты не добавляешь UIButtons
поверх сегментированных элементов управления? Вы можете обнаружить двойное нажатие на них с UIControlEventTouchDownRepeat
и затем вручную выберите сегментированный элемент управления с этим:
- (void)setEnabled:(BOOL)enabled forSegmentAtIndex:(NSUInteger)segment
-(void)initTouchesRecognizer{
DLog(@"");
recognizer = [[UIGestureRecognizer alloc] init];
[self addGestureRecognizer:recognizer];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
DLog(@"");
NSSet *allTouches = [event allTouches];
for (UITouch *touch in allTouches) {
}
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
CGPoint location = [touch locationInView:touch.view];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
DLog(@"");
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[self touchesEnded:touches withEvent:event];
}
Это код для распознавания жестов. Распознаватели жестов предназначены для UIViews, так что на самом деле вы можете иметь только один тип распознавателя жестов на просмотр. Вы можете использовать одно касание, двойное касание, тройное касание, пролистывание и т. Д. Для разных вещей на одной странице, но получить два одинаковых типа для выполнения двух разных задач - подвиг, потому что они не предназначены для такой работы. Вы должны использовать кнопки, как и в предыдущем ответе. Я пытался сделать то же самое и закончил тем, что использовал кнопки вместо этого, что оказалось намного удобнее. Даже если бы вы могли заставить распознаватель жестов работать так, как вы хотели, это очень сложно и утомительно. Код для UIButton НАМНОГО короче.
РЕДАКТИРОВАТЬ Распознаватель жестов обычно используется для таких вещей, как исчезновение клавиатуры при касании UIView; такие вещи. Он не должен использоваться в качестве набора пользовательских кнопок на странице.
РЕДАКТИРОВАТЬ #2, вот как вы можете распознать жест, чтобы он вызывал соответствующие функции:
-(void)viewDidLoad {
[super viewDidLoad];
UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame=CGRectMake(0, 0, 100, 100);
[self.view addSubview:button];
UIGestureRecognizer *swipe=[[UIGestureRecognizer alloc]initWithTarget:button action:@selector(detectSwipe)];
[button addGestureRecognizer:swipe];
}
Вы должны инициализировать это и сказать ему, куда идти.