2016-12-21 24 views
6

Ứng dụng mà tôi đang thực hiện chạy trên cả iPhone & iPad. Một trong những chức năng mà ứng dụng có, là chụp ảnh từ máy ảnh. Tôi đang sử dụng UIImagePickerController cho chức năng này. Đây là khối mã của tôi;Ứng dụng bị đóng băng khi cố gắng trình bày camera sau trên iPad

self.imagePicker.sourceType = .camera    
self.imagePicker.cameraCaptureMode = .photo 
self.present(self.imagePicker, animated: true, completion: nil) 

Ứng dụng hoạt động như được thiết kế trong iPhone bao giờ tôi chạy cùng một mã trên iPad mà ứng dụng bị treo. Vấn đề này chỉ xảy ra trong iPad nhưng chỉ dành cho camera phía sau. Nếu tôi chọn camera phía trước từ bộ chọn hình ảnh, ứng dụng sẽ khởi động camera, nhưng nó sẽ đóng băng khi tôi nhấn nút camera chuyển đổi.

Theo như tôi hiểu từ sự cố nhật ký xảy ra khi ứng dụng đang cố gắng vẽ máy ảnh.

Logs:

2016-12-20 20:10:33.708816 Ronin[681:148977] CGContextAddPath: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. 
Dec 20 20:10:33 Ronin[681] <Error>: CGContextAddPath: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. 
2016-12-20 20:10:33.708925 Ronin[681:148977] clip: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. 
Dec 20 20:10:33 Ronin[681] <Error>: clip: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. 
2016-12-20 20:10:33.708991 Ronin[681:148977] CGContextSetFillColorWithColor: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. 
Dec 20 20:10:33 Ronin[681] <Error>: CGContextSetFillColorWithColor: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. 
2016-12-20 20:10:33.709047 Ronin[681:148977] CGContextFillRects: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. 
Dec 20 20:10:33 Ronin[681] <Error>: CGContextFillRects: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. 

iPad mà tôi đang sử dụng để thử nghiệm là: iPad Air 2 - iOS 10,2

EDIT

UIImagePickerController.isSourceTypeAvailable (.camera) mã khối trả về đúng cho trường hợp thử nghiệm của tôi. Tôi đã thêm điều khiển này nhưng chưa đề cập đến trước đây.

Ngoài ra tôi đã nhận thấy rằng khi ứng dụng bị đóng băng, mức tiêu thụ bộ nhớ bắt đầu tăng và ứng dụng cùng một điểm bị lỗi do sử dụng quá nhiều bộ nhớ.

Ngoài ra, tôi đã tạo một dự án trống và thực hiện phương pháp tương tự để chụp ảnh, hoạt động như được thiết kế trong dự án trống. Tại thời điểm này những gì tôi nghĩ là vấn đề này có thể có liên quan với một số thiết lập dự án.

EDIT - 2

tôi thêm breakpoint mang tính biểu tượng cho CGPostError, đây là stacktrace:

enter image description here

Nó có vẻ như bối cảnh hợp lệ gửi đến UIProgressView là lý do cho vấn đề này.

Mọi trợ giúp sẽ được đánh giá cao.

EDIT - 3

Như tôi đã đề cập trước khi tôi làm kiểm tra UIImagePickerController.isSourceTypeAvailable (.camera) trong khối mã của tôi, vấn đề không liên quan với tính sẵn sàng máy ảnh. Ngoài ra máy ảnh hoạt động như popover khi tôi trình bày nó một cách bình thường.

+0

Bạn đang gọi mã của bạn trên chủ đề chính? Trong ảnh chụp màn hình theo dõi ngăn xếp của bạn, tôi không thấy dấu vết mã của bạn trên chuỗi chính. –

+0

Có, tôi thực sự trình bày bộ chọn hình ảnh bằng nút điều hướng, nhấp vào @MihaiFratu –

+0

Có thể là sự cố liên quan đến phiên bản iOS trên toàn hệ thống, có nghĩa là chương trình cơ sở iPad Air 2 iOS 10.2 có lỗi không? –

Trả lời

2

Cuối cùng tôi giải quyết được vấn đề,

tôi thực hiện một cách tiếp cận Theme cho tất cả các ứng dụng. Trong tệp AppDelegate của tôi, tôi đã đặt cài đặt giao diện người dùng trong khi ứng dụng đang được khởi chạy.

Dưới đây là vấn đề,

Có một UISlider trong giao diện người dùng máy ảnh, xem thanh trượt này luôn có thể nhìn thấy trong máy ảnh phía sau iPad nhưng trong iPhone chỉ hiển thị khi bạn đang sử dụng zoom.

UISlider.appearance().minimumTrackTintColor = themeUI.PrimaryColor.withAlphaComponent(100) 
    UISlider.appearance().thumbTintColor = themeUI.PrimaryColor 

Hai dòng này thay đổi giao diện cho tất cả các thanh trượt trong ứng dụng, điều đó có nghĩa là nó cũng thay đổi giao diện người dùng cho thanh trượt camera.

Như bạn có thể nhìn thấy ở ảnh chụp màn hình mà tôi được cấp, trong khi vẽ thư viện CoreGraphics camera gọi

[UISlider setMinimumTrackTintColor]; 

Bằng cách nào đó thiết lập minimumTrackTintColor cho thanh trượt được gây ra lỗi bối cảnh hợp lệ.

thiết Ngoài ra thumTintColor hoạt động tốt, nó cũng được thay đổi màu sắc ngón tay cái cho UISlider trong Máy ảnh :)

Có lẽ vấn đề này có liên quan với Swift 3, tôi sẽ báo cáo một lỗi và chúng ta sẽ thấy :)

4

Bạn nên kiểm tra camera có sẵn hay không:

if UIImagePickerController.isSourceTypeAvailable(.camera) { 
    // Implement UIImagePickerController 
} else { 
    // Show error message 
} 
1

Đây là cách bạn có thể thiết lập một biến môi trường: https://stackoverflow.com/a/31874419/3724800

Và đây là đoạn code tôi sử dụng để mở camera trong một ứng dụng toàn cầu:

if UIImagePickerController.isSourceTypeAvailable(.camera) { 
      let imagePicker = UIImagePickerController() 
      imagePicker.delegate = self 
      imagePicker.sourceType = .camera; 
      imagePicker.allowsEditing = false 
      present(imagePicker, animated: true, completion: nil) 
} 
1

Thay thế mã của bạn với điều này:

Swift 3

if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) 
    { 
     let imagePicker:UIImagePickerController = UIImagePickerController() 
     imagePicker.delegate = self 
     imagePicker.sourceType = UIImagePickerControllerSourceType.camera 
     imagePicker.allowsEditing = true 
     self.present(imagePicker, animated: true, completion: nil) 
    } 
    else 
    { 
     let alert:UIAlertController = UIAlertController(title: "Camera not available", message: "Unable to find a camera on this device", preferredStyle: UIAlertControllerStyle.alert) 
     self.present(alert, animated: true, completion: nil) 
    } 

Swift 2

if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) 
    { 
      let imagePicker:UIImagePickerController = UIImagePickerController() 
      imagePicker.delegate = self 
      imagePicker.sourceType = UIImagePickerControllerSourceType.Camera 
      imagePicker.allowsEditing = true 
     self.presentViewController(imagePicker, animated: true, completion: nil) 
    } 
    else 
    { 
      let alert:UIAlertController = UIAlertController(title: "Camera not available", message: "Unable to find a camera on this device", preferredStyle: UIAlertControllerStyle.Alert) 
      self.presentViewController(alert, animated: true, completion: nil) 
    } 
Các vấn đề liên quan