Arun Sreekumar
Arun Sreekumar

Reputation: 43

UITableViewCell column width change based on screen orientation IOS Swift

I need to make below table like structure in one of the apps I am developing. I am creating this table using UITableView & I need my table column width to change based on the screen orientation. I have set constraints for column width & I will assign values to these using the screen width in my viewDidLoad().

However, I am not able to figure out how to re-align these constraints when screen orientation changes. I figured out that viewWillTransition() will be called when orientation is changed & I recalculated the constraints inside that & called setNeedsLayout() for the table view. However, I am not able to make my table view to reset the table column width when screen orientation is changed. I am new to IOS platform and any help will be greatly appreciated.

HDR_parName/HDR_parValue/HDR_minValue/HDR_maxValue

Para1/value1/minvalue1/maxvalue1

Para2/value2/minvalue2/maxvalue2

Upvotes: 4

Views: 4417

Answers (3)

Heki
Heki

Reputation: 426

Swift 4

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    let animationHandler: ((UIViewControllerTransitionCoordinatorContext) -> Void) = { [weak self] (context) in
        // This block will be called several times during rotation,
        // so if you want your tableView change more smooth reload it here too.
        self?.yourTable.reloadData()
    }

    let completionHandler: ((UIViewControllerTransitionCoordinatorContext) -> Void) = { [weak self] (context) in
        // This block will be called when rotation will be completed
        self?.yourTable.reloadData()
    }

    coordinator.animate(alongsideTransition: animationHandler, completion: completionHandler)

}

Upvotes: 3

Alex Sh.
Alex Sh.

Reputation: 629

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

    let animationHandler: ((UIViewControllerTransitionCoordinatorContext) -> Void) = { [weak self] (context) in
        // This block will be called several times during rotation, 
        // so if you want your tableView change more smooth reload it here too. 
        self?.tableView.reloadData()
    }

    let completionHandler: ((UIViewControllerTransitionCoordinatorContext) -> Void) = { [weak self] (context) in
        // This block will be called when rotation will be completed
        self?.tableView.reloadData()
    }

    coordinator.animateAlongsideTransition(animationHandler, completion: completionHandler)

}

Then tableView datasource and delegate methods will be called, where you can setup elements size according to tableView frame size.

Upvotes: 5

Devang Tandel
Devang Tandel

Reputation: 3008

It is quite simple solution, what you are doing is wrong. Consider you want full width as your row width.

You don't have to set any constraint to cell width, instead set trailing constraint to your tableview. It will handle all.

If you still face similar issue then try

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    self.view.layoutIfNeeded()
}

let me know if you are still facing the issue.

Upvotes: 0

Related Questions