我刚刚升级到XCode 4.5 GM,发现你现在可以将"4"Retina'大小应用到故事板中的视图控制器.
现在,如果我想创建一个在iPhone 4和5上运行的应用程序,当然我必须构建每个窗口两次,但我还必须检测用户是否有一个3.5"或4"屏幕的iPhone,然后应用视图.
我该怎么办?
在文档中, Apple声明在以下情况下需要考虑图层的比例因子:
- 创建具有不同比例因子的其他Core Animation图层,并将它们组合成自己的内容
- 直接设置Core Animation图层的contents属性
最后的陈述对我来说并不完全清楚.他们还说:
直接使用Core Animation图层提供内容的应用程序可能需要调整其绘图代码以考虑比例因子.通常,当您在视图的drawRect:方法中绘制时,或者在图层委托的drawLayer:inContext:方法中绘制时,系统会自动调整图形上下文以考虑比例因子.
小规模还是永远?这仅适用于视图的托管后备层或我添加为后备层的子层的每个层?因为他们也说:
如果应用程序创建没有关联视图的图层,则每个新图层对象的比例因子最初都设置为1.0.如果不更改该比例因子,并且随后在高分辨率屏幕上绘制图层,则会自动缩放图层的内容以补偿比例因子的差异.如果您不希望缩放内容,可以将图层的比例因子更改为2.0,但如果您这样做而不提供高分辨率内容,则现有内容可能会显得比您预期的要小.要解决该问题,您需要为图层提供更高分辨率的内容.
我在想象一个没有视图的图层时遇到困难,我可以想象一下图层的层次结构,但是一旦我想要显示它们,我应该将它添加为视图背衬层的子层次结构,或者确实存在一些其他方法来使用它们(比如在上下文中创建和渲染)?
Core Animation的合成引擎查看每个图层的contentsScale属性,以确定在合成期间是否需要缩放该图层的内容.如果应用程序创建没有关联视图的图层,则每个新图层对象的比例因子最初都设置为1.0.如果不更改该比例因子,并且随后在高分辨率屏幕上绘制图层,则会自动缩放图层的内容以补偿比例因子的差异.如果您不希望缩放内容,可以将图层的比例因子更改为2.0,但如果您这样做而不提供高分辨率内容,则现有内容可能会显得比您预期的要小.要解决该问题,您需要为图层提供更高分辨率的内容.
这究竟意味着什么?当我做这样的事情时,layer.contents = (id)image.CGImage我需要设置contentsScale.
当我的图层绘制调用委托方法的内容drawLayer:inContext:并且图层不是视图的背景层时,是否还需要设置它 ?
Apple提供了这个实时模糊视图类UIVisualEffectView,你可以使用它UIBlurEffect来获取三个可用UIBlurEffectStyle的一个:
enum UIBlurEffectStyle : Int {
case ExtraLight
case Light
case Dark
}
Run Code Online (Sandbox Code Playgroud)
现在用于演示目的我建立与风格两个花纹的意见Light和ExtraLight:
let lightBlur = UIBlurEffect(style: UIBlurEffectStyle.Light)
let extraLightBlur = UIBlurEffect(style: UIBlurEffectStyle.ExtraLight)
let lightView = UIVisualEffectView(effect: lightBlur)
lightView.frame = CGRectMake(10, 30, 150, 150)
self.view.addSubview(lightView)
let extraLightView = UIVisualEffectView(effect: extraLightBlur)
extraLightView.frame = CGRectMake(160, 30, 150, 150)
self.view.addSubview(extraLightView)
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,一切都按预期工作,它们模糊图像:
还有一些关于颜色的工作:
但是当遇到白色背景时会发生这种情况:
在Light对预期左侧的作品,但效果ExtraLight右侧叶效果某种灰色方块的后面.
现在的问题是:是否有任何一种技巧或方法可以让我在白色背景上使用额外的光线模糊效果(支持实时模糊)并删除那个丑陋的灰色阴影?
我试图通过AVAudioPlayer从后台任务开始播放声音然后实例化,所以这就是我所拥有的.
为了便于阅读,我删除了所有用户选择的值.
- (void)restartHandler {
bg = 0;
bg = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:bg];
}];
tim = [NSTimer timerWithTimeInterval:.1 target:self selector:@selector(upd) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:tim forMode:NSRunLoopCommonModes];
}
- (void)upd {
if ([[NSDate date] timeIntervalSinceDate:startDate] >= difference) {
[self playSoundFile];
[tim invalidate];
[[UIApplication sharedApplication] endBackgroundTask:bg];
}
}
- (void)playSoundFile {
NSError *sessionError = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];
// new player object
_player = [[AVQueuePlayer alloc] init];
[_player insertItem:[AVPlayerItem playerItemWithURL:[[NSBundle mainBundle] URLForResource:@"Manamana" withExtension:@"m4a"]] afterItem:nil];
[_player setVolume:.7];
[_player play]; …Run Code Online (Sandbox Code Playgroud) 我已经在iPhone应用程序上多次看过这个功能(例如At Bat,Garageband等),我只是想知道如何激活iPhone的功能而无需构建自己的类.
我看过一个简单的YouTube视频,但按照上述步骤也无济于事......
所以要清楚,我希望有一些示例代码或简单的解释如何将UIPopoverControl移植到iPhone.
提前致谢!