2017-01-02 85 views
2

我在IOS初学者,我想通过旋转iPhone来改变图像的不透明度并实时显示在视图中它如何更改图像透明度实时在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 

我从iphone获得了加速度计值,并使用它来更改图像的不透明度,但无法实时显示结果,我该如何操作?

回答

1

问题是在后台线程上调用startAccelerometerUpdatesToQueue:withHandler的处理程序块,并禁止在后台线程上进行UI更改,并且会导致未定义的行为。

一个解决方案是更新调度块内的阿尔法:

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

甲调度块增加了块内的指令,以在主线程队列中。这样,它将在主线程上运行,任何UI更改都能正常工作。

+0

它真的工作!谢谢! –