2013-04-05 55 views

回答

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) 
     } 
    } 
}