快照如何干扰父/子关系?

时间:2015-05-29 13:36:51

标签: ios objective-c uiviewcontroller parent-child snapshot

摘要

  1. childVC添加到parentVC
  2. 快照childVC.view
  3. 它的错误。
  4. 为什么?

    情况

    我刚遇到一个奇怪的行为,我想知道它是否正常或是否是一个错误。

    我有一个视图控制器childVC,它是parentVC的孩子。创建父/子关系时,我的代码是

        [parentVC addChildViewController:childVC] ;
        [parentVC.view addSubview:childVC.view] ;
        [childVC didMoveToParentViewController: parentVC] ;
    

    进一步说,我想创建childVC.view的快照。我的代码是

    UIView * view = childVC.view ;
    
    UIGraphicsBeginImageContextWithOptions(view.contentSize, NO, 0);
    {
        [...]
    
        [view drawViewHierarchyInRect:view.bounds
                   afterScreenUpdates:YES];
    
        image = UIGraphicsGetImageFromCurrentImageContext();
    
        [...]
    }
    UIGraphicsEndImageContext();
    

    错误

    然后我有错误:

      

    *由于未捕获的异常终止应用' UIViewControllerHierarchyInconsistency',原因:'子视图   控制器:应该有父   view controller :( null)但是实际的父级是:'   * 第一次抛出调用堆栈:(0 CoreFoundation 0x0260b466 __exceptionPreprocess + 182 1 libobjc.A.dylib
      0x02290a97 objc_exception_throw + 44 2 CoreFoundation
      0x0260b38d + [NSException raise:format:] + 141 3 UIKit
      0x01136710 - [UIView(Hierarchy)   _associatedViewControllerForwardsAppearanceCallbacks:performHierarchyCheck:isRoot:]   + 352 4 UIKit 0x01136b13 - [UIView(Hierarchy)_willMoveToWindow:withAncestorView:] + 285 5 UIKit 0x0114330a - [UIView(Internal)   _addSubview:locate:relativeTo:] + 511 6 UIKit 0x01136252 - [UIView(Hierarchy)addSubview:] + 56 7 UIKit
      0x0114ab0e + [_ UIReplicantView _pendingSnapshotOfTarget:snapshotBlock:]   + 584 8 UIKit 0x011312fe - [UIView drawViewHierarchyInRect:afterScreenUpdates:] + 287

    问题

    为什么会这样?我可以解决这个问题吗?

    更多详情

    实际上,childVC.viewUIScrollView,快照的代码是

    UIScrollView * scrollView = (UIScrollView *)childVC.view;
    
    UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, NO, 0);
    {
        CGPoint savedContentOffset = scrollView.contentOffset;
        CGRect savedFrame = scrollView.frame;
    
        scrollView.contentOffset = CGPointZero;
        scrollView.frame = CGRectMake(0,
                                0,
                                scrollView.contentSize.width,
                                scrollView.contentSize.height);
    
        [scrollView drawViewHierarchyInRect:scrollView.bounds
                   afterScreenUpdates:YES];
    
        image = UIGraphicsGetImageFromCurrentImageContext();
    
        scrollView.contentOffset = savedContentOffset;
        scrollView.frame = savedFrame;
    }
    UIGraphicsEndImageContext();
    

    也许这会产生很大的不同。

3 个答案:

答案 0 :(得分:1)

今天,在使用CREATE FUNCTION func2() RETURNS trigger AS $$ DECLARE value DATE; BEGIN SELECT CURRENT_DATE INTO value; SET NEW.date=value; RETURN NULL; END; $$LANGUAGE plpgsql; CREATE TRIGGER date AFTER UPDATE ON table FOR EACH ROW EXECUTE PROCEDURE func2(); 实现自定义转换时遇到了同样的问题。问题在于,当我尝试对子视图控制器进行快照时,其父控制器还不属于视图层次结构。

解决方案是在尝试为子级创建快照之前,确保已将父级视图添加到视图层次结构中。就我而言,我只需要先将“至”视图控制器添加到UIViewControllerAnimatedTransitioning

从您的代码片段中,我无法确定您何时尝试拍摄快照。但是,如果在transitionContext.containerView之前,则可能无效。

答案 1 :(得分:0)

在使用view.snapshotView(afterScreenUpdates: true)从子视图控制器的视图中删除子视图控制器的视图之前,我遇到了崩溃。

对我来说,将false传递给afterScreenUpdates解决了这个问题。

答案 2 :(得分:-1)

也许您的父视图控制器被取消分配,因此异常消息中的(null)