How to add a UIView above the current UITableViewController

后端 未结 20 735
旧时难觅i
旧时难觅i 2020-11-27 11:57

I have difficulty adding a subview (UIView) from within the viewDidLoad method of a UITableViewController

This works:

[self.view addSubview:self.prog         


        
相关标签:
20条回答
  • 2020-11-27 12:41

    Solution for swift (equivalent to Daniel Saidi):

    If your controller is a UITableViewController in a Storyboard or XIB and you wish to reassign self.view to a standard UIView while preserving your existing table view:

    @IBOutlet var tableViewReference: UITableView!
    var viewReference: UIView!
    

    Then in your implementation file:

    Add these instance variables to your table view controller file:

    override var tableView: UITableView! {
        get { return tableViewReference }
        set { super.tableView = newValue }
    }
    
    override var view: UIView! {
        get { return viewReference }
        set { super.view = newValue }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.edgesForExtendedLayout = UIRectEdge.None
        self.extendedLayoutIncludesOpaqueBars = false
        self.automaticallyAdjustsScrollViewInsets = false
    
        //rewiring views due to add tableView as subview to superview
        viewReference = UIView.init(frame: tableViewReference.frame)
        viewReference.backgroundColor = tableViewReference.backgroundColor
        viewReference.autoresizingMask = tableViewReference.autoresizingMask
        viewReference.addSubview(tableViewReference)
    }
    

    In your Storyboard or XIB file: Connect the tableView in the UITableViewController to the tableViewReference variable.

    Then you will be able to add child views as follows:

    self.view.addSubView(someView)
    
    0 讨论(0)
  • 2020-11-27 12:41

    There may be reasons not to do this, but this works for me so far. If you use an ap

    Inside viewDidLayoutSubviews you can run this, but make sure to only run it once obviously

    self.searchTableView = [[UITableView alloc] initWithFrame:self.tableView.frame style:UITableViewStylePlain];
    self.searchTableView.backgroundColor = [UIColor purpleColor];
    [self.view.superview addSubview:self.searchTableView];
    
    0 讨论(0)
  • 2020-11-27 12:45

    You may simply put the following code in viewDidAppear:

    [self.tableView.superview addSubview:<your header view>];
    
    0 讨论(0)
  • 2020-11-27 12:46

    To add a customView above the current UITableViewController, it must be a nice way to use 'self.navigationController.view addSubview:customView' like Daniel commented.

    However, in case of implementing customView that serves as navigationBar, Daniel's way can cause unexpected result to default or custom navigationBar on other navigationViewControllers that is in front and back of the UITableViewController.

    The best simple way is just converting UITableViewController into UIViewController which has no limit on layout it's subviews. But, if you're struggling with massive, long legacy UITableViewController code, the story is totally different. We don't have any sec for converting.

    In this case, you can simply highjack tableView of UITableViewController and solve this whole problem.

    The most important thing we should know is UITableViewController's 'self.view.superview' is nil, and 'self.view' is UITableView itself.

    First, highjack the UITableVIew.

    UITableView *tableView = self.tableView;
    

    Then, replace 'self.view'(which is now UITableView) with a new UIView so that we can layout customViews with no-limitation.

    UIView *newView = UIView.new;
    newView.frame = tableView.frame;
    self.view = newView;
    

    Then, put UITableView we highjacked before on the new self.view.

    [newView addSubview:tableView];
    tableView.translatesAutoresizingMaskIntoConstraints = NO;
    [tableView.topAnchor constraintEqualToAnchor:self.view.topAnchor].active = YES;
    [tableView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor].active = YES;
    [tableView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor].active = YES;
    [tableView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor].active = YES;
    

    Now, we can do whatever we want on this brand new fancy 'self.view' on UITableViewController.

    Bring a custom View, and just add as subView.

    UIView *myNaviBar = UIView.new;
    [myNaviBar setBackgroundColor:UIColor.cyanColor];
    [self.view addSubview:myNaviBar];
    
    myNaviBar.translatesAutoresizingMaskIntoConstraints = NO;
    [myNaviBar.topAnchor constraintEqualToAnchor:self.view.topAnchor].active = YES;
    [myNaviBar.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor].active = YES;
    [myNaviBar.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor].active = YES;
    [myNaviBar.heightAnchor constraintEqualToConstant:90].active = YES;
    

    gif

    0 讨论(0)
  • 2020-11-27 12:48

    Ive been able to add a subview on top of a uitableviewcontroller by using uiviewcontroller containment.

    UITableViewController is actually very handy when it comes to static cells and this is probably the only time where the common answer "just use uitableview" may actually not viable.

    So this is how I do it.

    1. give your UITableViewController a StoryBoard identifier i.e. MyStaticTableView
    2. create a brand new UIViewController subclass and call it UITableViewControllerContainer
    3. place this controller in place of your UITableViewController inside your storyboard
    4. add a subview to the new controller and link it to an outlet called like "view_container"
    5. on you UITableViewControllerContainer viewDidLoad method

    add code like:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        UITableViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyStaticTableView"];
        [self addChildViewController:vc];
        [self.view_container addSubview:vc.view];
    }
    

    Problems you may have:

    1. if you have extra top space then be sure to add the flag "wants fullscreen" to your UITableViewController
    2. if it doesn't resize properly on your UITableViewControllerContainer

    add code:

    - (void)viewWillAppear:(BOOL)animated
    {
        [[self.view_container.subviews lastObject] setFrame:self.view.frame];
    }
    

    at this point from your UITableViewController you can access you container view directly with

    self.view.superview.superview

    and whatever you add to it will be show on top your table view controller

    0 讨论(0)
  • 2020-11-27 12:49

    try: [self.view bringSubviewToFront:self.progView];

    Or you can try to add self.progView to your table's view.

    0 讨论(0)
提交回复
热议问题