2011-11-29 23 views
27

Tôi sử dụng [[UIScreen màn hình chính] thiết lậpBrightness:] (trong sdk 5.0) để thay đổi ánh sáng nền hệ thống trong ứng dụng của tôi.applicationWillResignActive và setBrightness không hoạt động?

Các bước sau đây làm việc với ứng dụng của tôi:

  1. kích hoạt ứng dụng, có độ sáng hệ thống như mặc định, sau đó save as sysBright.

  2. Thay đổi độ sáng bằng ứng dụng của tôi, thay đổi độ sáng, sau đó lưu dưới dạng appBright.

  3. Từ chức ứng dụng đang hoạt động với nút trang chủ hoặc nút khóa, đặt độ sáng thành sysBright (giá trị bước 1, độ sáng mặc định của hệ thống).

  4. Ứng dụng đang hoạt động trở lại. Sau đó, nó sẽ lặp lại các bước trên hình thức từ 1 tới 3.

Cái gì là sai với bước 3, khi tôi làm bất hoạt các ứng dụng với nút khóa, hàm applicationWillResignActive hoạt động tốt, nó có thể khôi phục các giá trị độ sáng (sysBright).

Nhưng khi tôi nhấn nút trang chủ, nút này không hoạt động nữa. Độ sáng vẫn là giá trị tôi đã thay đổi trong ứng dụng của mình. (appBright)

Có ai có ý tưởng gì về nó không? Nhờ sự giúp đỡ ~

Đây là mã:

float appBright,sysBright; 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    sysBright = [[UIScreen mainScreen] brightness]; 
    [[NSUserDefaults standardUserDefaults] setFloat:sysBright forKey:@"sysBright"]; 

    [[UIScreen mainScreen] setBrightness:appBright]; 
} 

//doesn't work when i ResignActive with the home button 
- (void)applicationWillResignActive:(UIApplication *)application 
{   
    [[NSUserDefaults standardUserDefaults] floatForKey:@"sysBright"]; 
    [[UIScreen mainScreen] setBrightness:sysBright];   
} 

tôi thiếu cái gì?

+0

Bạn có tìm thấy giải pháp nào khác không? Tôi gặp phải vấn đề tương tự. Giá trị độ sáng trong cài đặt không bị ảnh hưởng. –

+0

Cần điều tương tự, Vui lòng chia sẻ giải pháp của bạn nếu bạn có bất cứ điều gì. Cảm ơn – Mangesh

+1

Đã kết thúc với một UIView bán trong suốt màu đen và sử dụng API lân cận –

Trả lời

0

Khi bạn chạm vào nút home ứng dụng của bạn không từ chức hoạt động nhưng thay vì đi vào "Chế độ Background" và có phương pháp đại biểu riêng của mình mà bạn cần phải xác định:

- (void)applicationDidEnterBackground:(UIApplication *)application 

Something như thế này (ngoài đến phương thức ủy quyền applicationDidBecomeActive:) sẽ có hành vi dự định:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{   
    sysBright = [[NSUserDefaults standardUserDefaults] floatForKey:@"sysBright"]; 
    [[UIScreen mainScreen] setBrightness:sysBright]; 
} 
+0

Cảm ơn đã gợi ý nhưng nó vẫn không hoạt động ... tôi đã cố gắng: - (void) applicationDidEnterBackground: (UIApplication *) ứng dụng { NSLog (@ "App là Chạy trong nền "); // Đặt Độ sáng trở lại bình thường [[Màn hình chính UIScreen] thiết lậpBrightness: sysBright]; } ' và NSLog nhận xét về tôi nhấn nút trang chủ nhưng không làm thay đổi độ sáng ?! –

+0

Không chắc chắn về phần còn lại của chương trình nhưng sau đó bạn có thể cần phải lấy lại biến sysBright từ các giá trị mặc định của người dùng. Xem mã được cập nhật của tôi trong câu trả lời gốc của tôi –

+2

Đã thử đề xuất mới của bạn nhưng vẫn không có may mắn. Tôi có thể NSLog giá trị sysBright chính xác trong phương thức applicationDidEnterBackground nhưng nó thực sự không thay đổi độ sáng. Độ sáng thay đổi trong ứng dụngWillEnterForeground khi tôi mở ứng dụng sao lưu bằng cùng một mã! rất bối rối! –

0

Thứ hai đến dòng cuối cùng, bạn không gán biến sysBright.

sysBright = [[NSUserDefaults standardUserDefaults] floatForKey:@"sysBright"]; 
[[UIScreen mainScreen] setBrightness:sysBright];   
+0

Cảm ơn gợi ý nhưng nó vẫn không hoạt động –

+0

Tôi nghĩ rằng nó không thể làm như bây giờ, nhưng tôi đã thực hiện một giải pháp vô lý liên quan đến một ImageView thiết lập như là một hình chữ nhật màu đen với 0,9 opacity. Làm việc một sự quyến rũ nếu tôi thành thật, chỉ bực bội mà tôi lãng phí rất nhiều thời gian mà không cần tìm một giải pháp liên quan đến [UIScreen setBrightness]; –

+0

Tôi vừa thử nó trong ứng dụng của riêng mình, nó hoạt động rất tốt. Đảm bảo giá trị độ sáng nằm trong khoảng từ 0 đến 1 và là một phao. – Tim

1

Vì phương pháp hiện tại không hoạt động trong phương thức ủy nhiệm ứng dụng, bạn có thể sử dụng UIView như được mô tả bởi Adam.

Thực hiện một lvar UIView trong file đại biểu h:

UIView *view_; 

Sau đó, trong việc thực hiện:

// create view in app delegate didFinishLaunchingWithOptions method and add it to the window 
view_ = [[UIView alloc] initWithFrame:self.window.frame]; // delegate lvar 
[view_ setBackgroundColor:[UIColor blackColor]]; 
[view_ setAlpha:0.5]; 
[self.window addSubview:view_]; 
[self.window makeKeyAndVisible]; 
return YES; 

Tận dụng tối xem kích thước màn hình của bạn hoặc xem điều khiển khi cần thiết. và đảm bảo nó nằm trên tất cả các bản xem trước khác.

Hãy nhớ rằng điều này sẽ có ảnh hưởng đáng kể đến hiệu suất đồ họa của ứng dụng, nhưng trừ khi bạn đang làm điều gì đó điên rồ với giao diện người dùng, nó sẽ không sao.

+0

Vâng, tôi đã chọn nó từ những bình luận của anh ấy, nhưng tôi không muốn làm theo cách đó. Bạn cũng nên làm tốt hơn khi làm nó như một cửa sổ mới ở cấp độ thanh trạng thái hơn là một subview, nếu không bạn có lẽ sẽ phải tiếp tục di chuyển nó đến phía trước tất cả các thời gian! – jrturton

+0

Đó là một hack, tôi biết, nhưng nó hoạt động cho các ứng dụng của tôi. Hy vọng rằng sẽ có một sửa chữa trong tương lai. – TigerCoding

+0

Điều này không giúp được tình trạng của tôi, tôi đang giảm đèn nền để giảm mức sử dụng pin. – progrmr

1

Bạn đã thử đăng ký bộ điều khiển chế độ xem chính của mình (hoặc bất kỳ đối tượng nào như vậy) cho UIApplicationWillResignActiveNotification được gửi sau khi thực hiện applicationWillResignActive?

Điều này sẽ cho bạn cơ hội sửa đổi độ sáng bên ngoài applicationWillResignActive. Không biết liệu phương pháp này có tạo ra sự khác biệt nào không, nhưng việc thử nó sẽ dễ dàng.

Đơn giản chỉ cần gọi:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResign) name:UIApplicationWillResignActiveNotification object:nil]; 

sau đó xác định:

- (void)appWillResign { 
    [[NSUserDefaults standardUserDefaults] floatForKey:@"sysBright"]; 
    [[UIScreen mainScreen] setBrightness:sysBright];   
} 
+0

Ý tưởng hay, nhưng không, cùng một kết quả. Tôi bắt đầu nghĩ rằng câu trả lời chỉ là để gửi một lỗi. Ý tôi là thực sự, những thay đổi độ sáng trong ứng dụng thậm chí không thể ảnh hưởng đến toàn bộ thiết bị - hoặc có thể không. iBooks có cùng một vấn đề. Thay đổi độ sáng trong đó là cài đặt chung. – jrturton

10

tôi đã trả lời một câu hỏi tương tự ở đây: IOS5 setBrightness didn't work with applicationWillResignActive

iOS không có nghĩa là giữ lại trong ứng dụng sáng giá cao. Nó sẽ khôi phục giá trị hệ thống sau khi ứng dụng từ chức hoạt động, thoát, lỗi, vv Vì vậy, chính thức không cần phải làm điều đó trong applicationWillResignActive.

Nhưng nó không hoạt động. Đó là lỗi. Trong thực tế, nó hoạt động nếu bạn cố gắng chuyển sang ứng dụng khác. Thử nhấn nút Home hai lần và độ sáng của bạn biến mất.

Đừng lãng phí thời gian của bạn chỉ gửi báo cáo lỗi tới Apple (Tôi đã làm tốt).

Màn hình mở khóa khôi phục độ sáng hệ thống mặc định. Chỉ cần nhấn nút Nguồn hai lần và mở khóa để khôi phục độ sáng ban đầu.

CẬP NHẬT: Báo cáo lỗi của tôi đã bị đóng vì theo Apple không phải là lỗi. Nó thật quái đảng.

+1

https://devforums.apple.com/thread/139813?start=0&tstart=0 –

+0

Thực hiện báo cáo lỗi. Apple ưu tiên sửa chúng dựa trên số lượng bản sao. Nó cũng giúp nếu bạn giải thích cách sửa lỗi sẽ cải thiện trải nghiệm người dùng. Tôi sẽ nộp lại nó ngay cả khi bạn đóng cửa. – progrmr

+1

Đã sửa lỗi trong iOS 8! – jjxtra

-1

bạn có đồng bộ hóa không?

[[NSUserDefaults standardUserDefaults] synchronize]; 
+0

yeh, không phải vậy –

Các vấn đề liên quan