2017-01-02 3 views
2

Ich bin ein Anfänger in ios ändern, möchte ich durch Drehen iphone die Opazität des Bildes ändern und die es auf der Ansicht in EchtzeitWie kann ich Bild Opazität in Echtzeit in IOS

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 


- (void)viewDidLoad { 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
self.motionManager = [[CMMotionManager alloc]init]; 
self.motionManager.accelerometerUpdateInterval = 0.1; 
if([self.motionManager isAccelerometerAvailable]){ 

    [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error){ 
     if(error){ 
      [self.motionManager stopAccelerometerUpdates]; 
     }else{ 

      accX = floor(accelerometerData.acceleration.x * 100)/100; 
      accY = floor(accelerometerData.acceleration.y * 100)/100; 
      accZ = floor(accelerometerData.acceleration.z * 100)/100; 
      NSLog(@"x = %f", accX); 
      NSLog(@"y = %f", accY); 
      NSLog(@"z = %f", accZ); 

     } 
    }]; 
}else{ 
    NSLog(@"Gyroscope is not available."); 
} 
NSBundle *bundle = [NSBundle mainBundle]; 
self.solder = [[UIImage alloc]initWithContentsOfFile:[bundle  
pathForResource:@"solder" ofType:@"jpg"]]; 
self.woman= [[UIImage alloc]initWithContentsOfFile:[bundle 
pathForResource:@"woman" ofType:@"jpg"]]; 

    self.solderImage.alpha = accX; 

    self.solderImage.image = self.solder; 


} 


- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
[self.motionManager stopGyroUpdates]; 
// Dispose of any resources that can be recreated. 
} 

@end 
anzuzeigen

Ich habe den Beschleunigungsmesser-Wert von iphone und verwende es, um die Opazität des Bildes zu ändern, aber ich kann das Ergebnis nicht in Echtzeit anzeigen, wie kann ich das tun?

Antwort

1

Das Problem ist, dass der Handler-Block für startAccelerometerUpdatesToQueue:withHandler in einem Hintergrundthread aufgerufen wird, und Änderungen an der Benutzeroberfläche im Hintergrundthread sind verboten und führen zu undefiniertem Verhalten.

Eine Lösung wäre, die alpha innerhalb eines Dispatch-Block zu aktualisieren:

accX = floor(accelerometerData.acceleration.x * 100)/100; 
accY = floor(accelerometerData.acceleration.y * 100)/100; 
accZ = floor(accelerometerData.acceleration.z * 100)/100; 

dispatch_async(dispatch_get_main_queue(), ^{ 
    self.solderImage.alpha = accX; 
}); 

A Dispatch Block addiert die Anweisungen innerhalb des Blocks an die Warteschlange auf dem Haupt-Thread. Auf diese Weise wird es auf dem Hauptthread ausgeführt und alle Benutzeroberflächenänderungen funktionieren ordnungsgemäß.

+0

Es ist wirklich Arbeit! Danke! –

Verwandte Themen