我有一个自定义CALayer子类的应用程序.在这个图层子类中,我已经覆盖了该- (void) drawInContext:(CGContextRef)ctx方法.这工作正常,我的所有自定义内容都被绘制.
现在我想添加一个自定义属性,当内容发生变化时,该属性会被动画化.我需要在动画运行时重绘.我添加了以下问题的答案中给出的属性:动画CALayer子类的自定义属性
我还为我的图层添加了此属性的CABasicAnimation实例:
CABasicAnimation* theAnimation=[CABasicAnimation animationWithKeyPath:@"moveContentToLeft"];
theAnimation.duration=1.0;
theAnimation.fromValue=[NSNumber numberWithFloat:0.0];
theAnimation.toValue=[NSNumber numberWithFloat:10.0];
[area addAnimation:theAnimation forKey:@"moveContentToLeft"];
Run Code Online (Sandbox Code Playgroud)
在我的draw方法中,我有一个NSLog语句,在其中我输出my属性的值,我正在动画.
我的问题是,一旦动画启动,就会清除图层子类的所有内容.NSLog输出我的属性的值,该属性被内插(因此drawInContext方法)被调用.但不知何故,它绘制的东西在动画中是不可见的.在动画结束时,原始内容再次可见.
目前在绘制图层时尚未使用动画属性,因此我希望再次绘制正常内容,并获得带有插值的NSLog输出.
我的图层是另一个图层的子图层(在UIView中).我试图在绘图方法的末尾重绘超级图层(调用_parent setNeedsDisplay [parent是父视图的ivar]).这没有用.我也觉得这样做不是一个好主意.
我希望有人可以帮我解决这个问题.
感谢Matt Long的示例项目,我可以看到我的问题出在绘图方法中.我扩展了他的项目,因此它显示了同样的问题.我认为它比原始代码更简单;)
- (void)drawInContext:(CGContextRef)ctx
{
NSLog(@"Getting called: Bob: %i", [self bob]);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(50 + [self bob], 50, 100, 100));
CGContextAddPath(ctx, path);
CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
CGContextSetLineWidth(ctx, 1.0);
CGContextStrokePath(ctx);
CGPathRelease(path);
[_test testInContext:ctx]; // here is the problem
}
Run Code Online (Sandbox Code Playgroud)
ivar _test是一个自定义类,包含一些绘图代码(目前它绘制一个绿色框).现在的问题是动画运行时不会绘制这个绿色框.动画结束后,绿色框再次可见.扩展示例项目:http://dl.dropbox.com/u/5426092/ArbitraryPropertyAnimationNew.zip
我正在尝试编写一个在UIWebView中使用大量java脚本的应用程序.并且在需要时动态加载一些java脚本(使用jquery).
index.html和jquery文件按预期加载,但不加载code.js文件.code.js文件是这样的请求(从index.html剪下java脚本代码):
function require(moduleName,filePath) {
var uri = filePath;
jQuery.ajax({
type: "GET",
url: uri,
async: false,
dataType: "script",
success: function(content) {
console.log("Receive content of "+moduleName);
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
console.log("Error content of "+moduleName);
console.log("Status: " + textStatus);
console.log("Thrown error: " + errorThrown);
console.log("h" + XMLHttpRequest.getAllResponseHeaders());
console.log(XMLHttpRequest.responseText);
}
});
}
function start() {
require("test", "code.js");
}
Run Code Online (Sandbox Code Playgroud)
start()函数在index.html的body标签的onload事件中调用.code.js文件只包含以下三行代码:
alert("Loaded file syncronosly");
// HEllo
alert("second");
Run Code Online (Sandbox Code Playgroud)
我从这段代码得到的输出看起来像这样(我有一些额外的js代码,它们将console.log调用转发到我省略的Xcode控制台):
UIWebView console: Error content of test
UIWebView console: Status: error
UIWebView console: Thrown error:
UIWebView …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种解决方案,以使选择器仅在与上次发出的值相比发生变化时才发出新值,并且不仅更改对存储的引用。
我的商店中处于以下状态:
{
items: [],
loading: false,
selectedItemId: 1
}
Run Code Online (Sandbox Code Playgroud)
我有以下选择器:
export const getSelectedItem = createSelector(getItemsState,
(state) => {
return state.selectedItemId === null ? null : state.items.find(item => item.id === state.selectedItemId)
}
);
Run Code Online (Sandbox Code Playgroud)
当我对此选择器进行订阅时,每次例如在商店中的加载标志更改时,都会触发该事件。我希望选择器仅在所选项目的值更改时发出一个值。即从1到2。但是当状态对象的引用不同时则不是。
我为此找到了一个解决方案:
this.itemStore.select(getSelectedItem).distinctUntilChanged((x, y) => {
return x.id === y.id;
}).subscribe(item => {
// do something
});
Run Code Online (Sandbox Code Playgroud)
但是,我想移动逻辑以使更新的内容与我的选择器区分开,而不是在调用方使用。
我理解为什么会有这种行为,因为框架每次都检查简化时是否检查对象是否相等,并且商店引用发生了变化,因为我们每次都会从化简器中返回一个新的ItemState对象。但是我无法找到解决问题的方法,而且我无法想象我是唯一需要选择器的人,该选择器仅在更改了有效值后才会更新。
减速器的代码如下所示:
export function itemsReducer(state: ItemsState = initialItemsState, action: Action): ItemsState {
switch(action.type) {
case itemActions.ITEMS_LOAD:
return {
...state,
itemsLoading: true
};
case itemActions.ITEMS_LOAD_SUCESS:
return {
...state,
items: action.payload, …Run Code Online (Sandbox Code Playgroud) 我有一个带有子项目的项目,想要对孩子进行maven释放(项目B):
Project-A/
pom.xml
Project-B/
pom.xml
src/
Run Code Online (Sandbox Code Playgroud)
Project-A的文件夹同时是我的git存储库,我从我们的中央git服务器克隆.
对于我们的发布,我们使用jenkins作为构建服务器和Jenkins Maven Release Plug-in来启动发布版本.
因此,在jenkins Job(称为JobB)启动后,它会将Project-A文件夹签出到以下位置:/Users/titan/.jenkins/jobs/JobB/workspace.
由于git的工作方式,我只能克隆我的结构的顶层.所以这意味着我需要将我想要在jenkins中构建的pom设置为Project-B/pom.xml,然后将更改maven用于执行其工作的工作目录.
这会产生很多git问题,因为maven发布插件试图提交到错误的目录(它假定Project-A/Project-B /是一个有效的git存储库).我可以解决所有这些问题(通过在执行发布时停用推送到远程仓库并在执行发布时指定正确的scm url.)
这是Release goals and optionsjenkins JobB配置中字段的值:
-X -DpreparationGoals="clean install"
-DpushChanges=false
-DconnectionUrl=scm:git:file:///Users/titan/.jenkins/jobs/JobB/workspace
release:prepare release:perform
Run Code Online (Sandbox Code Playgroud)
需要connectionUrl的文件URL,因为我没有将更改推送到git远程服务器以及在maven开头执行的克隆:perform将找不到需要签出的标记.
毕竟这是我的问题,我无法解决:
maven:准备步骤贯穿并完成所有工作(更改pom中的版本号,创建发布标记).然后该maven:perform步骤开始,将内容从git存储库,checkouts标记克隆到目标文件夹,然后调用deploy命令.
但是这里是在顶层调用调用的deploy命令的问题,因此它正在部署Project-A而不是Project-B.作业本身正在运行,没有任何错误,它只是构建和部署错误的东西.
以下是maven生成的用于执行部署的命令:
[INFO] Executing goals 'deploy'...
[DEBUG] Using ${maven.home} of: '/usr/share/java/maven-3.0.3'.
[DEBUG] Executing: /bin/sh -c cd /Users/titan/.jenkins/jobs/jobB/workspace/Project-B/target/checkout && /usr/share/java/maven-3.0.3/bin/mvn -B -X -D maven.repo.local=/Users/titan/.m2/repository -s /Users/titan/.m2/settings.xml -D performRelease=true deploy
Run Code Online (Sandbox Code Playgroud)
所以它调用checkout目录中的pom文件而不是checkout/Project-B.有趣的是,maven:准备步骤确实在正确的pom上执行.
不使用jenkins,直接从shell调用mvm命令.这给了我相同的结果.所以我认为詹金斯不是问题.
更改路径与聚甲醛-Darguments="-f sword-packaging-wbf/pom.xml"和用 -Darguments="-DpomFileName=sword-packaging-wbf/pom.xml"
两种方法都不会改变结果中的任何内容.在查看输出时,我看到-f <path>在生成的命令中忽略了它,因为它 …
angular ×1
git ×1
ios ×1
iphone ×1
javascript ×1
jenkins ×1
maven ×1
ngrx ×1
objective-c ×1
uiwebview ×1