我有一个条形按钮项,触发一个警告,询问用户是否要拍照或从图书馆中挑选图像。在选择照片库时,我实例化一个UIImagePickerController,以便他们选择一张照片。
我的问题是,在选择图像并解除视图控制器后,应用程序返回原始视图控制器,图像正确显示在插座中,但之前工作的按钮不会触发警报再次选择图像(也不会打印到控制台)。
@IBAction func pickAnImage(sender: AnyObject) {
selectImageSourceAlert()
}
func selectImageSourceAlert() {
let alert = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
let userLibrary = UIAlertAction(title: "Photo Library", style: .Default) {
_ in
self.presentImagePicker(pickerStyle: .PhotoLibrary)
}
let useCamera = UIAlertAction(title: "Camera", style: .Default) {
_ in
let x = UIImagePickerController.isSourceTypeAvailable(.Camera)
print(x)
if x {
self.presentImagePicker(pickerStyle: .Camera)
} else {
print("No camera available")
}
}
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
alert.addAction(userLibrary)
alert.addAction(useCamera)
alert.addAction(cancelAction)
presentViewController(alert, animated: true, completion: nil)
}
func presentImagePicker(pickerStyle style: UIImagePickerControllerSourceType) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = style
imagePicker.allowsEditing = true
self.presentViewController(imagePicker, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
self.dismissViewControllerAnimated(true, completion: nil)
if let image = info["UIImagePickerControllerEditedImage"] as? UIImage {
imagePickerView.image = image
}
}
几天后我仍然无法弄明白。我发现当我删除“if let image = info”位并放弃将图像分配给imagePickerView插座时,该按钮在解除视图控制器后工作。如果在选择图像之前在任何时候取消,该按钮也可以使用。当我将图像分配到插座时,它才起作用。
提前感谢您的帮助!
编辑:我注意到当我在右上角添加第二个按钮并将其指定给同一个动作时,即使在分配照片后也能正常工作。左下角的第一个条形按钮项目仅在没有分配给imageView的图像时才起作用。不确定为什么因为它没有以任何方式覆盖imageView。为清晰起见,添加了红色背景色。答案 0 :(得分:1)
选择图像后,您的工具栏高度为0。 您可以在“调试视图层次结构”中看到这一点。
要解决此问题,只需删除约束“Toolbar.top = Image Picker View.bottom + 192”
答案 1 :(得分:0)
您需要删除此行:
self.dismissViewControllerAnimated(true, completion: nil)
由于图片选择器已经关闭,你真的不需要这个。 此函数将关闭当前视图控制器。
此外,尝试在更新UI对象时使用dispatch_async。
dispatch_async(dispatch_get_main_queue(),
{
if let image = info["UIImagePickerControllerEditedImage"] as? UIImage
{
self.imagePickerView.image = image
}
})