Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SegmentControl animates when changing userInterfaceStyle #2219

Open
ashish-naik opened this issue Apr 24, 2022 · 10 comments
Open

SegmentControl animates when changing userInterfaceStyle #2219

ashish-naik opened this issue Apr 24, 2022 · 10 comments

Comments

@ashish-naik
Copy link

Describe the bug
On selection of new segment, i change userInterfaceStyle in animated block. During this labels of the segmentControl, also animate. How to fix this?

Thanks.

To Reproduce

	<<< SegmentedRow<String>() {
						
			$0.title = "Select theme"
			$0.options = ["System", "Light", "Dark"]

			let currentInterfaceStyle = self.userDefaults.string(forKey: "currentUserInterfaceStyle")
						
			switch currentInterfaceStyle {
				case "light":
					$0.value = "Light"
				case "dark":
					$0.value = "Dark"
				default:
					$0.value = "System"
			}
						
		}.cellSetup { cell, row in
			cell.textLabel?.textColor = Constants.ColorCompatibility.label
			cell.textLabel?.font = UIFont.boldSystemFont(ofSize: 14)
			cell.segmentedControl.selectedSegmentTintColor = Constants.ColorCompatibility.globalTintColor
		}.onChange({ (row) in

			let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
					
				UIView.animate(withDuration: 0.4) {

					switch row.value {
								
						case "Dark":
							window?.overrideUserInterfaceStyle = UIUserInterfaceStyle.dark
							self.userDefaults.set("dark", forKey: "currentUserInterfaceStyle")

						case "Light":
							window?.overrideUserInterfaceStyle = UIUserInterfaceStyle.light
							self.userDefaults.set("light", forKey: "currentUserInterfaceStyle")
								
						case "System":
							window?.overrideUserInterfaceStyle = UIUserInterfaceStyle.unspecified
							self.userDefaults.set("system", forKey: "currentUserInterfaceStyle")

						default:
							window?.overrideUserInterfaceStyle = UIUserInterfaceStyle.unspecified
							self.userDefaults.set("system", forKey: "currentUserInterfaceStyle")
					}
				}
				self.userDefaults.synchronize()
						
						
		})

Expected behavior
Segment control labels should not animate
Screenshots
If applicable, add screenshots to help explain your problem.

Versions (please complete the following information):

  • Device: iPhone 12 simulator/Iphone 11 device
  • OS: iOS 15.0
  • Eureka Version 5.3.4
  • Xcode version 13.3
    segment control anination
@mats-claassen
Copy link
Member

Hi, I copied your code into one of the Eureka examples and it works just fine, no animations for the segmented control labels (Xcode 13.3, Simulator iPhone 13)
I suggest you double check if there is anything else that might interfere with the animation or something else that animates.

@ashish-naik
Copy link
Author

I am not animating anything in the view controller.

i tried animate block and change of userInterfaceStyle in switch row. it still affects UISegmentControl.

The form elements loads from left. Can this behaviour be altered? Could this be affecting UISegmentControl ?

I tried to add my code in the Eureka example code but getting below error. It may unrelated but i was earlier able to run example project. Below is initial part of the error.

Showing Recent Messages
Cycle inside Eureka; building could produce unreliable results. This usually can be resolved by moving the target's Headers build phase before Compile Sources.
Cycle details:
→ Target 'Eureka' has link command with output '/Users/a/Library/Developer/Xcode/DerivedData/Eureka-bsgphpazxmymhjcxmobqusednbco/Build/Products/Debug-iphoneos/Eureka.framework/Eureka'
○ Target 'Eureka' has compile command with input '/Users/a/Library/Developer/Xcode/DerivedData/Eureka-bsgphpazxmymhjcxmobqusednbco/Build/Intermediates.noindex/Eureka.build/Debug-iphoneos/Eureka.build/DerivedSources/Eureka_vers.c'
○ Target 'Eureka' has compile command for Swift source files
○ Target 'Eureka' has copy command from '/Users/a/Developer/sample iOS projects/Projects/Eureka-master/Source/Eureka.h' to '/Users/a/Library/Developer/Xcode/DerivedData/Eureka-bsgphpazxmymhjcxmobqusednbco/Build/Products/Debug-iphoneos/Eureka.framework/Headers/Eureka.h'

@ashish-naik
Copy link
Author

When i present Preferences View controller in full screen, UISegmentControl works normally.

This worked in non full screen but don't get the animation to work. This is not an issue with Eureka though i am sure.

UIView.animate(withDuration: 0.5, animations: {
						
	self.overrideUserInterfaceStyle = newUserInterfaceStyle!

}) { (_) in
	window?.overrideUserInterfaceStyle = newUserInterfaceStyle!

}

@mats-claassen
Copy link
Member

So this seems to be an issue with UISegmentedControl when in a view controller that is not full screen?

@ashish-naik
Copy link
Author

ashish-naik commented May 7, 2022

Yes
But this doesn't happen in example project.

Another issue i noticed is how the UISwitch changes colour first appearing as square. Don't know what is causing this strange behaviour. Please check the image above.

The form rows load from left. Can this behaviour be altered? They don't load like this in example project.
Could this be affecting UISegmentControl ?

eureka.form.animation.mp4

@ashish-naik
Copy link
Author

@mats-claassen Any suggestion or solution I can use?

@mats-claassen
Copy link
Member

Sometimes such behaviour has to do with the moment you set up the form. Is that happening in viewDidLoad or later? Are you setting the whole form at once or are you building the viewController's form variable in multiple steps?

@ashish-naik
Copy link
Author

it is in viewDidLoad and one form variable and multiple sections.

@mats-claassen
Copy link
Member

Are you building the self.form variable gradually or assigning it at the end like this: (might be worth a try)

let form = Section()
    <<< TextRow()
    <<< IntRow()
self.form = form

@ashish-naik
Copy link
Author

Thanks. This worked.

and found solution to prevent titles getting animated here by adding layoutIfNeeded() but UISwitch still becomes square during animation duration.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants