How to use UITableView inside UIScrollView and receive a cell click?

前端 未结 6 2323
野趣味
野趣味 2020-12-01 15:43

I have DiscountListTableViewController that is shown as a separate screen in my app. But there\'s another screen (PlaceDetailsViewController) where

相关标签:
6条回答
  • 2020-12-01 15:57

    Perhaps this is late, but I managed to do this by:

    • Disable Scroll on the UITableView
    • Set the content size of the UIScrollView programmatically after I calculate the height I need
    0 讨论(0)
  • 2020-12-01 15:59

    Update for 2020, swift 5.X that allows your tableview inside a scrollview!

    1. Create a subclass of UITableView:

       import UIKit
      
       final class ContentSizedTableView: UITableView {
           override var contentSize:CGSize {
               didSet {
                   invalidateIntrinsicContentSize()
               }
           }
      
           override var intrinsicContentSize:CGSize {
               layoutIfNeeded()
               return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
           }
       }
      
    2. Add a UITableView to your layout and set constraints on all sides. Set the class of it to ContentSizedTableView.

    3. You should see some errors, because Storyboard doesn't take our subclass' intrinsicContentSize into account. At runtime it will use the override in our ContentSizedTableView class

    0 讨论(0)
  • 2020-12-01 16:02

    should not do this because UITableView is a subclass of UIScrollView and according to apple docs. just use auto layout more easier than you calculate every item size and stoping table scroll to do so.

    apple Docs:

    You should not embed UIWebView or UITableView objects in UIScrollView objects. If you do so, unexpected behavior can result because touch events for the two objects can be mixed up and wrongly handled.

    0 讨论(0)
  • 2020-12-01 16:03

    Not advised ? It kind of felt like "dont do" after reading this.The unpredictability is never a good behaviour for the app

    Important: You should not embed UIWebView or UITableView objects in UIScrollView objects. If you do so, unexpected behavior can result because touch events for the two objects can be mixed up and wrongly handled.

    0 讨论(0)
  • 2020-12-01 16:11

    Answer : Don't do this.

    UITableview is inherited from ----> UIScrollView : UIView : UIResponder : NSObject

    Apple says :

    Important: You should not embed UIWebView or UITableView objects in UIScrollView objects. If you do so, unexpected behavior can result because touch events for the two objects can be mixed up and wrongly handled.

    0 讨论(0)
  • 2020-12-01 16:18

    Will share how solved that. Did subclassed UIScrollView and used as container view in PlaceDetailsViewController:

    @interface PlaceDetailsContainerUIScrollView : UIScrollView
    
    @end
    
    @implementation PlaceDetailsContainerUIScrollView
    
    - (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
      UIView *result = [super hitTest:point withEvent:event];
    
      if ([result isKindOfClass:[UIView class]] && (result.tag == kDiscountListTableViewCellTag)
      {
        UITableView *tableView = (UITableView *) [[result.superview superview] superview];
    
        return tableView;
    
      }
    
      return result;
    }
    @end
    

    Also, don't forget to set PlaceDetailsContainerUIScrollView.delaysContentTouches = YES and PlaceDetailsContainerUIScrollView.canCancelContentTouches = NO.

    Also, needed small fix in DiscountListTableViewController method:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
      DiscountDetailsViewController *discountDetailsVC = [[DiscountDetailsViewController alloc] init];
    
      //[self.navigationController pushViewController:discountDetailsVC animated:YES];   
      // self.navigationController is nill because it's not pushed on nav stack, so will grab the current one:
      AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    
      [appDelegate.navigationController pushViewController:discountDetailsVC animated:YES];
    }
    
    0 讨论(0)
提交回复
热议问题