我想UINavigationBar在我的一个视图中使用自定义,这不是任何UINavigationController-hierarchy 的一部分.当我将其UINavigationBar拖入Storyboard时,它显示如下:

这个条是44像素,如果状态栏不共享这个空间就足够了.因为iOS7让我们使用整个屏幕,包括状态栏的空间,UINavigationBar应该是64px高,而不是44px.
如果我将视图连接到一个UINavigationController层次结构,那么它显示正确:

我读的地方,如果在UINavigationBar有属性barPosition:设置为UIBarPositionTopAttached,那么酒吧是64PX.然而,这是一个readonly属性.
我的搜索结果只显示了我认为是"解决方法"的问题.通过UINavigationController在此之前添加无用UIViewController,我可以假装有一个层次结构,它将自动添加UINavigationBar64px.
是否真的没有办法UINavigationBar覆盖64px 的"流氓"(没有导航控制器的帮助)?如果是这样的话,是否有任何正当理由说明原因?
(我不是说UINavigationBar默认情况下应该是64px,但是在检查器中应该有一个选项)
(我也看到人们用程序化的方式来解决这个问题.尽管这些答案有效,但我仍然需要设计故事板,考虑到这一点(差距).我想知道的是,是否可以将其设置为故事板,或者说,为什么不允许?)
cocoa-touch objective-c uinavigationbar uinavigationcontroller ios
不久,我有一个NSDictionary我需要在我的图像中显示图像的网址UITableView.每个单元格都有标题和图像.我成功地实现了这一点,虽然滚动是滞后的,因为看起来细胞每次进入屏幕时都会下载图像.我搜索了一下,SDWebImage在github上找到了.这使得卷轴拉开了.我不完全确定它做了什么,但我相信它做了一些缓存.但!每当我第一次打开应用程序时,我看到没有图像,我必须向下滚动,然后备份它们才能到达.如果我用主页按钮退出应用程序并再次打开,那么它就像缓存一样工作,因为屏幕上的图像是可见的,但是,如果我向下滚动一个单元格,那么下一个单元格没有图像.直到我滚过它并备份,或者我点击它.这是缓存应该如何工作?或者缓存从网上下载的图像的最佳方法是什么?图像正在被更新,所以我接近将它们导入到项目中,但我希望能够在不上传更新的情况下更新图像.
是否无法在启动时从缓存中加载整个tableview的所有图像(假设缓存中有某些内容)?这就是为什么我有时会看到没有图像的细胞?
是的,我很难理解缓存是什么.
- 编辑 -
我只使用相同大小的图像(500x150)尝试了这个,并且方面错误消失了,但是当我向上或向下滚动时,所有单元格上都有图像,但起初它们是错误的.单元格在视图中显示几毫秒后,将显示正确的图像.这真令人讨厌,但也许它必须如何?它似乎首先从缓存中选择了错误的索引.如果我滚动慢,那么我可以看到图像从错误的图像闪烁到正确的图像.如果我快速滚动,那么我相信错误的图像在任何时候都是可见的,但由于快速滚动我无法分辨.当快速滚动减慢并最终停止时,仍会出现错误的图像,但在停止滚动后立即更新为正确的图像.我也有一个自定义UITableViewCell类,但我没有做过任何大的改动.我还没有完成我的代码,但我想不出可能出错的地方..也许我有错误的东西订单..我已经编写了很多java,c#,php等,但我很难理解Objective-c,所有的... .h和.m我也有`
@interface FirstViewController : UITableViewController{
/**/
NSCache *_imageCache;
}
Run Code Online (Sandbox Code Playgroud)
(在其他变量中)FirstViewController.h.这不正确吗?
这是我的cellForRowAtIndexPath.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"hallo";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSMutableArray *marr = [hallo objectAtIndex:indexPath.section];
NSDictionary *dict = [marr objectAtIndex:indexPath.row];
NSString* imageName = [dict objectForKey:@"Image"];
//NSLog(@"url: %@", imageURL); …Run Code Online (Sandbox Code Playgroud) 我有一个UITableView包含滚动时要播放的视频.由于tableView中的单元格正在被重用,我只会AVPlayer为每一行实例化一个.当一个单元被重用时,我只需PlayerItem通过调用来改变单元的播放器[self.player replaceCurrentItemWithPlayerItem:newItem];.目前这是内部间接调用的tableView:cellForRowAtIndexPath.向下滚动时,重新使用时会出现明显的延迟.通过消除过程,我得出结论,滞后是replaceCurrentItemWithPlayerItem在它开始播放之前引起的.当删除这一行代码(阻止播放器获取新视频)时,滞后消失.
我试图解决它:
我有一个UITableViewCell播放这些视频的自定义,我在这些视频中创建了一个方法,用来自对象的新信息进行初始化.IE,在cellForRowAtIndexPath:我打电话[cell initializeNewObject:newObject];中执行以下方法:
//In CustomCell.m
-(void)initializeNewObject:(CustomObject*)newObject
{ /*...*/
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
AVPlayerItem *xPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:newObject.url]];
AVPlayer *dummy = self.player;
[dummy replaceCurrentItemWithPlayerItem:xPlayerItem];
dispatch_async(dispatch_get_main_queue(), ^{
self.player = dummy;
playerItem = xPlayerItem;
}
}/*...*/
}
Run Code Online (Sandbox Code Playgroud)
运行此操作时,我得到的结果与完全删除更换项目的调用相同.显然,这个函数不能被线程化.我不完全确定我对此的期望.我会想象我需要一个干净copy的AVPlayer这个工作,但搜索了一下后,我发现了一些意见指出,replaceCurrentItemWithPlayerItem:可不能在一个单独的线程,这是没有意义的我被调用.我知道UI元素永远不应该在除main/UI-thread之外的其他线程中处理,但我绝不会想到replaceCurrentItemWithPlayerItem属于这个类别.
我现在正在寻找一种方法来改变一个AVPlayer没有滞后的项目,但找不到任何.我希望我已经理解了这个函数的错误,并且有人会纠正我.
编辑:
我现在已被告知此调用已经线程化,这不应该发生.但是,我没有看到其他解释..下面是我的cellForRowAtIndexPath:.它位于自定义内UITableView,委托设置为self(so self …
someFunction(completion: { [weak self] in
self?.variable = self!.otherVariable
})
Run Code Online (Sandbox Code Playgroud)
这总是安全吗?我self在语句的开头访问了可选项,并且我个人认为如果self是,那么该语句的第二部分将永远不会被执行nil.这是真的?如果self确实如此nil,第二部分永远不会发生?self在这一行代码中,它永远不会被"填充"?
我一直在寻找如何过渡/动画barTintColor的UINavigationBar现在一段时间,我只看到不同的答案.一些使用UIView.animateWithDuration,一些使用CATransition,但最有趣的,像这一个使用animate(alongsideTransition animation..,我喜欢的声音,但我不能让它正常工作.难道我做错了什么?
许多人指出我可以简单地使用transitionCoordinatorin viewWillAppear:.我已经建立了一个像这样的新超级小项目:
class RootViewController:UIViewController{ //Only subclassed
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
transitionCoordinator?.animate(alongsideTransition: { [weak self](context) in
self?.setNavigationColors()
}, completion: nil)
}
func setNavigationColors(){
//Override in subclasses
}
}
class FirstViewController: RootViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = "First"
}
override func setNavigationColors(){
navigationController?.navigationBar.barTintColor = UIColor.white
navigationController?.navigationBar.tintColor = UIColor.black
navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.black]
navigationController?.navigationBar.barStyle = UIBarStyle.default
}
}
class SecondViewController: …Run Code Online (Sandbox Code Playgroud) 所以我现在转换我的项目在Xcode 9中使用Swift 4,并开始测试我的应用程序.这是一个有四个不同选项卡的大应用程序,几乎所有内容都按预期工作.其中一个标签是使用GoogleMaps的地图.我从未遇到任何麻烦,但是当使用Xcode 9构建并在模拟器中显示时,它在移动地图时使用了超过 100%的CPU,并且它非常滞后.这是在模拟器上运行时的调试导航器.我们做一些自定义绘图,但不是102%的绘图.
这只是在我更新到Xcode 9和Swift 4之后才开始发生.当在iPhone 7,8或X 模拟器上的Xcode 9中进行调试时,所有这些都使用iOS 11,它只有100%以上的CPU,它完全阻止了UI的更新每次我试图移动它约一秒钟.我开始拖动手势,但UI只会每秒更新一次.有效地给我约1fps.
但是,在使用iOS 9的iPhone 6 模拟器上的Xcode 9中进行调试时,移动地图时可达到约90%而不会滞后.我猜我在这里得到大约20-30 fps.(这可能与我在Xcode 8上的模拟器中获得的fps相同.在模拟器上,地图从未如此流畅......)
当在实际设备(iPhone 7,iOS 11)上运行时,CPU在不断移动地图时使用大约40%,并且工作非常平稳,没有任何滞后(60fps).
我一打开带有地图的标签,我也会在输出中得到这个,但我认为这与这个特定的问题无关:
Main Thread Checker: UI API called on a background thread: -[UIApplication applicationState]
PID: *****, TID: *******, Thread name: com.google.Maps.LabelingBehavior, Queue name: com.apple.root.default-qos.overcommit, QoS: 21
Run Code Online (Sandbox Code Playgroud)
这表示GoogleMapsAPI调用 [UIApplication applicationState]后台线程..
我使用的是最新版本的GoogleMaps:2.4.0.据我所知,这个版本可能不支持Xcode 9/Swift 4等,但我找不到任何关于新版本的内容.
我正在重写应用程序的一部分,并找到了这段代码:
fileprivate let defaults = UserDefaults.standard
func storeValue(_ value: AnyObject, forKey key:String) {
defaults.set(value, forKey: key)
defaults.synchronize()
NotificationCenter.default.post(name: Notification.Name(rawValue: "persistanceServiceValueChangedNotification"), object: key)
}
func getValueForKey(_ key:String, defaultValue:AnyObject? = nil) -> AnyObject? {
return defaults.object(forKey: key) as AnyObject? ?? defaultValue
}
Run Code Online (Sandbox Code Playgroud)
当CMD点击该行时,defaults.synchronize()我看到synchronize计划已弃用.这是在代码中写的:
/*!
-synchronize is deprecated and will be marked with the NS_DEPRECATED macro in a future release.
-synchronize blocks the calling thread until all in-progress set operations have completed. This is no longer necessary. Replacements for …Run Code Online (Sandbox Code Playgroud) 我正在为我已经开始的项目创建一个应用程序和一个网站,但我不确定我应该怎么做才能登录.这不是"我是菜鸟,我想要一个登录的应用程序" -问题.我对网络,数据库和应用程序开发都有一定的经验,但除了应用程序模板之外,我从未真正触及过安全主题.
我想象的是一个像Skype,Facebook,NetFlix这样的"简单"登录系统,真的是你能登录的任何应用程序,它还有一个登录的网站.
我的问题的一部分是关于过程的安全性.我最初的想法是,绝不应该通过互联网发送干净文本的密码,这使我相信在登录时,密码应该在手机上以及网站上进行散列/加密.我做了一些小事 - 之前的时间哈希/加密,但只是通过使用sha1和md5"转换"文本.这样做的正确方法是什么?根据我目前的知识,我假设如果我md5用来加密密码,任何人都可以解密它md5,但我可以使用SALT(?)或某种形式来改变密钥.这就是"大男孩"是如何做到的,还是有一个我不知道的秘密通道?
现在转到真正的问题 ..我应该如何安全地存储登录?
我曾经尝试过的:当在Xcode中为此做一个"测试项目"时,我只是创建了一个User带有字段的类username.当通过输入用户名和密码"登录"时,我只是向我的-page 发送了一个POST-method HTTP-request,.php它只执行了一个SELECT * FROM User WHERE Username = '$_POST['username']' AND Password = '$_POST['password']';如果数据库返回一行,那么密码是正确的,页面可以用JSON打印出用户管他呢.当设备成功登录后,我在应用程序中转换了用户对象,现在包含用户名(可能包含用户ID,电子邮件,地址等)NSData*,并使用NSKeyedArchiver和NSKeyedUnarchiver保存并加载用户,从不进行身份验证再次.如果用户单击"注销",我会擦除此"存档".这有效,但我觉得这不是一种特别安全的方式.如果是这样,为什么呢?
(我们的后端目前是Google的App Engine(java),它支持OAuth.有些人建议这样做,但我们找不到任何适合我们的自定义用户计划的文档)
在iOS 11中,searchBars默认为左对齐文本.虽然这对iOS的其他原生更改看起来很好,但它并不适合我的设计,我希望它像以前一样成为中心.
我找不到任何这样的对齐属性UISearchBar.我错过了什么,或者根本不可能?我是否必须创建自己的自定义搜索栏,例如从a派生UITextField来实现此目的?
我需要一种UIView可以用于多种不同的定制ViewControllers.通常当我创建自定义时UIView,我将一个实例UIView拖入我ViewController的故事板中,创建一个子类UIView,并Identity Inspector在视图中指向此子类.从那里,我将UI对象作为出口连接到子类的头文件.
我现在要制作的视图不应该是任何特定控制器的一部分,而应该添加到任何要求它的控制器中.流氓UIView.我知道我可以以UIView编程方式创建整个,只是创建它的实例,但我想在我的故事板中拥有它(并设计它).
在Storyboard中,我允许在"ViewController"之外拖动的唯一对象是其他ViewControllers.
我从未使用过故事板以外的任何东西进行iOS开发,但是我已经找到了使用其他模式的教程,从过去的日子开始,看起来就像我需要的那样.是否有可能得到类似的东西进入我的故事板?或者这需要自己的设置/设计?如果是这样,怎么样?
我还在考虑通过添加UIViewController包含我的自定义视图的"幻像"来解决这个问题.在那里设计,但从其他控制器实例化,但这听起来很hacky ..
我也想这样做UITableViewCell,但我想这将有相同的解决方案.
ios ×10
cocoa-touch ×3
objective-c ×3
swift ×2
uiview ×2
xcode ×2
avplayer ×1
caching ×1
encryption ×1
foundation ×1
google-maps ×1
image ×1
ios11 ×1
load ×1
null ×1
optional ×1
security ×1
uisearchbar ×1
uistoryboard ×1
uitableview ×1
xcode9 ×1