小编ben*_*ith的帖子

在iPad上呈现长文档

我正在为iPad上的自定义文档格式实现具有突出显示/注释功能的文档查看器.这些文件有点长(100到200页,如果在纸上打印),我很难找到正确的方法.以下是要求:

1)基本的富文本样式:控制左/右边距.控制字体名称,大小,前景/背景颜色和行间距.大胆,斜体,下划线等

2)选择和突出显示任意文本区域(不限于段落边界,如Safari/UIWebView).

3)自定义剪切/复制/粘贴弹出窗口(UIMenuController)这是应用程序的基本要求之一.

我的第一个实现是基于UIWebView.我只是将文档渲染为带有CSS的HTML文本样式.但我无法获得我想要的那种文本选择行为(跨越段落边界),并且无法从UIWebView中自定义UIMenuController.

所以我开始研究javascript方法,使用JQuery伪装设备文本选择行为来捕获触摸事件并动态修改DOM以更改所选文本区域的背景颜色.我构建了一个假的UIMenuController控件作为隐藏的DIV,定位它并在有活动选择区域时取消隐藏它.

不是太寒酸.

主要问题是它是SLOOOOOOOW.滚动浏览文档非常快捷,但动态更改DOM并不是很顺畅.另外,我无法弄清楚如何重新创建放大镜放大镜,因此我的假文本选择GUI与本机实现看起来并不完全相同.此外,我还没有实现javascript层和objective-c层之间的通信桥梁(应用程序的其余部分存在),但它正在形成一个巨大的麻烦.

所以我一直在关注CoreText,但网上有很少的例子.我用这个简单的小演示花了一点时间:

http://github.com/jonasschnelli/I7CoreTextExample/

它展示了如何使用CoreText将NSAttributedText字符串绘制到UIView中.但它有自己的问题:它没有实现文本选择行为,并且它没有呈现UIMenuController,所以我不知道如何实现这一点.而且,更重要的是,它试图一次性绘制整个文档,对于长文档而言会显着降低性能.我的文档可以包含数千个段落,并且一次只能在屏幕上显示不到1%的文档.

从好的方面来说,这些文档已包含精确的格式信息.我知道每行文本的确切页面位置,所以我不需要布局引擎.

有谁知道如何使用CoreText实现这种视图?我理解一个完整的实现对于这样的问题来说是过度的,但我正在寻找一个有一些基本要求的好的CoreText示例:

1)精确的布局和格式控制(使用我已经计算过的格式化指标和文本样式).

2)任意选择文本.

3)UIMenuController的定制.

4)为屏幕外对象有效地回收资源.

当文本元素滚动到屏幕外时,我很乐意实现自己的回收,但是不需要重新实现UIScrollView吗?

我对iPhone开发是全新的,并且仍然习惯于Objective-C,但我已经使用其他语言(Java,C#,flex/actionscript等)十多年了,所以我对我有能力完成工作,只要我对iPhone SDK有更好的感觉,并为这样的东西提供常见的编码模式.它只是我,还是SDK文档真的很糟糕?

无论如何,谢谢你的帮助!

iphone objective-c ipad core-text

7
推荐指数
1
解决办法
2510
查看次数

从一个代码库开发多个产品的策略

我正在研究一个项目,该项目将(很快)分为多个不同的版本(试用版,专业版,企业版等).

我一直在使用Subversion,因为它首次发布(之前是CVS),所以我对分支和标签的抽象概念感到满意.但在我的所有开发经验中,我只是真正研究过中继代码.在少数情况下,一些其他开发人员(拥有存储库)要求我对某个分支进行更改,我只是做了他要求我做的任何事情.我认为"合并"一种奇怪的黑色艺术,我只是在仔细监督下尝试过.

但在这种情况下,我负责存储库,这种事情对我来说是全新的.

绝大多数代码将在所有产品之间共享,因此我假设代码将始终驻留在trunk中.我还假设每个版本都有一个分支,每个产品的发布版本都有标签.

但除此之外,我不太了解,而且我确信有一千零一种不同的方法来搞砸它.如果可能的话,我想避免搞砸它.

例如,假设我想为专业版和企业版开发一个新功能,但我想从演示版中排除该功能.我怎么做到这一点?

在我的日常开发中,我还假设我需要在工作时将开发快照从分支切换到分支(或返回到主干).以最小化混淆的方式,最好的方法是什么?

您建议的其他策略,指南和提示是什么?


更新:

好吧,那好吧.

看起来分支根本不是正确的策略.所以我改变了问题的标题,以消除"分支"焦点,我正在扩大问题.

我想我的其他一些选择是:

1)我总是可以分发具有所有功能的完整版软件,并使用许可证根据许可证中的授权有选择地启用和禁用功能.如果我采用这种方式,我可以想象一个老鼠的if/else块嵌套调用某种单独的"许可证管理器"对象.在这样的情况下,避免代码意味着什么的最佳方法是什么?

2)我可以使用依赖注入.但一般来说,我讨厌它(因为它将逻辑从源代码转移到配置文件中,这使得项目更难以理解).即便如此,我仍在发布完整的应用程序并在运行时选择功能.如果可能,我宁愿不将企业版二进制文件分发给演示用户.

3)如果我的平台支持条件编译,我可以使用#IFDEF块并构建标志来有选择地包含功能.这适用于像整个GUI面板这样的大而粗糙的功能.但是,对于较小的跨领域音乐会,例如日志记录还是统计跟踪呢?

4)我正在使用ANT构建.是否有像ANT的构建时依赖注入?

version-control build-process release-management

6
推荐指数
1
解决办法
1516
查看次数

NetBeans构建文件永远不正确

我现在的团队已经为所有Java开发标准化了NetBeans,我们使用NetBeans生成的ANT文件作为我们的官方构建过程.

但文件总是错误的.

团队的各个成员正在使用不同版本的NetBeans,显然,它们都会生成略有不同的"build-impl.xml"文件.因此,在IDE启动时,NetBeans将重新生成它认为不正确或过时的这些文件中的任何一个.

但随后(因为这些文件被检入源代码控制,作为我们的官方构建脚本),构建文件通常与存储库不同步.如果我从我的机器上检查自动生成的更改,那么我的团队中的其他一些傻瓜将不得不覆盖他自己的构建脚本的本地副本,导致NetBeans抱怨文件已过时且需要再生.

大多数情况下,这是一个烦恼.每次开发人员签入时,自动生成的构建脚本中的虚假差异都会增加大量噪音.或者IDE经常抱怨外部修改的构建脚本.你不能赢.

但我也有一种持续的唠叨感,即没有人拥有完全正确的构建脚本,我们在整个构建过程中引入了不确定性.

据我所知,这个问题有两种可能的解决方案:

1)标准化特定的NetBeans版本.在我们作为一个团队做出决定之前,不要让人们升级.并且不要让人们在旧版本上徘徊.如果团队中的每个人都使用相同的NB版本,那么这些问题(可能)就会消失.

2)不要将"build-impl.xml"脚本检查到源代码管理中.它由IDE自动生成,因此是"build.xml"和"project.xml"文件的工件.不应将生成的文件(如".class"文件)检入源代码管理,而应在构建过程中重新生成.弄清楚NetBeans使用什么机制来生成"build-impl.xml"文件,并在我们的构建服务器上执行相同的机制.这是否意味着我们的构建服务器必须依赖NetBeans GUI?我希望不是.

你们有什么感想?解决这个问题的正确方法是什么?

svn ant build-process netbeans

6
推荐指数
1
解决办法
849
查看次数

如何在Dropwizard项目中使用Couchbase Java Client?

我一直在查看couchbase-java-client项目,并想知道是否可以在dropwizard项目中使用它.

它看起来很自然,因为couchbase基本上是一个JSON数据库,但java客户端似乎与Jackson不兼容.据我所知,couchbase客户端库包含它自己的JSON库的内部实现,它与那里的所有其他java JSON库不兼容,这真的很奇怪.

我发现JacksonTransformers课程起初很有前途.但仔细观察后,图书馆正在使用一个带阴影版的杰克逊(带有重写的包com.couchbase.client.deps.com.fasterxml.jackson.core).

无论如何,由于dropwizard使用Jackson和Jersey通过REST API编组JSON文档,使用couchbase-java-client库的摩擦力最小的方法是什么?在这种情况下甚至可能吗?

java jackson couchbase dropwizard

6
推荐指数
1
解决办法
779
查看次数

Adobe Flex/AIR:滚动子组件,而不是整个窗口

我正在使用Adobe Flex和AIR开发一个应用程序,我一直在试图弄清楚如何解决滚动问题.

我的主应用程序窗口的基本结构(大大简化)是这样的:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
   paddingTop="0" paddingRight="0" paddingBottom="0" paddingLeft="0"
   width="800" height="600" layout="vertical" verticalAlign="top" 
>
   <mx:VBox id="MainContainer" width="100%" height="100%">
      <mx:Panel id="Toolbars" width="100%" height="25" />
      <mx:HDividedBox width="100%" height="100%" >
         <mx:Panel id="Navigation" minWidth="200" height="100%" />
         <mx:VBox id="MainContent" width="100%">
            <mx:Panel width="100%" height="200" />
            <mx:Panel width="100%" height="200" />
            <mx:Panel width="100%" height="200" />
            <mx:Panel width="100%" height="200" />
            <mx:Panel width="100%" height="200" />
         </mx:VBox>
         <mx:Panel id="HelpContent" minWidth="200" height="100%" />
      </mx:HDividedBox>
      <mx:Panel id="FooterContent" width="100%" height="25" />
   </mx:VBox>
</mx:WindowedApplication>
Run Code Online (Sandbox Code Playgroud)

问题是"MainContent"框可能包含一个巨大的子组件列表,并且该长列表的存在导致垂直滚动条出现在GUI的最高级别,围绕"MainContainer"vbox.

看起来很傻,在整个应用程序窗口周围都有滚动条.

我正在寻找的是一种解决方案,其中滚动条仅应用于"MainContent"vbox(以及Navigation和HelpContent面板,如果它们的内容超出窗口边界).

我在StackOverflow上找到了一个相关的问题,问题的解决方案是在父容器上使用"autoLayout"和"verticalScrollPolicy"属性.

所以我尝试将autoLayout ="false"和verticalScrollPolicy …

apache-flex air layout scrollbars

5
推荐指数
2
解决办法
7258
查看次数

使用git commit history查找项目热点?

我正在加入一个具有漫长而传奇的提交历史的新项目,我想使用该历史记录向我展示项目中的热点:最常见(和最近)编辑的文件.

理想情况下,我想避免编写多行脚本(ruby,python,javascript;无关紧要).

有人知道可以根据提交历史中的活动对git项目文件进行排名吗?

git

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

从CKEditor生成非HTML标记

TL; DR:我想破解CKEditor的内部,以便它为富文本(而不是HTML)生成一种替代格式,我希望专家对这个想法的可行性提出意见.

我正在开发一个需要协作富文本编辑器(如Google Docs)的项目,我正在计划使用操作转换库(ShareJS)来实现它.但由于标记嵌套规则,使用HTML很难实现操作转换.例如,一个天真的OT实现很容易产生这种垃圾:

<b>overlapping bold <i>and</b> italic text.</i>
Run Code Online (Sandbox Code Playgroud)

在HTML中表示此类文本的正确方法更像是这样的:

<b>overlapping bold </b>
<b><i>and</i></b>
<i> italic text.</i>
Run Code Online (Sandbox Code Playgroud)

或者更好的是,像这样:

<span class="bold">overlapping bold </span>
<span class="bold italic">and</span>
<span class="italic"> italic text.</span>
Run Code Online (Sandbox Code Playgroud)

但是,为了获得这些类型的表示,OT实现需要知道HTML标记嵌套的所有规则以及如何纠正错误的合并.

我一直在考虑使用替代形式的标记的可能解决方案,该标记根本不强制执行标记嵌套规则.像这样的东西:

BOLD (start: 0, length: 20)
ITALIC (start: 17, length: 16)
TEXT:overlapping bold and italic text.
Run Code Online (Sandbox Code Playgroud)

使用这样的格式,我可以使用普通的OT库来管理正在进行的diff/rebase/merge操作,然后在更新协作两侧的GUI之前将结果文档转换为HTML.

实现这一点的最简单方法是向CKEditor询问其HTML输出,然后在事后重新构建新格式的文档.但OT会要求我在每个按键上执行转换,这似乎有点太重量级了.出于性能原因,我想知道是否有可能覆盖CKEditor中的默认HTML编写器,要求它在遍历DOM时生成备用格式.

你怎么看?

javascript ckeditor operational-transform

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

使用 Quill 重叠内联注释

在我的应用程序中,用户可以在文档正文的任何​​位置创建边距注释,并且注释锚范围可以任意重叠,如下所示:

This [abc]is a set of [xyz]overlapping[/xyz] comments[/abc]
Run Code Online (Sandbox Code Playgroud)

我正在像这样定义我的评论锚点污点:

let Inline = Quill.import('blots/inline');

class CommentAnchorBlot extends Inline  {
  static create(commentId) {
    let node = super.create();
    node.setAttribute("class", "comment-anchor comment-anchor-" + commentId);
    return node;
  }

  static formats(node) {
    var classNames = node.getAttribute('class').split(/\s+/);
    for (var i = 0, len = classNames.length; i < len; i++) {
      var className = classNames[i];
      if (className.indexOf("comment-anchor-") === 0) {
        return className.replace("comment-anchor-", "");
      }
    }
    return null;
  }
}
CommentAnchorBlot.blotName = 'comment';
CommentAnchorBlot.className = 'comment-anchor';
CommentAnchorBlot.tagName = 'span'; …
Run Code Online (Sandbox Code Playgroud)

quill

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