是否可以在iOS 5.1+上設置屏幕亮度變化的動畫效果?我正在使用[UIScreen mainScreen] setBrightness:(float)]
,但我認爲突然變化是醜陋的。如何使用淡入淡出動畫設置屏幕亮度?
5
A
回答
6
我不知道這是否是以其他方式「動畫」,但你可以自己動手。 例如,以下示例代碼被連接到用戶界面中的「Full Bright」和「Half Bright」按鈕。它使用performSelector ... afterDelay每10ms將亮度改變1%,直到達到目標亮度。你會根據一些實驗選擇適當的變化率。實際上,我認爲刷新率爲60赫茲,因此在小於1/60秒的時間間隔內進行更改可能沒有意義(我的示例比率被選擇爲具有不錯的數學)。儘管您可能想在非UI線程上執行此操作,但它不會阻止UI。
- (IBAction)fullBright:(id)sender {
CGFloat brightness = [UIScreen mainScreen].brightness;
if (brightness < 1) {
[UIScreen mainScreen].brightness += 0.01;
[self performSelector:@selector(fullBright:) withObject:nil afterDelay:.01];
}
}
- (IBAction)halfBright:(id)sender {
CGFloat brightness = [UIScreen mainScreen].brightness;
if (brightness > 0.5) {
[UIScreen mainScreen].brightness -= 0.01;
[self performSelector:@selector(halfBright:) withObject:nil afterDelay:.01];
}
}
0
基於查理價格最偉大的答案,這裏是爲「動畫」,在屏幕亮度所需的任何值的變化的方法。
- (void)graduallyAdjustBrightnessToValue:(CGFloat)endValue
{
CGFloat startValue = [[UIScreen mainScreen] brightness];
CGFloat fadeInterval = 0.01;
double delayInSeconds = 0.01;
if (endValue < startValue)
fadeInterval = -fadeInterval;
CGFloat brightness = startValue;
while (fabsf(brightness-endValue)>0) {
brightness += fadeInterval;
if (fabsf(brightness-endValue) < fabsf(fadeInterval))
brightness = endValue;
dispatch_time_t dispatchTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(dispatchTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[UIScreen mainScreen] setBrightness:brightness];
});
}
}
7
當試圖使用以前的動畫進行動畫處理其他值時,我遇到了接受答案的問題。該解決方案將取消正在進行的動畫和動畫的新值:
extension UIScreen {
func setBrightness(_ value: CGFloat, animated: Bool) {
if animated {
_brightnessQueue.cancelAllOperations()
let step: CGFloat = 0.04 * ((value > brightness) ? 1 : -1)
_brightnessQueue.add(operations: stride(from: brightness, through: value, by: step).map({ [weak self] value -> Operation in
let blockOperation = BlockOperation()
unowned let _unownedOperation = blockOperation
blockOperation.addExecutionBlock({
if !_unownedOperation.isCancelled {
Thread.sleep(forTimeInterval: 1/60.0)
self?.brightness = value
}
})
return blockOperation
}))
} else {
brightness = value
}
}
}
private let _brightnessQueue: OperationQueue = {
let queue = OperationQueue()
queue.maxConcurrentOperationCount = 1
return queue
}()
0
或者你可以使用的NSTimer而不是while循環和performSelector。
finalValue - 您希望實現的價值。
定時器每次持續閃爍30次,持續時間爲0.02秒(您可以選擇不同但平滑的東西)並更改亮度值。
weak var timer: NSTimer?
var count = 1
let maxCount = 30
let interval = 0.02
timer = NSTimer
.scheduledTimerWithTimeInterval(interval,
target: self,
selector: #selector(changeBrightness),
userInfo: nil,
repeats: true)
func changeBrightness()
{
guard count < maxCount else { return }
let currentValue = UIScreen.mainScreen().brightness
let restCount = maxCount - count
let diff = (finalValue - currentValue)/CGFloat(restCount)
let newValue = currentValue + diff
UIScreen.mainScreen().brightness = newValue
count += 1
}
0
迅速擴展:
extension UIScreen {
private static let step: CGFloat = 0.1
static func animateBrightness(to value: CGFloat) {
guard fabs(UIScreen.main.brightness - value) > step else { return }
let delta = UIScreen.main.brightness > value ? -step : step
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
UIScreen.main.brightness += delta
animateBrightness(to: value)
}
}
}
相關問題
- 1. 淡入淡出屏幕
- 2. uiview屏幕淡入淡出
- 3. 如何淡入淡出整個屏幕
- 4. wpf動畫淡入淡出和淡出
- 5. jQuery動畫淡入淡出
- 6. android:淡入淡出動畫
- 7. 淡入淡出動畫Swift
- 8. CSS3動畫/淡入淡出
- 9. 淡入淡出動畫UITableViewCell
- 10. CSS動畫淡入淡出
- 11. 淡入淡出動畫
- 12. 動畫淡入淡出
- 13. 淡入淡出動畫
- 14. CSS3淡入淡出動畫
- 15. 淡入淡出動畫(UIViewAnimation)
- 16. 動畫UILabel淡入/淡出
- 17. 淡入淡出動畫
- 18. NSGradient淡入淡出/動畫
- 19. 如何使用淡入淡出/淡入淡出使用JS
- 20. 如何使div在屏幕上淡入/淡出
- 21. 淡出屏幕使用GLSL
- 22. jQuery調用CSS3淡入淡出動畫?
- 23. 禁用淡入淡出動畫
- 24. 如何使用css動畫和角色逐個淡入淡出?
- 25. 如何使用淡入淡出效果動畫項目
- 26. 如何使用淡入淡出動畫添加(複製)div
- 27. Popcorn.js淡入/淡出字幕
- 28. 是否有可能使UIButton淡入淡出或滑出屏幕?
- 29. 淡入淡出效果與不透明度值設置滾動
- 30. 在Android中動畫淡入淡出