标签: uipresentationcontroller

了解crashlytics UIKit错误

我无法理解我收到的UIKit崩溃报告:

有没有办法找出导致这个问题的代码行:

Crashed: com.apple.main-thread
0  UIKit                          0x195694264 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 444
1  UIKit                          0x1955d0950 _runAfterCACommitDeferredBlocks + 292
2  UIKit                          0x1955c29ec _cleanUpAfterCAFlushAndRunDeferredBlocks + 528
3  UIKit                          0x195336648 _afterCACommitHandler + 132
4  CoreFoundation                 0x18f1c09a8 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
5  CoreFoundation                 0x18f1be630 __CFRunLoopDoObservers + 372
6  CoreFoundation                 0x18f1bea7c __CFRunLoopRun + 956
7  CoreFoundation                 0x18f0eeda4 CFRunLoopRunSpecific + 424
8  GraphicsServices               0x190b58074 GSEventRunModal + 100
9  UIKit                          0x1953a9058 UIApplicationMain + 208
10 FlexConnect                    0x1001b48c8 main (AppDelegate.swift:20)
11 libdyld.dylib                  0x18e0fd59c start + 4
Run Code Online (Sandbox Code Playgroud)

错误本身是:

崩溃:com.apple.main-thread

EXC_BAD_ACCESS KERN_INVALID_ADDRESS …
Run Code Online (Sandbox Code Playgroud)

uikit swift uipresentationcontroller swift3

8
推荐指数
1
解决办法
358
查看次数

使用UIPresentationController自动布局

我正在进行子类化UIPresentationController以创建弹出窗口的自定义演示文稿/转换UIViewController.弹出视图本身应该被限制在呈现视图控制器的框架中.我可以用手动框架计算来完成它,但在我看来它会非常繁琐且容易出错.

看看UIPresentationController它的API 看起来强烈强制使用CGSize's和CGRect's并坚持让你混合和匹配'准自动布局'方法systemlayoutSizeFitting和其他人一样,并且完全令人困惑.我不知道哪些方法需要被覆盖,何时存在视图,何时添加它们,哪些覆盖返回值优先于其他返回值.它基本上是一场噩梦.

如果有的话,最简单的方法是使用我在这个API中使用的传统的基于约束的布局?

uiviewcontroller uikit uiviewanimationtransition autolayout uipresentationcontroller

8
推荐指数
0
解决办法
320
查看次数

iOS 8:将具有模糊效果的UIVisualEffectView应用于紧凑模式下的模态PopOver

我试图像2014年的WWDC会议214那样制作一个popover.

所以我开始使用具有两个视图的IB构建我的应用程序,这两个视图通过"Present As Popover"segue连接,如下:

在此输入图像描述 弹出视图包含一个填充其超级视图的文本视图,具有以下约束: 在此输入图像描述

为了支持模态popover,可以使用以下代码:

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
    return .OverFullScreen
}

func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {

    let navigationController = UINavigationController(rootViewController: controller.presentedViewController)
    controller.presentedViewController.navigationItem.setRightBarButtonItem(UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: "done"), animated: true)

    return navigationController
}
Run Code Online (Sandbox Code Playgroud)

这给了我以下结果: 在此输入图像描述

然后我尝试添加具有模糊效果的UIVisualEffectView.起初我只是在显示的控制器视图中添加一个子视图,在检查了视图层次结构后,我意识到我的效果视图实际上是在我的文本视图之上,但是我的文本视图被正确放置了.所以我尝试了insertSubview:atIndex:这样的方法:

func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {

    let effectView = UIVisualEffectView(effect: UIBlurEffect(style: .Light)) as UIVisualEffectView
    effectView.setTranslatesAutoresizingMaskIntoConstraints(false)
    controller.presentedViewController.view.insertSubview(effectView, atIndex: 0)

    let viewList : [String : UIView] = ["effectView" : effectView]

    let navigationController = UINavigationController(rootViewController: controller.presentedViewController)
    controller.presentedViewController.navigationItem.setRightBarButtonItem(UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, …
Run Code Online (Sandbox Code Playgroud)

popover swift ios8 uivisualeffectview uipresentationcontroller

7
推荐指数
1
解决办法
1790
查看次数

在使用转换时替换UIWindow的rootViewController似乎正在泄漏

环境
iOS 9.2
Xcode 7.2

我想用动画替换UIWindow的rootViewController,同时也从视图层次结构中删除它.

class FooViewController: UIViewController
{
}

class LeakedViewController: UIViewController
{
}
Run Code Online (Sandbox Code Playgroud)

然后简单地在AppDelegate中启动转换

    self.window!.rootViewController = LeakedViewController()

    let fooViewController = FooViewController()

    self.window!.rootViewController?.presentViewController(fooViewController, animated: true){ unowned let window = self.window!
        window.rootViewController = fooViewController
    }
Run Code Online (Sandbox Code Playgroud)

在Instruments中对此进行分析,请注意rootViewController仍在内存中.

在此输入图像描述

还遇到了这个错误报告,它似乎表明iOS 8.3中存在同样的问题并且仍然是Open.

未能找到任何建议作为其中一部分的建议

UIViewController.presentViewController(animated:completion:) 
Run Code Online (Sandbox Code Playgroud)

所述源视图控制器被保留(最可能由UIPresentationController?),或者如果这是一个错误.请注意,UIPresentationController最初是在iOS 8中引入的.

如果这是设计,是否有一个选项来释放源视图控制器?

使用UIPresentationController的子类

override func shouldPresentInFullscreen() -> Bool {
    return true
}

override func shouldRemovePresentersView() -> Bool {
    return true
}
Run Code Online (Sandbox Code Playgroud)

似乎没有任何区别.无法在SDK中找到任何其他内容.

目前,我已经找到了唯一的方法是使用一个UIViewController,与目前什么是在屏幕上,在地方根视图控制器正在过渡之前的快照.

    let fooViewController = FooViewController()

    let view = …
Run Code Online (Sandbox Code Playgroud)

xcode memory-leaks instruments ios uipresentationcontroller

7
推荐指数
2
解决办法
2835
查看次数

在不改变状态栏颜色的情况下呈现视图控制器,如UIAlertController

在执行某些网络操作时,我提供了一个模态视图控制器(类似于MBProgressHUD但作为视图控制器)以防止用户交互并指示进度.

视图控制器modalPresentationStyle = .Custom使用转换委托和自定义演示控制器进行动画处理.除了动画转换动画之外,它们没有自定义动作来驱动演示文稿.

我遇到的问题是,无论何时出现视图控制器,它都会将状态栏颜色变为黑色.我可以覆盖preferredStatusBarStyle以使其始终返回.LightContent但有时这个视图控制器呈现在视图控制器上.Default,我也不想在那里更改它.基本上,我想要有相同的行为UIAlertController.

屏幕截图显示呈现的视图控制器导致黑暗状态栏内

我已尝试配置演示控制器以将呈现的视图控制器移出状态栏空间:

private class SEUIProgressControllerPresentationController: UIPresentationController {

    override func shouldPresentInFullscreen() -> Bool {
        return false
    }

    private override func frameOfPresentedViewInContainerView() -> CGRect {
        return super.frameOfPresentedViewInContainerView().insetBy(dx: 40, dy: 100)
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

这些设置会将显示控制器的顶部移出状态栏,但状态栏仍会受到影响.是否有我失踪的属性会阻止我的视图控制器更新状态栏样式?

ios uistatusbar presentviewcontroller swift uipresentationcontroller

7
推荐指数
1
解决办法
3289
查看次数

在presetentation演示之前失去对transitioningDelegate的引用

我在Xcode beta 2和iOS 10 beta 2之前有一个工作的自定义UIPresentationController.我没有更改任何代码,但现在正在呈现标准模式演示文稿.

UIPresentationController的Apple示例代码中有一条说明:

对于将使用自定义演示控制器的演示文稿,该演示控制器也可以是transitioningDelegate.这避免了在源视图控制器中引入另一个对象或实现.

transitioningDelegate没有对其目标对象的强引用.为了防止在调用-presentViewController之前释放presentationController:animated:completion:NS_VALID_UNTIL_END_OF_SCOPE属性被附加到声明中.

我在演示之前和之后检查了呈现的视图控制器上的transitioningDelegate.在它是我的自定义UIPresentationController之前,但它之后是零.我的猜测是该引用正在发布,但我在Swift中找不到与NS_VALID_UNTIL_END_OF_SCOPE等效的内容.编辑:我已经验证过transitioningDelegate是在演示之前设置的,然后是时候呈现的nil.

我在呈现视图控制器中的代码:

@IBAction func buttonAction(_ sender: UIButton) {
    let secondViewController = storyboard!.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController
    let presentationController = MyPresentationController(presentedViewController: secondViewController, presenting: self)
    presentationController.initialFrame = button.frame
    secondViewController.transitioningDelegate = presentationController

    // Move map
    let pixelsToMove: CGFloat = mapView.frame.height / 4
    let region = self.mapView.region

    self.mapView.setRegion(region, offsetBy: pixelsToMove, animated: true)

    // Delegate to NewViewController
    secondViewController.mapView = mapView
    mapView.delegate = secondViewController

    print(secondViewController.transitioningDelegate)
    UIView.animate(withDuration: 0.3, animations: {
        let tabBar = self.tabBarController!.tabBar
        tabBar.frame.origin.y += tabBar.frame.height …
Run Code Online (Sandbox Code Playgroud)

uiviewcontroller ios swift uipresentationcontroller xcode8-beta2

7
推荐指数
2
解决办法
1173
查看次数

应用程序在runTransitionForCurrentState上崩溃,但没有任何关于原因的线索

我试过寻找这个,但没有运气,所以希望有一些大师可能知道答案.

我看到我的应用程序的iTunes Connect中的大量报告与特定的堆栈跟踪崩溃,但堆栈跟踪显示没有任何用处.

#0. Crashed: main
0  UIKit                          0x1871100c0 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 324
1  UIKit                          0x1871100bc __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 320
2  UIKit                          0x1870630c8 _runAfterCACommitDeferredBlocks + 292
3  UIKit                          0x187070a80 _cleanUpAfterCAFlushAndRunDeferredBlocks + 92
4  UIKit                          0x186da25a4 _afterCACommitHandler + 96
5  CoreFoundation                 0x181c0c728 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
6  CoreFoundation                 0x181c0a4cc __CFRunLoopDoObservers + 372
7  CoreFoundation                 0x181c0a8fc __CFRunLoopRun + 928
8  CoreFoundation                 0x181b34c50 CFRunLoopRunSpecific + 384
9  GraphicsServices               0x18341c088 GSEventRunModal + 180
10 UIKit                          0x186e1a088 UIApplicationMain + 204
11 MyApp                          0x100082e6c main (main.m:19)
12 …
Run Code Online (Sandbox Code Playgroud)

objective-c crash-reports uikit ios uipresentationcontroller

7
推荐指数
1
解决办法
3638
查看次数

通过UIPresentationController子类呈现视图控制器时跳转导航栏

我正在构建一个iOS 8应用程序并使用UIPresentationController以自定义方式呈现视图控制器.(请参阅我之前关于此的问题:复制iOS Mail App的撰写功能的样式).

我遇到的问题是,当我呈现控制器时,导航栏以64点高开始,然后在演示完成后跳转/缩小回44.我的猜测是视图控制器意识到它没有覆盖状态栏,因此一旦到达其最终静止位置,它就会自行缩小.我希望导航栏在整个时间内高44点,而不是跳/缩.

下图是视图控制器在演示结束时的样子.这也是我希望它看起来像整个时间.有关如何将导航栏保持在44点整个时间的任何想法?

在此输入图像描述

更新(2015年3月24日):

我前一段时间引用了一篇博文,以找到有关此问题的更多信息.基本上,UINavigationController将其导航栏绘制为64或44点高,具体取决于其视图的框架是否与应用程序的窗口匹配.所以我需要一些方法告诉导航控制器它的最终静止位置不会与窗口对齐,并且导航栏应该被绘制44点高.

http://blog.jaredsinclair.com/post/61507315630/wrestling-with-status-bars-and-navigation-bars-on

objective-c uinavigationcontroller ios uipresentationcontroller

6
推荐指数
1
解决办法
2548
查看次数

当另一个视图控制器显示在其上时,UIPresentationController会更改大小

我正在使用UIPresentationController呈现模态视图控制器.我使用以下方法设置presentView的框架小于containsView的边界:

override func frameOfPresentedViewInContainerView() -> CGRect {
    let myDX = (self.containerView!.bounds.width - 600)/2
    let myDY = (self.containerView!.bounds.height - 600)/2
    return self.containerView!.bounds.insetBy(dx: myDX, dy: myDY)
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好.

现在,我在当前显示的模式视图控制器顶部呈现另一个视图控制器(默认不是自定义),它占用整个屏幕.所以,我在默认模态视图控制器下面有一个自定义模态视图控制器,覆盖整个屏幕.

问题是当我关闭覆盖整个屏幕的顶视图控制器时,我的自定义视图控制器也显示覆盖整个屏幕.我希望我的自定义视图控制器的大小保持不变(小于containerView).有什么方法可以实现这一点.

任何帮助,将不胜感激

uikit uikit-transitions ios8 uipresentationcontroller uitraitcollection

6
推荐指数
1
解决办法
1591
查看次数

UIPresentationController - 我可以在演示后更新呈现的视图控制器的帧吗?

我正在使用自定义UIPresentationController子类来管理UIViewController的表示.我重写- (CGRect)frameOfPresentedViewInContainerView提供一个从containerView的边界插入的框架.

现在,在对presentViewController进行一些用户操作之后,我想更改presentViewController的框架.我的问题是:有一种'自然'的方法吗?

如何在呈现后调整presentViewController的框架?

ios uipresentationcontroller

6
推荐指数
1
解决办法
1325
查看次数