2015-01-02 27 views
0

裏面,我實現了使用等觸摸事件,一個非常簡單的定製UISwitch:定製UISwitch一個UITableViewCell

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event 
- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event 
- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event 

我可以用我的看法這種控制沒有問題。控件模擬一個UISwitch,所以它可以通過拖動或點擊來改變數值。

我的問題是,我不能讓這個控制在UITableView的單元格內工作。只有一個水龍頭似乎工作(請注意,我沒有使用手勢......但我以前列出的事件),但我無法「滑動」開關手柄。

我實例化tableView:cellForRowAtIndexPath方法添加控件作爲細胞contentView的子視圖內的控制器:

[cell.contentView addSubview:customSwitch]; 

我想,這是一個事實,即UITableView的是一個UIScrollView相關的東西,我覺得倒是事件不知何故「被盜」了。

//編輯--------------------

這裏是與觸摸事件相關的代碼。

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    [super beginTrackingWithTouch:touch withEvent:event]; 

    self.dragged = NO; 

    return YES; 
} 

- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    if (!self.enabled) { 
     return NO; 
    } 

    [super continueTrackingWithTouch:touch withEvent:event]; 
    self.dragged = YES; 
    CGPoint touchPoint = [touch locationInView:self]; 

    float centerPoint = FIXED_WIDTH/2.0; 

    [self centerOn:(touchPoint.x > centerPoint) animated:YES completion:nil]; 

    return YES; 
} 

- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    [super endTrackingWithTouch:touch withEvent:event]; 

    CGPoint touchPoint = [touch locationInView:self]; 

    BOOL currentOn = self.on; 
    BOOL nextOn; 

    if (self.dragged) { 
     float centerPoint = FIXED_WIDTH/2.0; 
     nextOn = (touchPoint.x > centerPoint); 

     [self setOn:nextOn animated:NO]; 
    }else{ 
     nextOn = !self.on; 
     [self setOn:nextOn animated:YES]; 
    } 
    self.dragged = NO; 

    if (currentOn != nextOn) { 
     [self sendActionsForControlEvents:UIControlEventValueChanged]; 
    } 
} 

如何使細胞內的控制工作,而用的UIScrollView/UITableView的干擾?

+0

你有沒有考慮過使用輕拍和平移手勢? – Wain

+0

@我更喜歡使用Touch事件。在這種情況下它有什麼不同嗎? – MatterGoal

+0

看看像這樣的其他問題http://stackoverflow.com/questions/9350041/uicontrol-not-receiving-touches – Wain

回答

1

您需要使用手勢實現自定義開關,而不是嘗試直接處理事件。

手勢識別器在幕後工作以協調其事件處理,例如,爲什麼UIScrollView可以在另一個UIScrollView內工作。您需要協調UITableView(真正的UIScrollView)才能在其內容中正確處理滑動手勢。

在網頁中搜索Hardy Macia的UICustomSwitch示例代碼,以獲得在自定義控件中匹配UISwitch行爲的示例。

0

您錯過了touchesBegan:touchesMoved:

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    [super touchesBegan:touches withEvent:event]; 

    // Get the only touch (multipleTouchEnabled is NO) 
    UITouch* touch = [touches anyObject]; 

    // Track the touch 
    [self beginTrackingWithTouch:touch withEvent:event]; 
} 

- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    [super touchesMoved:touches withEvent:event]; 

    // Get the only touch (multipleTouchEnabled is NO) 
    UITouch* touch = [touches anyObject]; 

    // Track the touch 
    [self continueTrackingWithTouch:touch withEvent:event]; 
} 
+1

向Down-voter:小心解釋爲什麼down-vote? – instaable

+0

你確定需要這些功能嗎?我可以讓交換機在單元外沒有問題的情況下工作。 – MatterGoal

+0

也嘗試在'beginTrackingWithTouch'和'continueTrackingWithTouch'中實現'sendActionsForControlEvents:'。具體來說:'[self sendActionsForControlEvents:UIControlEventTouchDown];''和'[self sendActionsForControlEvents:UIControlEventTouchDragInside]'。 – instaable