我正在尝试在用户捏紧时调整单个UITableViewCell的大小。当'捏'足够大时,我想要执行一个segue。
所以在cellForRowAtIndexPath中。我分配/初始化UIPinchGestureRecognizer并将其附加到单元格。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
/** adding info to the cell **/
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(makeBiggerCell:)];
[cell addGestureRecognizer:pinchGesture];
return cell;
}
在下面的方法中,我想根据用户的手势计算(并设置)所选行的高度并“重绘”它。就像我说的,如果手势完成并且单元格足够大,那么我想执行一个segue。
- (void)makeBiggerCell:(UIPinchGestureRecognizer *)gesture {
if (gesture.state == UIGestureRecognizerStateChanged){
// I have a private property of NSIndexPath in order to keep
// track of the selected row.
self.selectedIndexPath = [self.tableView indexPathForCell:(UITableViewCell *)sender.view];
CGPoint windowPoint = [gesture locationOfTouch:1 inView:nil];
CGPoint tablePoint = [gesture locationInView:self.tableView];
self.sizeOfCell = fabsf(tablePoint.y - windowPoint.y);
// the MINIMUM_CELL_SIZE is the regular size of the cell
// this conditional tries to avoid small tableviewcells
// IMPORTANT: as long as the user keeps his fingers on the cell
// the 'resize' happens
if (self.sizeOfCell > MINIMUM_CELL_SIZE)
[self.tableView reloadRowsAtIndexPaths:@[self.selectedIndexPath] withRowAnimation:UITableViewRowAnimationNone];
}else if (sender.state == UIGestureRecognizerStateEnded){
if (sender.scale >=5) {
[self performSegueWithIdentifier:@"MySegue" sender:sender.view];
}
}
}
最后是我为所选行设置高度的地方
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
if (self.selectedIndexPath && self.selectedIndexPath.row == indexPath.row && self.sizeOfCell)
return self.sizeOfCell + MINIMUM_CELL_SIZE;
else
return MINIMUM_CELL_SIZE;
}
除了具有2个属性(sizeOfCell和selectedIndexPath)之外的问题是改变uitableviewcell大小的外观,看起来不够“光滑”。我想要实现像iOS 7天气应用程序类似的东西,当你捏住一个单元格并执行一个segue时。
如果你们为我的问题找到一个更清洁的解决方案,我会非常感激! :]
答案 0 :(得分:0)
只是推荐一些东西让你尝试...不确定它是否会给你平滑的结果....尝试使用pinchGesture的比例来设置大小,并在每次更改后将比例设置回1。
if (pinchGesture.state == UIGestureRecognizerStateChanged || pinchGesture.state == UIGestureRecognizerStateEnded) {
self.sizeOfCell.width *= pinchGesture.scale;
self.sizeOfCell.height *= pinchGesture.scale;
pinchGesture.scale = 1;
[self.tableView reloadRowsAtIndexPaths: @[self.selectedIndexPath] withRowAnimation:UITableViewRowAnimationNone];
}
您的performSegue应该在@property sizeOfCell的setter中调用,检查它何时大于5并执行Segue。
祝你好运。