我试图理解__CODE__与a关联的方式__CODE__,__CODE__或者__CODE__在切换通话状态栏时做出反应.
我的麻烦是它们看起来表现不同,这会引起我的副作用.
我做了一个项目,改变了上面3种类型的窗口的根视图控制器,我转储__CODE__了__CODE__以获取框架坐标.
__CODE__
inCall状态OFF:
__PRE__上
__PRE__
我理解这一点:当出现在通话状态栏时,UIViewController的视图宽度收缩并且松散20,其y坐标从20移动到40.
那很完美 !更换一个经典的时候我会想到同__CODE__一个__CODE__或一个__CODE__,但事实并非如此!
__CODE__

InCall状态栏OFF
__PRE__上
__PRE__
在这种情况下,当切换通话中状态栏时,UINavigationController处理的视图没有更改其帧属性?!(为什么?:()
__CODE__
关闭
__PRE__上
__PRE__
相同的__CODE__:对__CODE__的__CODE__似乎并没有受到影响,当门店状态栏切换.
有人可以解释一下,当显示incall状态栏时,此调整大小是如何工作的吗?
我的最终目标是显示__CODE__所显示高于整体__CODE__并显示在通话状态时适当调整大小.不过,我真的不知道该往哪里放这样的观点在视图层次结构:如果我将其添加为的UITabBarController的视图的孩子,因为这一个不向门店状态显示的反应,我的没有反应,以及: (
我正在开展一个项目,要求我的应用程序能够在活动呼叫期间在语音的上行链路频率上发送DTMF音调.
我的两个条件是:
我花了几天时间做作业,并且我知道当前的SDK /标准API不支持通话中的DTMF发送.但是,通过使用相关的类com.android.internal.telephony我希望模仿本机Phone应用程序如何做到这一点.我在网站上关注如何使用标准第三方应用程序的内部API.
我还设置了Android OS开发环境,并且能够在模拟器上以调试模式运行Phone应用程序以确定其内部工作方式.
我在股票标准模拟器上尝试了各种方法,但我得到的错误是:
尝试使用android.uid.phone的sharedUserId基于Phone.apk的源安装重命名的应用程序后,我得到:
安装错误:INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
毫无疑问,由于我没有系统证书来签署它.
在尝试根据Phone.apk来源的相关DTMF音调发送代码编写自定义应用程序后,在设置PhoneFactory时出现以下错误;
java.lang.SecurityException:Permission Denial:不允许发送广播android.provider.Telephony.SPN_STRINGS_UPDATED.
毫无疑问,由于Android应用程序没有正确的权限,尽管AndroidManifest.xml设置的权限与Phone.apk相同.
我不知道还能尝试什么.有没有人有什么建议?
先谢谢,西蒙.
如何检测用户是在通话还是网络共享?我有这样的iAd子视图:
_UIiAD = [[self appdelegate] UIiAD];
_UIiAD.delegate = self;
[_UIiAD setFrame:CGRectMake(0,470,320,50)];
[self.view addSubview:_UIiAD];\
Run Code Online (Sandbox Code Playgroud)
当用户通话时,它设置错误了吗?我怎么检测到这个?
问题:
在调用状态栏消失后,模态呈现的视图控制器不会向上移动,在顶部留下20px空/透明空间.
正常:没有问题
在电话:没有问题
在呼叫消失后:
在顶部留下20px高的空/透明空间,露出下面的橙色视图.但是,状态栏仍然存在于透明区域上方.导航栏还为状态栏留出空间,它的位置只有20px太低.
我试着听App代表:
willChangeStatusBarFrame
didChangeStatusBarFrame
Run Code Online (Sandbox Code Playgroud)
还可以查看基于控制器的通知:
UIApplicationWillChangeStatusBarFrame
UIApplicationDidChangeStatusBarFrame
Run Code Online (Sandbox Code Playgroud)
当我为所有上述四种方法记录呈现视图的帧时,帧始终位于(y:0)原点.
查看控制器自定义模式演示
let storyboard = UIStoryboard(name: "StoryBoard1", bundle: nil)
self.modalVC = storyboard.instantiateViewController(withIdentifier: "My Modal View Controller") as? MyModalViewController
self.modalVC!.transitioningDelegate = self
self.modalVC.modalPresentationStyle = .custom
self.modalVC.modalPresentationCapturesStatusBarAppearance = true;
self.present(self.modalVC!, animated: true, completion: nil)
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let containerView = transitionContext.containerView
let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)
let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)
toViewController!.view.transform = CGAffineTransform(scaleX: 0.001, …Run Code Online (Sandbox Code Playgroud) 我有一个UIViewController呈现另一个UIViewController.两个视图控制器都使用topLayoutGuide和bottomLayoutGuide使用自动布局.
一切都很好,有和没有通话栏.或者有或没有自定义过渡...
但是,当存在调用栏和自定义转换时,我呈现的视图控制器的子视图错误地放下了20px(导致底部的剪切视图).
我查了一下topLayoutGuide,bottomLayoutGuide这是错误的......
这是过渡的代码:
#pragma mark - GETTER
- (CGFloat)presentationTopProgressValue {
return __fromViewControllerView.y / __containerView.height;
}
#pragma mark - SETTER
- (void)set_context:(id<UIViewControllerContextTransitioning>)_context {
__context = _context;
__containerView = [__context containerView];
__fromViewController = [__context viewControllerForKey:UITransitionContextFromViewControllerKey];
__fromViewControllerView = [__fromViewController view];
__toViewController = [__context viewControllerForKey:UITransitionContextToViewControllerKey];
__toViewControllerView = [__toViewController view];
}
#pragma mark - TRANSITION
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
return self;
}
#pragma mark …Run Code Online (Sandbox Code Playgroud) 这里有很多问题要求在后台显示红色记录条.很明显我应该使用AVAudioSession类别AVAudioSessionCategoryPlayAndRecord.我的问题是,在我的应用程序中进行有效的VOIP呼叫时,如何在前台应用程序中显示绿色的通话栏(或至少红色条)?所以我可以回到调用UI点击状态栏区域,就像Whatsapp或Skype一样.
我已经尝试过的:
voip在这个SO答案中建议的Info.plist + + audio中的UIBackgroundModes键和模式(在进行背景时给我一个红色状态栏,但在前景时没有任何内容)setCategory:AVAudioSessionCategoryPlayAndRecordsetActiveAVAudioSession+ setMode:AVAudioSessionModeVoiceChat- 没有用kCFStreamNetworkServiceTypeVoIP在pjsip源中将标志设置为套接字并重新编译它 - 没有帮助.此外,自iOS 8以来已弃用.[self.inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType]从这里获取示例代码)使用pjsip进行通话.还有什么可以尝试增加状态栏高度,将所有UI移动?有没有任何标准方法可以做到这一点,或者我应该通过调整根UIWindow并在状态栏下设置另一个绿色UIWindow来自行破解它?
编辑:由于没有找到标准方法的答案,接受@ roman-ermolov答案.对于那些会寻找答案的人,我可以建议您自己做几个选择:
我有能力提出这个问题,因为经过大量的研究,几乎2天的谷歌搜索,Stack Overflowing等......
我的问题是:我从我的主ViewController呈现ViewController,如下所示:
UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:VController];
navigation.transitioningDelegate = self;
navigation.modalPresentationStyle = UIModalPresentationCustom;
[self presentViewController:navigation
animated:YES
completion:nil];
Run Code Online (Sandbox Code Playgroud)
无论何时iPhone用户正在通话,或者正在使用他或她的手机作为热点,状态栏都会被放大,将我的模拟显示VC推到底部,但原点设置为(0; 0)问题是用户在完成呼叫期间他在我的应用程序状态栏调整到正常大小,但Modal VC没有向上移动.

感谢此通知,我在代码中发现了解这一点:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statuBarChange:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];
Run Code Online (Sandbox Code Playgroud)
最糟糕的是框架是核心,原点仍然是(0,0)
有没有办法反映模态提出的vc?没有解雇并再次提出它?
in-call ×7
ios ×5
statusbar ×4
autolayout ×2
android ×1
dtmf ×1
internal ×1
iphone ×1
pjsip ×1
swift ×1
telephony ×1
transitions ×1
uistatusbar ×1
voip ×1