2012-03-11 62 views
3

我使用的是由Alxandr(2012年2月)创建的最新版本。有没有人使用过MT.D MultilineEntryElement?

我想将它添加到使用与我将添加EntryElement相同的技术的部分。 MultilineEntryElement添加到该部分,但接收单元不会扩展超过其默认大小。 MLEE将会覆盖下面的部分。我希望它默认为全屏宽度和10行。做这个的最好方式是什么?

谢谢你! Matt

+0

马特,你有没有永远解决这个?我试图写我自己的MLEE,但碰到类似的问题。我在github上发现了另一个impl(SuperYeti),但它也遭受同样的问题。你在哪里找到alxandr的代码btw?我在Miguel的pull requests页面上看到了它的引用,但从未找到任何源代码... – 2012-06-03 06:34:23

回答

0

我对这个问题做了一些研究。请注意 - 我正在使用自己的MultilineEntryElement实现,它可能与其他实现方式有所不同。

首先,值得说明的是,在“简单”场景中,这个问题并没有表现出来 - 其中MultilineEntryElement放置在作为RootElement初始创建的一部分而创建的部分内。这个问题仅在我操纵已经由DialogViewController呈现的现有RootElement时才会显现出来。

看来,MonoTouch.Dialog计算行的大小的方式存在一个错误。如果一个元素实现IElementSizing,那么MT.D将调用它的GetHeight()重载。一旦MT.D检测到具有“不规则”高度的元素,每次处理对封闭部分的改变时似乎都需要调用该方法。这可能很昂贵...因此,如果MT.D列出了一个RootElement并且没有找到实现IElementSizing的元素,它似乎(可能是为了优化?)MT.D将忽略任何元素的IElementSizing信息添加POST初始渲染。所以CELL的RowHeight属性将返回一个标准的行高,MultilineEntryElement将呈现一个溢出它下面的单元格的UITextView。

我想到的解决方法是创建一个名为DummyElement的简单元素,该元素实现IElementSizing并为GetHeight()返回0,并在初始布局发生之前将其添加到初始RootElement。如果你这样做了,MT.D会注册到一个不规则高度的元素,并且当你稍后将它添加到元素“DOM”时,在MultilineEntryElement上调用GetHeight()方法。

这里是我的DummyElement的最小IMPL情况下,它可以帮助:

public class DummyElement : Element, IElementSizing 
{  
    public DummyElement() : base ("empty") 
    { 
    } 

    public float GetHeight (UITableView tableView, NSIndexPath indexPath) 
    { 
     return 0; 
    } 
} 
3

为了解决这个问题,rootElement的的UnevenRows属性设置为true,像这样:

var r = new RootElement ("foo") { ... } 
r.UnevenRows = true;