1

I am making a calculator app in iOS 9, Swift and with Xcode 7 and I would like to know how to create UIButtons when the user switches to landscape mode only. Adding more operators to the left of the number and AC Button and changing the constraints, shifting the buttons over to make room for the new ones. The basic calculator for iOS does this and I'm wondering how??

I'm new to iOS development and I have been web browsing to only find an overriding function called: viewWillTransitionToSize(). Is this the right function to do this sort of thing?

Also, everytime I enter the landscape view, another button gets created. How can I stop this from happening? enter image description here

enter image description here

enter image description here

Attached is my programmatic creation of the UIbutton and the function I listed above.

Sorry for the array of questions/problems. I am having difficulties finding tutorials or help on this issue. Any guidance or solution will be helpful. Thank you so much.

ViewController.swift

import UIKit


class ViewController: UIViewController {

    @IBOutlet weak var outputDisplay: UILabel!

    @IBOutlet weak var number7: UIButton!
    @IBOutlet weak var number1: UIButton!
    @IBOutlet weak var number2: UIButton!
    @IBOutlet weak var number3: UIButton!
    @IBOutlet weak var number4: UIButton!
    @IBOutlet weak var number5: UIButton!
    @IBOutlet weak var number6: UIButton!
    @IBOutlet weak var number9: UIButton!
    @IBOutlet weak var number8: UIButton!
    @IBOutlet weak var numberZero: UIButton!
    @IBOutlet weak var decimalPoint: UIButton!
    @IBOutlet weak var plusMinusToggle: UIButton!
    @IBOutlet weak var acClear: UIButton!
    @IBOutlet weak var equalButton: UIButton!
    @IBOutlet weak var multiply: UIButton!
    @IBOutlet weak var divide: UIButton!
    @IBOutlet weak var subtraction: UIButton!
    @IBOutlet weak var addition: UIButton!
    @IBOutlet weak var deletion: UIButton!
    @IBOutlet weak var squareRoot: UIButton!

    var typing:Bool = false
    var firstNumber: Float = 0.0
    var secondNumber: Float = 0.0
    var operation:String = ""
    var result: Float = 0.0

    var valueToPass: Float = 0.0

    override func viewDidLoad() {
        super.viewDidLoad()

        number1.layer.cornerRadius = number1.bounds.size.width / 8.0
        number2.layer.cornerRadius = number2.bounds.size.width / 8.0
        number3.layer.cornerRadius = number3.bounds.size.width / 8.0
        number4.layer.cornerRadius = number4.bounds.size.width / 8.0
        number5.layer.cornerRadius = number5.bounds.size.width / 8.0
        number6.layer.cornerRadius = number6.bounds.size.width / 8.0
        number7.layer.cornerRadius = number7.bounds.size.width / 8.0
        number8.layer.cornerRadius = number8.bounds.size.width / 8.0
        number9.layer.cornerRadius = number9.bounds.size.width / 8.0
        numberZero.layer.cornerRadius = numberZero.bounds.size.width / 8.0
        equalButton.layer.cornerRadius = equalButton.bounds.size.width / 8.0
        deletion.layer.cornerRadius = deletion.bounds.size.width / 8.0
        plusMinusToggle.layer.cornerRadius = plusMinusToggle.bounds.size.width / 8.0
        decimalPoint.layer.cornerRadius = decimalPoint.bounds.size.width / 8.0
        acClear.layer.cornerRadius = acClear.bounds.size.width / 8.0
        addition.layer.cornerRadius = addition.bounds.size.width / 8.0
        divide.layer.cornerRadius = divide.bounds.size.width / 8.0
        multiply.layer.cornerRadius = multiply.bounds.size.width / 8.0
        subtraction.layer.cornerRadius = subtraction.bounds.size.width / 8.0
        squareRoot.layer.cornerRadius = squareRoot.bounds.size.width / 8.0
    }

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

        if (UIDevice.currentDevice().orientation.isLandscape) {
            print("Device in Lanscape")
            let newButton1 = UIButton(type: UIButtonType.System) as UIButton
            newButton1.frame = CGRectMake(100, 100, 100, 50)
            newButton1.backgroundColor = UIColor.whiteColor()
            newButton1.center = CGPoint(x: number1.frame.width, y: number1.frame.height)
            newButton1.layer.cornerRadius = newButton1.bounds.size.width / 8.0
            self.view.addSubview(newButton1)
        }
        else{}
    }

    @IBAction func numberPressed(sender: AnyObject) {
        // set the variable "number" to whichever number the user presses
        let number = sender.currentTitle!

        if typing {
            outputDisplay.text = outputDisplay.text! + String(number!)
        } else {
            outputDisplay.text = number!
        }
        typing = true
    }

    @IBAction func calculationPressed(sender: AnyObject) {
        typing = false
        firstNumber = Float(outputDisplay.text!)!
        operation = sender.currentTitle!!
    }

    @IBAction func equalPressed(sender: AnyObject) {
        secondNumber = Float(outputDisplay.text!)!
        typing = false

        //arithmetic operations
        if operation == "+" {
            result = firstNumber + secondNumber
        }
        else if operation == "-" {
            result = firstNumber - secondNumber
        }
        else if operation == "โœ•" {
            result = firstNumber * secondNumber
        }
        else if operation == "รท" {
            result = firstNumber / secondNumber
        }
//        else if operation == "%" {
//            result = (firstNumber * secondNumber) / 100
//        }
        else if operation == "โˆš" {
            result = sqrt(firstNumber)
        }

        outputDisplay.text = "\(result)"
    }

    @IBAction func squareRoot(sender: AnyObject) {
        result = sqrt(Float(outputDisplay.text!)!)
        outputDisplay.text = "\(result)"

    }

    @IBAction func deletePressed(sender: AnyObject) {
        if outputDisplay.text!.characters.count != 0 {
            outputDisplay.text = outputDisplay.text!.substringToIndex(outputDisplay.text!.endIndex.predecessor())
        }
        else{
            outputDisplay.text = "0"
        }

    }

    @IBAction func plusMinus(sender: AnyObject) {
        if( outputDisplay.text![outputDisplay.text!.startIndex] == "-"){
            outputDisplay.text!.removeAtIndex(outputDisplay.text!.startIndex)
        }else{
            outputDisplay.text!.insert("-", atIndex: outputDisplay.text!.startIndex)
        }
    }


    @IBAction func decimal(sender: AnyObject) {
        let decimal = sender.currentTitle!
        outputDisplay.text = outputDisplay.text! + decimal!
    }

    @IBAction func clear(sender: AnyObject) {
        result = 0
        firstNumber = 0
        secondNumber = 0
        outputDisplay.text = "0"
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
Zach
  • 119
  • 3
  • 17
  • Not related to your question but : Why don't you use a switch case instead of your if else if statement ? I think a switch case would be more appropriate, because the if statement has to test every expression. โ€“ ramsey_lewis Feb 12 '16 at 07:44

1 Answers1

1

I would do this using Size Classes. You can design different layouts and button arrangements in storyboard using the different size classes. If this application is on the iPhone, you would use Compact width and Regular height when in Portrait and Compact height and Regular width when in Landscape.

Kyle Redfearn
  • 2,172
  • 16
  • 34