iOS 7.1更新:在此更新中,似乎忽略了修改UINavigationBar中Alpha通道的变通方法.现在,最好的解决方案似乎只是"处理它",并希望你选择的任何颜色都可以呈现半透明效果.我仍然在寻找解决这个问题的方法.
iOS 7.0.3更新:使用iOS 7.0.3时,我们创建的GitHub库已经更新,可以解决此问题.不幸的是,没有神奇的公式可以支持iOS 7.0.2及更早版本和iOS 7.0.3中创建的颜色.似乎Apple改善了饱和度,但是以不透明度为代价(因为模糊的半透明度取决于不透明度水平).我和其他一些人正在努力为此创建更好的解决方案.
我相信很多人已经遇到过这样的问题:iOS 7倾向于使半透明的UINavigationBar的颜色饱和.
我的目标是使用这种色调实现UINavigationBar,但是半透明:
然而,有了半透明,我得到了这个.背景视图是白色的,据我所知会使这个视图更轻一些:
有没有办法在保持半透明的同时达到原色?我注意到Facebook已经能够让他们的酒吧变成他们丰富的蓝色,如下所示:
..所以我知道必须有某种方式.背景视图在这里显然有所不同,但其大部分内容也是灰色/白色.似乎无论你放入什么样的色调,你都无法在半透明的情况下获得鲜艳的色彩.
更新了解决方案.
这是我最终提出的解决方案.我采用了aprato的解决方案,然后UINavigationBar
在UINavigationController
子类中包含了自定义.我创建了一个具有下面列出的实现的存储库,以及一个示例应用程序.
////////////////////////////
// CRNavigationBar.m
////////////////////////////
#import "CRNavigationBar.h"
@interface CRNavigationBar ()
@property (nonatomic, strong) CALayer *colorLayer;
@end
@implementation CRNavigationBar
static CGFloat const kDefaultColorLayerOpacity = 0.5f;
static CGFloat const kSpaceToCoverStatusBars = 20.0f;
- (void)setBarTintColor:(UIColor *)barTintColor {
[super setBarTintColor:barTintColor];
if (self.colorLayer == nil) {
self.colorLayer = [CALayer layer];
self.colorLayer.opacity = kDefaultColorLayerOpacity;
[self.layer addSublayer:self.colorLayer];
}
self.colorLayer.backgroundColor …
Run Code Online (Sandbox Code Playgroud) 使用Xcode 5的新资产库,添加图像和组织它们从未如此简单.但是,似乎它已经破坏了我用于创建构建的一些脚本.
我的Run Script Phase中有一个脚本,它设置CFBundleVersion
为plist中的当前时间戳.在脚本中,我执行此语句:
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $timestamp" $BUILT_PRODUCTS_DIR/$INFOPLIST_PATH
Run Code Online (Sandbox Code Playgroud)
但是,执行此操作时,将显示以下语句:
Set: Entry, ":CFBundleVersion", Does Not Exist
File Doesn't Exist, Will Create: /Users/SpacePyro/Library/DerivedData/BundleTest-duikdqngfmrovnagrcsvdcuxxstz/Build/Products/Debug-iphoneos/BundleTest.app/Info.plist
Run Code Online (Sandbox Code Playgroud)
这似乎发生在干净的构建上.直到构建中途,plist似乎才会生成,可能是由于资产库.
我也使用了这个命令,虽然它没有抛出错误,但它仍然吹走了我的更改(假设INFO_PLIST="${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Info"
):
defaults write $INFO_PLIST CFBundleVersion $timestamp
Run Code Online (Sandbox Code Playgroud)
当我开始使用资源库来组织我的应用程序图标和启动图像时,情况并非如此.谁知道为什么会这样?更好的是,是否有一种解决方法可以将此值添加到plist中?我已经尝试将脚本置于行动前构建阶段以及动作后构建阶段.我还尝试在构建完成后运行命令,但是当我尝试对其进行协同编码和打包时,它表示签名因修改plist而无效.
如果不存在合理的解决方案,我想我总是可以从资产库中迁移,直到我可以让我的脚本工作.
有没有办法在Objective-C中将NSString转换为NSMutableString?
在Objective-C中访问实例变量的正确语法是什么?
假设我们有这个变量:
@interface thisInterface : UIViewController {
NSMutableString *aString;
}
@property (nonatomic, retain) NSMutableString *aString;
Run Code Online (Sandbox Code Playgroud)
它是合成的.
当我们想要访问它时,我们首先要分配并初始化它.我已经在Objective-C中编程了大约一个月,我看到了两种不同形式的语法.我见过人们做的很简单aString = [[NSMutableString alloc] initWithString:@"hi"]
,他们在那里分配字符串; 我也看到人们开始它self.aString
然后他们继续初始化他们的伊娃.我想我只想弄清楚什么是初始化实例变量的最合适的方法,因为在前面的例子中,我收到了来自它的EXC_BAD_ACCESS错误.在预先设置之后self.
,它没有出现.
如果这是一个重复的问题,请原谅我,但在阅读了SO上的一些帖子之后,这让我很好奇.我正在尝试用Objective-C学习正确的语法,因为我更喜欢正确而不是草率.
在线进行一些调查,我注意到gpus_ReturnNotPermittedKillClient
当应用程序背景化时触发OpenGL操作时会抛出.我目前正在开发一个涉及地图视图和叠加层的项目(使用Apple的Breadcrumb示例代码).这些操作是在主线程上执行的,但是当地图视图初始化或视图被推到屏幕上时,应用程序可能会变为背景.
我还使用位置服务通过GPS检索点,但除非我们在前台,否则我不会更新叠加层.
据我所知,自iOS 6以来,MKMapView现在是用OpenGL创建的吗?如果是这种情况,那么可以通过OpenGL绘制叠加层吗?这可以帮助解释为什么我一直在随机获得此错误.
我听说过的一些方法来取消所有的OpenGL操作,如调用glFinish()
中applicationDidEnterBackground
和applicationWillResignActive
或使用[[CCDirector sharedDirector] pause]
.考虑到这一点,使用MKMapView/MKOverlayView消除任何OpenGL绘图的最佳解决方案是什么?