我的iOS应用程序使用自定义高度UINavigationBar导致新iPhone X上出现一些问题.
如果应用程序在iPhone X上运行,是否有人已经知道如何以编程方式(在Objective-C中)进行可靠检测?
编辑:
当然,检查屏幕的大小是可能的,但是,我想知道是否有一些"内置"方法,如TARGET_OS_IPHONE检测iOS ...
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
if (screenSize.height == 812)
NSLog(@"iPhone X");
}
Run Code Online (Sandbox Code Playgroud)
编辑2:
我不认为,我的问题是链接问题的重复.当然,有一些方法可以"测量"当前设备的不同属性,并使用结果来决定使用哪个设备.然而,这不是我的问题的实际问题,因为我在第一次编辑时试图强调.
实际的问题是:"是否可以直接检测当前设备是否是iPhone X(例如,通过某些SDK功能)或者我是否必须使用间接测量"?
到目前为止给出的答案,我认为答案是"不,没有直接的方法.测量是要走的路".
在我的UITableViewController中,我有一个自定义单元格,其中包含一个切换器,如下所示:
import Foundation
import UIKit
class SwitchCell: UITableViewCell {
@IBOutlet weak var label : UILabel!
@IBOutlet weak var switchEmail : UISwitch!
func setEditable(canEdit:Bool) {
if (canEdit) {
self.switchEmail.enabled = true
self.label.highlighted = false
}
else {
self.switchEmail.enabled = false
self.label.highlighted = true
}
}
func configureCellWithSwitch(labelText:String, switchValue:Bool, enabled:Bool) {
var labelFrame:CGRect = self.label.frame
labelFrame.size.height = Settings.labelHeight
self.label.frame = labelFrame
self.label.text = labelText
if (switchValue) {
self.switchEmail.setOn(true, animated: true)
}
else {
self.switchEmail.setOn(false, animated: true)
}
self.setEditable(enabled)
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何实现切换器的侦听器/委托,以便从UITableViewController获取其值.我能够为UITextField和UITextView实现这些方法的单元格编写委托/监听器
func …Run Code Online (Sandbox Code Playgroud) 我必须在iPad上更改音量并使用以下代码:
[[MPMusicPlayerController applicationMusicPlayer] setVolume:0];
Run Code Online (Sandbox Code Playgroud)
但这种不断变化的音量和显示iPad上的系统音量条.如何在不显示音量条的情况下改变声音?
我知道,setVolume:已被弃用,并且每个人都说要使用MPVolumeView.如果这是解决我的问题的唯一方法,那么如何使用MPVolumeView?我没有看到任何MPVolumeView改变声音的方法.
我应该和另一个班级一起使用MPVolumeView吗?
但它最好使用MPMusicPlayerController.
谢谢你的建议!
我有一个使用故事板构建的UITextField.我想不允许用户更改光标的位置,并将其始终保留在文本末尾的文本字段中.
我尝试在触地事件中更改光标的位置,但是当选择文本字段然后再次触摸文本字段来更改光标的位置时,位置会更改:
- (IBAction)amountBoxTouchDown:(id)sender {
UITextPosition *start = [amountBox positionFromPosition:[amountBox beginningOfDocument] offset:amountBox.text.length];
UITextPosition *end = [amountBox positionFromPosition:start
offset:0];
[amountBox setSelectedTextRange:[amountBox textRangeFromPosition:start toPosition:end]];
}
Run Code Online (Sandbox Code Playgroud)
有谁知道解决方案?谢谢
我正在尝试在Swift中编写一个小扩展来处理UIViewController故事板中的实例化.
我的想法如下:由于UIStoryboard方法instantiateViewControllerWithIdentifier需要一个标识符来实例化给定的故事板的视图控制器,为什么不在我的故事板中为每个视图控制器分配一个等于其确切类名UserDetailViewController的标识符(即,将具有"UserDetailViewController"的标识符) "),并在UIViewController上创建一个类方法:
UIStoryboard实例作为唯一参数instantiateViewControllerWithIdentifier使用类名作为参数调用storyboard实例UIViewController实例,然后返回它所以,而不是(将类名重复为字符串,不是很好)
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("UserDetailViewController") as UserDetailViewController
Run Code Online (Sandbox Code Playgroud)
这将是:
let vc = UserDetailViewController.instantiateFromStoryboard(self.storyboard!)
Run Code Online (Sandbox Code Playgroud)
我曾经在Objective-C中使用以下类别:
+ (instancetype)instantiateFromStoryboard:(UIStoryboard *)storyboard
{
return [storyboard instantiateViewControllerWithIdentifier:NSStringFromClass([self class])];
}
Run Code Online (Sandbox Code Playgroud)
但我完全坚持使用Swift版本.我希望有某种方法可以做到这一点.我尝试了以下方法:
extension UIViewController {
class func instantiateFromStoryboard(storyboard: UIStoryboard) -> Self {
return storyboard.instantiateViewControllerWithIdentifier(NSStringFromClass(Self))
}
}
Run Code Online (Sandbox Code Playgroud)
返回Self而不是AnyObject允许类型推断工作.否则,我将不得不抛出这种方法的每一次返回,这很烦人,但也许你有更好的解决方案?
这给我的错误:Use of unresolved identifier 'Self'
该NSStringFromClass部分似乎是问题.
你怎么看?
有没有办法Self从课程功能返回?
如果不需要每次都抛出返回值,你将如何工作?(即保持-> Self为返回值)
谢谢.
我正在开发一个使用照片共享扩展程序的iOS应用程序,其中处理图像并触发我们的主要功能.
在Photo的应用程序的模拟器中,这很好用.我决定使用Photo的应用程序在设备上运行它也很棒,但是当我截图并尝试从iOS 11的新"快速截图"分享时,扩展程序崩溃,任何想法?
扩展程序获取图像,将其发送到服务器,获取响应并显示该响应(所有内容都在扩展中).当我从快速截图访问时,Messenger和Snapchat共享扩展仍然有用,这让我很烦恼!
Xcode 9也没有给我任何来自共享扩展的日志.同样值得注意的是,每次我在设备上重新安装应用程序时,我都在使用我需要"信任"的开发者帐户.
码:
// App Group keys
let suiteName = "group.suite.id"
override func viewDidLoad() {
print("Styling views..")
styleViews()
print("Styled views")
print("Adding notifications..")
addNotifications()
print("Added notifications")
print("Fetching image..")
fetchSharedImage()
}
func styleViews(){
// Set up main view
mainView.layer.cornerRadius = 8
mainShadowView.addShadow()
// Set up views and buttons
// Code hidden, applies shadows etc.
// Code hidden, moves constraints of a view
}
func addNotifications(){
// Helps views tell their parent (this view controller) to navigate to another …Run Code Online (Sandbox Code Playgroud) Autolayout将随机剪辑我的UITextView中的文本.当您从横向到纵向来回旋转时,它会更改UITextContainerView的大小.它会正常工作几次,但会随机更改容器并剪切静态文本.
如果我禁用Autolayout,那么问题就会消失.如果我删除preferredFontForTextStyle代码并保持Autolayout,它似乎也会消失.
问题是我想让用户设置文本大小并能够使用自动布局.文本都是静态的,所以这应该是一件简单的事情.
有没有人见过这个?这是一个错误还是必须做错误的事情?
为了尝试找出问题,我已经将代码缩小到尽可能小.
这是代码
// BugTest_ViewController.h
//
//
//
//
#import <UIKit/UIKit.h>
@interface BugTest_ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIImageView *image1;
@property (weak, nonatomic) IBOutlet UITextView *text1;
@endRun Code Online (Sandbox Code Playgroud)
// BugTest_ViewController.m
//
//
//
//
#import "BugTest_ViewController.h"
@interface BugTest_ViewController ()
@end
@implementation BugTest_ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
}
-(void)viewWillAppear:(BOOL)animated
{
self.text1.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
[self.text1 setContentOffset:CGPointZero animated:YES];
}Run Code Online (Sandbox Code Playgroud)
当视图看起来应该是Good Container时,这是 容器
这是查看视图时的容器. 坏容器剪辑我的文本
我有一个预加载的SQLite数据库,名为"myDB.dms".我想打包数据库并从应用程序中访问内容.
首先,我在我的Xcode ProjectNavigator窗口中拖放数据库文件,然后在提示中点击"如果需要复制文件".
我使用FMDB库来访问SQLite DB.
我创建了一个新的Database接口类并添加了3种不同的方法:
因为虽然打包DB文件将在Bundle资源文件夹中,但我必须将资源文件夹中的文件复制到目录文件夹,如下所示:
func copyDB() -> Bool {
let fileManager = FileManager.default
let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
var returnStatus: Bool = false
guard documentsUrl.count != 0 else {
print("Could not find documents url")
return false
}
let finalDatabaseURL = documentsUrl.first!.appendingPathComponent(dbFileName)
if !((try? finalDatabaseURL.checkResourceIsReachable()) ?? false) {
print("DB does not exist in documents folder")
let documentsURL = Bundle.main.resourceURL?.appendingPathComponent(dbFileName)
do {
try fileManager.copyItem(atPath: (documentsURL?.path)!, toPath: finalDatabaseURL.path)
} catch let error as NSError { …Run Code Online (Sandbox Code Playgroud) 我正在开发一个具有Flutter支持的跨平台应用程序。我集成了Firebase Crashlytics,用于崩溃报告。在我需要检查报告之前,出现一条错误消息
Upload 1 missing dSYM required to process 4 crashes
为此,我尝试了firebase文档
此外,我还按照步骤使用flutter构建iOS存档
尽管如此,firebase门户上还是有同样的问题
Upload 1 missing dSYM required to process 4 crashes
我尝试了很多次,但还没有完成。
如果有人有想法,请帮助我解决此问题。
谢谢,社区
我在SO中尝试了很多方法来处理通过javascript传入的下载文件路径.但是我无法获取文件的路径(URL).
在ANDROID中,我们有Android WebKit的DownloadListener方法.通过它我设法获取文件的URL.
我尝试过的:
使用decisionPolicyForNavigationResponse和decisionPolicyForNavigationAction我没有得到任何文件的URL.有关信息,在网站URL中他们使用CANVAS.单击下载按钮后,它们会生成BLOB映像路径以在客户端下载它.
默认情况下,它也可以在iPad中使用GOOGLE CHROME浏览器,但不能与SAFARI浏览器一起使用.
此外,javascript已启用.所以它不会产生问题.
编辑:
出于测试目的,请使用此链接.点击下载按钮,它们会触发一个事件
编辑2
我通过做一些调试来检查网站,他们使用window.open和target ="_ blank"作为新的图像路径.在window.open之后,他们正在设置window.location.href = popup.document,其中popup是window.open的一个实例
在WKWebView中,他们在阻止时禁用了弹出窗口.但我现在想知道GOOGLE CHROME如何管理它,因为它们也基于WKWebView.
ios ×10
swift ×5
objective-c ×4
iphone ×3
autolayout ×1
canvas ×1
crashlytics ×1
firebase ×1
flutter ×1
fmdb ×1
ios11 ×1
ios9 ×1
iphone-x ×1
javascript ×1
mpvolumeview ×1
share ×1
sqlite ×1
uiswitch ×1
uitableview ×1
xcode ×1