使用滑动对象创建自定义UITableViewCell

时间:2015-05-31 18:22:16

标签: ios objective-c uitableview

我需要创建自己的自定义UITableViewCell。在每个单元格中,我希望有一个视图,它是一个开关。开关将在其上有一个标签,用户应该能够向右滑动以将开关向右移动并向左滑动以将开关向左移动。我画了一张非常简单的原型图片,你可以在这里看到:Pictures(基本上蓝色部分应该用滑动来左右移动)

enter image description here enter image description here

我设法以一种简单的方式做到了。创建包含另一个方形视图的视图,向此视图添加手势,然后使用动画移动它。

问题在于,如果我尝试将此视图添加到自定义UITableViewCell,则不会发生任何事情。

感谢任何提示或想法。

2 个答案:

答案 0 :(得分:0)

您需要通过

将此视图添加到单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

在此方法中执行以下操作:

{
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customCell" forIndexPath:indexPath];

 UIView *customView = (UIView *) [cell viewWithTag:100];
    customView.frame = CGRectMake(0, 0, self.tableView.frame.size.width, self.tableView.frame.size.height);
    //Bla Bla Bla

return cell;

}

如果您使用的是故事板,我假设您是这样,请确保将customIdentifier添加到单元格中,在本例中为“customCell”。通过单击单元格并只需键入id即可。

如果仍然无效,请确保在代码和故事板中正确连接所有代表,确保您的tableview已链接等。

希望这有帮助!

答案 1 :(得分:0)

有几种方法可以实现这一目标。一种方法是将您的蓝色视图0间距约束赋予superview的左侧和右侧,并给左侧优先级750,右侧优先级为749.然后给蓝色视图宽度约束为一半它的超级视图的宽度(在IB中至少,Xcode不会让你在蓝色视图和单元格的contentView之间制作这个宽度约束 - 你必须首先添加另一个视图固定到内容的所有方面查看,并使蓝色视图成为该完整大小视图的子视图)。此设置将为您提供蓝色视图,该视图是单元格宽度的一半,并且最初固定在左侧。

cellForRowAtIndexPath:中,您可以通过更改其中一个约束的优先级来设置“开关”的位置(我选择了尾随约束,我将IBOutlet设置为)。无论哪个约束(前导或尾随)具有更高的优先级,将是满足的约束。手势识别器的动作方法需要用新的优先级值替换优先级值,然后为切换器的位置设置动画。以下是我用来测试此设置的示例代码,

- (void)viewDidLoad {
    [super viewDidLoad];
    self.theData = [@[@749, @749, @749, @749, @749, @749, @749, @749, @749, @749, @749, @749, @749, @749, @749, @749, @749, @749, @749, @749] mutableCopy];
    [self.tableView reloadData];
}



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.theData.count;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    RDTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    [cell.rightSwiper addTarget:self action:@selector(handleSwipe:)];
    [cell.leftSwiper addTarget:self action:@selector(handleSwipe:)];
    cell.trailingCon.priority = [self.theData[indexPath.row] floatValue];
    return cell;
}


-(void)handleSwipe:(UISwipeGestureRecognizer *) swiper {
    CGPoint point = [swiper.view convertPoint:CGPointZero toView:self.tableView];
    NSIndexPath *path = [self.tableView indexPathForRowAtPoint:point];
    RDTableViewCell *cell = (RDTableViewCell *)[self.tableView cellForRowAtIndexPath:path];
    if (swiper.direction == UISwipeGestureRecognizerDirectionLeft) {
        [self.theData replaceObjectAtIndex:path.row withObject:@749];
    }else{
        [self.theData replaceObjectAtIndex:path.row withObject:@751];
    }

    cell.trailingCon.priority = [self.theData[path.row] floatValue];
        [UIView animateWithDuration:.2 animations:^{
            [cell layoutIfNeeded];
        }];
}