Cripto
Cripto

Reputation: 3751

Swift redraw view

I have a theme class with a few fields.

Background color, font color and element color.

This class also has few static variations of those

class Themes {
    static let defaultTheme = Themes(topColor: "5856D6",bottomColor: "C644FC",elementColor: "1F1F21",fontColor: "2B2B2B", name:"one")
    static let defaultTheme1 = Themes(topColor: "5AD427",bottomColor: "FFDB4C",elementColor: "1F1F21",fontColor: "2B2B2B", name:"two")
    static let defaultTheme2 = Themes(topColor: "FB2B69",bottomColor: "FF5B37",elementColor: "1F1F21",fontColor: "2B2B2B", name:"three")
    static let defaultTheme3 = Themes(topColor: "52EDC7",bottomColor: "5AC8FB",elementColor: "1F1F21",fontColor: "2B2B2B", name:"four")
    static let defaultTheme4 = Themes(topColor: "5AD427",bottomColor: "FFDB4C",elementColor: "1F1F21",fontColor: "2B2B2B", name:"five")

    let topColor:UIColor
    let bottomColor:UIColor
    let elementColor:UIColor
    let fontColor:UIColor
}

My view controller loads the first one by default.

override func viewDidLoad() {
    super.viewDidLoad()
    self.initView(ThemeManagement.sharedInstance.getTheme())

}

I have a button which changes the theme by going to the next one of the defaults and looping around back to defaultTheme after defaultTheme4

The original run through inside initView is setting the view correctly. But each pass does not update the view. Despite the log messages of the function being printed.

func initView(objectColor : Themes){
    println("initing theme "+objectColor.name+"\n"+objectColor.topColor.debugDescription)
    let background = CAGradientLayer().gradient(objectColor.topColor, bottomColorCode: objectColor.bottomColor)
    background.frame = self.view.bounds
    self.view.layer.insertSublayer(background, atIndex: 0)


    codes.delegate = self
    codes.placeholder = "####"
    codes.textAlignment = NSTextAlignment.Center
    codes.font = Themes.defaultThemeWithFontSize(.H2)
    codes.textColor = objectColor.fontColor

    segments.tintColor = objectColor.elementColor

    segments.setTitle(String.fontAwesomeIconWithName(.Male), forSegmentAtIndex: 0)
    segments.setTitle(String.fontAwesomeIconWithName(.VenusMars), forSegmentAtIndex: 1)
    segments.setTitle(String.fontAwesomeIconWithName(.Female), forSegmentAtIndex: 2)
    var font = UIFont.fontAwesomeOfSize(fontsize/2);
    var attr = NSDictionary(object: font, forKey: NSFontAttributeName)
    segments.setTitleTextAttributes(attr as [NSObject : AnyObject], forState:UIControlState.Normal)

    acceptButton.titleLabel?.font = UIFont.fontAwesomeOfSize(fontsize)
    acceptButton.setTitle(String.fontAwesomeIconWithName(FontAwesome.ArrowCircleORight), forState: .Normal)
    acceptButton.tintColor = UIColor.greenColor()

    workedButton.setTitle("yes", forState: UIControlState.Normal)
    workedButton.tintColor = objectColor.fontColor
    workedButton.layer.cornerRadius = 5
    workedButton.titleLabel?.font = Themes.defaultThemeWithFontSize(.H2)
    workedButton.backgroundColor = UIColor(red:0.333, green:0.937, blue:0.796, alpha: 0.2)

    didntWorkButton.setTitle("no", forState: UIControlState.Normal)
    didntWorkButton.tintColor = objectColor.fontColor
    didntWorkButton.layer.cornerRadius = 5
    didntWorkButton.titleLabel?.font = Themes.defaultThemeWithFontSize(.H2)
    didntWorkButton.backgroundColor = UIColor(red:0.333, green:0.937, blue:0.796, alpha: 0.2)


    locationButton.setTitle("Current Location", forState: UIControlState.Normal)
    locationButton.tintColor = objectColor.fontColor
    locationButton.layer.cornerRadius = 5
    locationButton.titleLabel?.font = Themes.defaultThemeWithFontSize(.H3)

    didItWork.text = "Did it work?"
    didItWork.font = Themes.defaultThemeWithFontSize(.H2)
    didItWork.textColor = objectColor.fontColor

    self.view.setNeedsDisplay()
}

Do I have to do something else to get the background layer to update and the font colors to change?

Upvotes: 2

Views: 1166

Answers (1)

dopcn
dopcn

Reputation: 4218

by this

self.view.layer.insertSublayer(background, atIndex: 0)

every time you insert a new background layer behind the old one so you won't see it.

and change the tintColor of a view won't change the view's color immediately so try to change it's textColor direacly

Edit by cripto

The answer above is correct. I just wanted to add my solution to it.

I simply keep a reference to the layer and remove it as long as its not null. This guarantees that I can set it on the first pass and change it every time there after.

    if((backgroundLayer) != nil){
        backgroundLayer.removeFromSuperlayer()

    }
    backgroundLayer = CAGradientLayer().gradient(objectColor.topColor, bottomColorCode: objectColor.bottomColor)
    backgroundLayer.frame = self.view.bounds
    self.view.layer.insertSublayer(backgroundLayer, atIndex: 0)

Upvotes: 1

Related Questions