UIImagePicker allowsEditing stuck in center UIImagePicker allowsEditing stuck in center ios ios

UIImagePicker allowsEditing stuck in center


Looks like this behavior is just a bug in iOS 6... Basically you cannot move the editing box, it always bounces back to the middle unless you zoom in a bit. Hopefully they fix that soon.


Thanks yycking. This extension works. Except I added the method call inside viewDidLayoutSubviews so that I don't have to call it every time I want to open image picker.

Here's the full extenstion

extension UIImagePickerController {    open override var childForStatusBarHidden: UIViewController? {        return nil    }    open override var prefersStatusBarHidden: Bool {        return true    }        open override func viewDidLayoutSubviews() {        super.viewDidLayoutSubviews()        fixCannotMoveEditingBox()    }        func fixCannotMoveEditingBox() {            if let cropView = cropView,               let scrollView = scrollView,               scrollView.contentOffset.y == 0 {                                var top: CGFloat = 0.0                if #available(iOS 11.0, *) {                    top = cropView.frame.minY + self.view.safeAreaInsets.top                } else {                    // Fallback on earlier versions                    top = cropView.frame.minY                }                let bottom = scrollView.frame.height - cropView.frame.height - top                scrollView.contentInset = UIEdgeInsets(top: top, left: 0, bottom: bottom, right: 0)                                var offset: CGFloat = 0                if scrollView.contentSize.height > scrollView.contentSize.width {                    offset = 0.5 * (scrollView.contentSize.height - scrollView.contentSize.width)                }                scrollView.contentOffset = CGPoint(x: 0, y: -top + offset)            }                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in                self?.fixCannotMoveEditingBox()            }        }                var cropView: UIView? {            return findCropView(from: self.view)        }                var scrollView: UIScrollView? {            return findScrollView(from: self.view)        }                func findCropView(from view: UIView) -> UIView? {            let width = UIScreen.main.bounds.width            let size = view.bounds.size            if width == size.height, width == size.height {                return view            }            for view in view.subviews {                if let cropView = findCropView(from: view) {                    return cropView                }            }            return nil        }                func findScrollView(from view: UIView) -> UIScrollView? {            if let scrollView = view as? UIScrollView {                return scrollView            }            for view in view.subviews {                if let scrollView = findScrollView(from: view) {                    return scrollView                }            }            return nil        }}


Stupid answer
Reset contentInset of scrollview

extension UIImagePickerController {    func fixCannotMoveEditingBox() {        if let cropView = cropView,           let scrollView = scrollView,           scrollView.contentOffset.y == 0 {                        let top = cropView.frame.minY + self.view.safeAreaInsets.top            let bottom = scrollView.frame.height - cropView.frame.height - top            scrollView.contentInset = UIEdgeInsets(top: top, left: 0, bottom: bottom, right: 0)                        var offset: CGFloat = 0            if scrollView.contentSize.height > scrollView.contentSize.width {                offset = 0.5 * (scrollView.contentSize.height - scrollView.contentSize.width)            }            scrollView.contentOffset = CGPoint(x: 0, y: -top + offset)        }                DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in            self?.fixCannotMoveEditingBox()        }    }        var cropView: UIView? {        return findCropView(from: self.view)    }        var scrollView: UIScrollView? {        return findScrollView(from: self.view)    }        func findCropView(from view: UIView) -> UIView? {        let width = UIScreen.main.bounds.width        let size = view.bounds.size        if width == size.height, width == size.height {            return view        }        for view in view.subviews {            if let cropView = findCropView(from: view) {                return cropView            }        }        return nil    }        func findScrollView(from view: UIView) -> UIScrollView? {        if let scrollView = view as? UIScrollView {            return scrollView        }        for view in view.subviews {            if let scrollView = findScrollView(from: view) {                return scrollView            }        }        return nil    }}

then call it

imagePickercontroller.fixCannotMoveEditingBox()