ユーザーが通話中かテザリング中かを検出するにはどうすればよいですか?私はこのようなiAdのサブビューを持っています:
_UIiAD = [[self appdelegate] UIiAD];
_UIiAD.delegate = self;
[_UIiAD setFrame:CGRectMake(0,470,320,50)];
[self.view addSubview:_UIiAD];\
そして、それはユーザーが電話をしているときにそれを間違って設定しますか?これを検出するにはどうすればよいですか?
UIApplicationDelegate
には次の2つの方法があります。
// ObjC
- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame; // in screen coordinates
- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame;
// Swift
func application(_ application: UIApplication, willChangeStatusBarFrame newStatusBarFrame: CGRect)
func application(_ application: UIApplication, didChangeStatusBarFrame oldStatusBarFrame: CGRect)
そして、Notifications
もあります。
//ObjC
UIApplicationWillChangeStatusBarFrameNotification
UIApplicationDidChangeStatusBarFrameNotification
// Swift
Notification.Name.UIApplicationWillChangeStatusBarFrame
Notification.Name.UIApplicationDidChangeStatusBarFrame
ただし、アプリのリリース時に投稿されていないため、お勧めしません。
シミュレータには、それをテストするための便利なツールがあります。
ハードウェア->通話中ステータスバーの切り替え(⌘Y)
これらのメソッドをAppDelegate
ファイルに実装することをお勧めします。ステータスバーの高さが変わると呼び出されます。そのうちの1つは変更前に呼び出され、もう1つは変更後に呼び出されます。
変更が発生したときにViewController
に通知することを希望する場合、1つのオプションは、通知を送信することです。このような
まず、このプロパティ/変数をAppDelegate
に追加します
// ObjC
@property (assign, nonatomic) CGRect currentStatusBarFrame;
// Swift
var currentStatusBarFrame: CGRect = .zero
次に、willChangeStatusBarFrame
を実装します
// ObjC
- (void) application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
{
self.currentStatusBarFrame = newStatusBarFrame;
[[NSNotificationCenter defaultCenter] postNotificationName:@"Status Bar Frame Change"
object:self
userInfo:@{@"current status bar frame": [NSValue valueWithCGRect:newStatusBarFrame]}];
}
// Swift
func application(_ application: UIApplication, willChangeStatusBarFrame newStatusBarFrame: CGRect) {
currentStatusBarFrame = newStatusBarFrame
NotificationCenter.default.post(
name: NSNotification.Name(rawValue: "Status Bar Frame Change"),
object: self,
userInfo: ["current status bar frame": newStatusBarFrame])
}
そして、Status Bar Frame Checker
のベースが完成しました。ステータスバーフレームを知る必要があるViewController
に実装する次の部分。
ステータスバーフレームを取得したいときはいつでもそうします
// ObjC
[(AppDelegate*)[[UIApplication sharedApplication] delegate] currentStatusBarFrame]
// Swift
(UIApplication.shared.delegate as! AppDelegate).currentStatusBarFrame
また、変更時に通知を受け取るには、これをViewDidLoad
メソッドに追加します。
ObjCで
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(statusBarFrameChanged:)
name:@"Status Bar Frame Change"
object:[[UIApplication sharedApplication] delegate]];
そして、このメソッドを実装します
- (void) statusBarFrameChanged:(NSNotification*)notification
{
CGRect newFrame = [[notification.userInfo objectForKey:@"current status bar frame"] CGRectValue];
NSLog(@"new height %f", CGRectGetHeight(newFrame));
}
Swiftで
NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "Status Bar Frame Change"),
object: nil,
queue: nil) { (note) in
guard let currentStatusBarFrame = note.userInfo?["current status bar frame"] as? CGRect else {return}
print("New Height", currentStatusBarFrame.height)
}
ステータスバーに問題があり、ビューが下にシフトしていると思います。以下のコードを使用してそれを解決できます
Swiftで
self.tabBarController?.tabBar.autoresizingMask = UIViewAutoresizing(rawValue: UIViewAutoresizing.RawValue(UInt8(UIViewAutoresizing.flexibleWidth.rawValue) | UInt8(UIViewAutoresizing.flexibleTopMargin.rawValue)))
これにより、ユーザーが通話中のステータスバーが原因で発生する問題が解決しました。 Objective Cリファレンスの場合 ここをクリック