小编Chr*_*ris的帖子

使用CABasicAnimation时,CALayer未绘制其内容

我有一个自定义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

iphone core-animation objective-c

5
推荐指数
1
解决办法
1233
查看次数

在UIWebView中动态加载javascript文件,本地缓存无法正常工作

我正在尝试编写一个在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)

javascript uiwebview ios

5
推荐指数
1
解决办法
7902
查看次数

Angular和NGRX防止选择器在值相等时在状态更改时发出相同的值

我正在寻找一种解决方案,以使选择器仅在与上次发出的值相比发生变化时才发出新值,并且不仅更改对存储的引用。

我的商店中处于以下状态:

{
   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)

ngrx angular

5
推荐指数
1
解决办法
2033
查看次数

使用git repository和jenkins执行maven发布的子项目

建立

我有一个带有子项目的项目,想要对孩子进行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>在生成的命令中忽略了它,因为它 …

git maven maven-release-plugin jenkins

3
推荐指数
1
解决办法
3037
查看次数