我遇到了一个问题,我有一系列重叠的CATransition/CAAnimation序列,所有这些都是我需要在动画停止时执行自定义操作,但我只需要一个dynamicDidStop的委托处理程序.
但是,我遇到了一个问题,似乎没有办法在animationDidStop委托中唯一标识每个CATransition/CAAnimation.
我通过作为CAAnimation的一部分公开的键/值系统解决了这个问题.
当您启动动画时,请使用CATransition/CAAnimation上的setValue方法设置在animationDidStop触发时使用的标识符和值:
-(void)volumeControlFadeToOrange
{
CATransition* volumeControlAnimation = [CATransition animation];
[volumeControlAnimation setType:kCATransitionFade];
[volumeControlAnimation setSubtype:kCATransitionFromTop];
[volumeControlAnimation setDelegate:self];
[volumeControlLevel setBackgroundImage:[UIImage imageNamed:@"SpecialVolume1.png"] forState:UIControlStateNormal];
volumeControlLevel.enabled = true;
[volumeControlAnimation setDuration:0.7];
[volumeControlAnimation setValue:@"Special1" forKey:@"MyAnimationType"];
[[volumeControlLevel layer] addAnimation:volumeControlAnimation forKey:nil];
}
- (void)throbUp
{
doThrobUp = true;
CATransition *animation = [CATransition animation];
[animation setType:kCATransitionFade];
[animation setSubtype:kCATransitionFromTop];
[animation setDelegate:self];
[hearingAidHalo setBackgroundImage:[UIImage imageNamed:@"m13_grayglow.png"] forState:UIControlStateNormal];
[animation setDuration:2.0];
[animation setValue:@"Throb" forKey:@"MyAnimationType"];
[[hearingAidHalo layer] addAnimation:animation forKey:nil];
}
Run Code Online (Sandbox Code Playgroud)
在animationDidStop委托中:
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag{
NSString* value = [theAnimation valueForKey:@"MyAnimationType"];
if ([value isEqualToString:@"Throb"])
{
//... …Run Code Online (Sandbox Code Playgroud) 我想使用Xcode 10的新构建系统进行开发,但是我们在持续集成系统中的构建失败了,因为xcarchive产生了一个问题:它Info.plist中xcarchive缺少ApplicationProperties密钥和信息!
事实证明,切换回遗留构建系统可以解决这个问题.这可以在工作区设置(文件>工作区设置...>构建系统)中完成.但我更愿意保留新的构建系统以进行开发,并且只使用遗留构建系统进行CI构建.
有没有办法在xcodebuild不修改工作空间的情况下使用遗留构建系统?
这很奇怪,我想知道是否有人有任何想法?
我正在尝试滚动UIScrollView以响应iPad上的按钮按下.
如果我做:
CGPoint currentOff = scrollView.contentOffset;
currentOff.x+=240;
[scrollView setContentOffset:currentOff animated: NO];
Run Code Online (Sandbox Code Playgroud)
滚动视图按预期跳转到所需位置,但我希望它滚动.但是,当我这样做时:
CGPoint currentOff = scrollView.contentOffset;
currentOff.x+=240;
[scrollView setContentOffset:currentOff animated: YES];
Run Code Online (Sandbox Code Playgroud)
然后它什么都没做!我有另一个滚动视图,它正常工作并按setContentOffset:YES预期响应,所以我很困惑.关于为什么滚动可能不会发生的任何想法都是最受欢迎的!
此外,使用时- (void)scrollViewDidScroll:(UIScrollView *)sender 根本没有收到任何东西,animated:YES但在animated:NO使用时会被调用!
label.text = String(format:"%.1f hour", theOrder.bookingMins/60.0)
Run Code Online (Sandbox Code Playgroud)
上面的代码只是得到错误:'Int' is not convertible to 'Double'
bookingMins是Int类型,那么如何在Swift中将Int转换为Double?似乎不像C中那么简单
从iOS 5开始,有两种通知样式:横幅和警报("旧"样式).用户可以在设置中设置要为每个应用程序使用的样式.但是,现在默认似乎是通知显示横幅样式.
我正在使用本地通知来提醒"现在"发生的事件.一个横幅在它出现后不久就消失了(并且它不够明显,人们可以点击它),所以对于这些通知,需要将警报样式通知保留在屏幕上直到用户决定一个动作(忽略或去到应用程序).
有没有办法通过代码或例如Info.plist条目告诉iOS默认情况下应该使用警报样式通知(只要用户没有配置其他东西)?
更新:缺乏信息/文件是不足以让我解决这个问题.我想要一个像权威人士的论坛/博客文章(Apple员工或Erica Sadun的人)说这是不可能的,或者如果有可能那么我想要解决方案.像"要求用户更改设置"这样的解决方法也不够好.
我是iPhone SDK的新手.现在我正在使用CALayers进行编程,我非常喜欢它 - 不像UIViews那么昂贵,而且代码比OpenGL ES sprites少得多.
我有这个问题:是否有可能在CALayer上获得触摸事件?我知道如何在UIView上获得触摸事件
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
Run Code Online (Sandbox Code Playgroud)
但我无法找到关于如何在CALayer对象上获取触摸事件的任何地方,例如,漂浮在3D空间中的橙色方块.我拒绝相信我是唯一一个对此感到好奇的人.
我感谢任何帮助!
在Objective-C中,我经常传递块.我经常使用它们来实现模式,以帮助避免将内容存储到实例变量中,从而避免线程/时序问题.
例如,我将它们分配给一个CAAnimationvia,-[CAAnimation setValue:forKey:]这样我就可以在动画结束时执行该块.(Objective-C中可以把块作为对象,你也可以做[someBlock copy]和[someBlock release].)
但是,尝试在Swift和Objective-C中使用这些模式似乎非常困难.(编辑:我们可以看到语言仍在变化:已经调整了代码,因此它适用于Xcode6-beta2,之前的版本适用于Xcode6-beta1.)
例如,我无法转换AnyObject回块/闭包.以下产生编译器的错误:
override func animationDidStop(anim: CAAnimation!, finished flag: Bool)
{
let completion : AnyObject! = anim.valueForKey("completionClosure")
(completion as (@objc_block ()->Void))()
// Cannot convert the expression's type 'Void' to type '@objc_block () -> Void'
}
Run Code Online (Sandbox Code Playgroud)
我找到了一个解决方法,但它非常难看,恕我直言:在我的桥接标题中,我有:
static inline id blockToObject(void(^block)())
{
return block;
}
static inline void callBlockAsObject(id block)
{
((void(^)())block)();
}
Run Code Online (Sandbox Code Playgroud)
现在我可以在Swift中做到这一点:
func someFunc(completion: (@objc_block ()->Void))
{
let animation = CAKeyframeAnimation(keyPath: "position")
animation.delegate …Run Code Online (Sandbox Code Playgroud) 寻找基本上与Cocoa相当的东西[UILabel adjustsFontSizeToFitWidth].
之前已经提出过类似的问题,但它们并没有帮助我做我想做的事情:
我想重新格式化现有的Objective-C代码(几百个文件).对于纯苹果风格的格式化,uncrustify似乎做我想要的.但是对于一些项目,我需要一种不同的风格,我还没有找到如何配置unrustify.在这种风格中,长方法调用看起来像这样(请不要讨论你是否喜欢这种风格;不建议使用不同的风格):
[self
longMethod:arg1
withLots:arg2
ofArguments:arg3
aBlock:^{
[self doSomething];
}
andAnotherBlock:^{
[self doSomethingElse];
}
];
Run Code Online (Sandbox Code Playgroud)
当方法调用超过80或100个字符的行长度时,将完成此包装.每行缩进一级,并且只包含一个参数,选择器部分直到相应的:.因此,线不是结肠对齐的.
如果行长度低于80或100个字符,则不进行换行:
[self shortMethod:withAnArgument];
Run Code Online (Sandbox Code Playgroud)
是否有可以调整以支持此样式的代码格式化程序?如果是这样,哪个更重要的是,如何?
我从Png文件中获取UIImage并将其提供给videoWriter.
avAdaptor appendPixelBuffer:pixelBuffer
当最终结果视频出来时,它似乎缺少一种颜色,缺少黄色或其他东西.
我采用了使像素缓冲区脱离UIImage的功能
CVPixelBufferCreateWithBytes(NULL,
myWidth,
myHeight,
kCVPixelFormatType_32BGRA,
(void*)CFDataGetBytePtr(image),
CGImageGetBytesPerRow(cgImage),
NULL,
0,
NULL,
&pixelBuffer);
Run Code Online (Sandbox Code Playgroud)
我也尝试了kCVPixelFormatType_32AGRB和其他人,它没有帮助.
有什么想法吗?