2012-11-13 66 views
3

我编写了一个generig Monotouch.Dialog元素来显示一个图像(不显示图像选择器),我重用了UIViewElement和ImageElement中的代码,添加了一些参数因此它可以在登录屏幕中使用(例如显示公司徽标等)。自定义Monotouch.Dialog元素中的中心单元格内容

我有这个至今:

public class ImageViewElement : Element, IElementSizing 
{ 
    protected UIImage Image; 
    public CellFlags Flags = 0; 
    public UIViewContentMode Alignment; 

    public enum CellFlags { 
     Transparent = 1, 
     DisableSelection = 2, 
     Both = 3 
    } 

    /// <summary> 
    /// Constructor 
    /// </summary> 
    /// <param name="caption"> 
    /// The caption, only used for RootElements that might want to summarize results 
    /// </param> 
    /// <param name="view"> 
    /// The view to display 
    /// </param> 
    /// <param name="transparent"> 
    /// If this is set, then the view is responsible for painting the entire area, 
    /// otherwise the default cell paint code will be used. 
    /// </param> 
    public ImageViewElement (UIImage image, bool transparent, bool selectable, UIViewContentMode alignment) : base ("") 
    { 
     this.Alignment = alignment; 
     this.Image = image; 

     if(transparent) 
      {Flags+=1;} 
     if(!selectable) 
      {Flags+=2;} 
    } 


    public override UITableViewCell GetCell (UITableView tv) 
    { 
     var cell = tv.DequeueReusableCell (CellKey); 
     if (cell == null) 
     { 
      cell = new UITableViewCell (UITableViewCellStyle.Default, CellKey); 
      cell.ContentMode = UIViewContentMode.BottomRight; 
      switch(Flags) 
      { 
      case CellFlags.Transparent: 
       cell.BackgroundColor = UIColor.Clear; 
       // 
       // This trick is necessary to keep the background clear, otherwise 
       // it gets painted as black 
       // 
       cell.BackgroundView = new UIView (RectangleF.Empty) {BackgroundColor = UIColor.Clear}; 
       break; 
      case CellFlags.DisableSelection: 
       cell.SelectionStyle = UITableViewCellSelectionStyle.None; 
       break; 
      case CellFlags.Both: 
       cell.BackgroundColor = UIColor.Clear; 
       // 
       // This trick is necessary to keep the background clear, otherwise 
       // it gets painted as black 
       // 
       cell.BackgroundView = new UIView (RectangleF.Empty) { 
        BackgroundColor = UIColor.Clear}; 
       cell.SelectionStyle = UITableViewCellSelectionStyle.None; 
       break; 
      } 
      cell.ImageView.ContentMode = Alignment; 
      cell.ContentMode = Alignment; 
      cell.ImageView.Image = Image; 

     } 
     return cell; 
    } 
    public float GetHeight (UITableView tableView, NSIndexPath indexPath) 
    { 
     return Image.Size.Height; 
    } 
} 

到目前为止的所有工作与对齐的异常,图像始终显示左,我试着在小区,在小区的ImageView的设置ContentMode但它不工作, 我能做什么?


编辑:米格尔指出我的界限可能设置不正确,所以我想这:

cell.ContentMode = UIViewContentMode.Right; 
var test = new UIImageView(Image); 
cell.ContentView.Add (test); 

现在我的内容查看边界都是相同的细胞界限,0,0,320,40,他们是没有确定,但我只是在寻找着,我的测试范围是0,0,256,256,但对准仍然没有工作......说不上来怎么办


编辑:一些进展!

我问请教IRC

(2012-11-13 10:10:12) CENSORED: Implement a subclass of UITableViewCell 
(2012-11-13 10:10:26) CENSORED: add the Image as a subview in the init method of the new class 
(2012-11-13 10:10:33) CENSORED: and override layouSubviews 
(2012-11-13 10:10:36) CENSORED: with the line: 
(2012-11-13 10:10:56) CENSORED: imageView.Center = this.Center; 
(2012-11-13 10:11:14) CENSORED: (call super first as well) 
(2012-11-13 10:11:25) CENSORED: that way the image will always remain centred in the cell 

(2012-11-13 10:38:23) CENSORED: AndreSM: UITableViewCell already has a UIImageView property (named ImageView) 
(2012-11-13 10:38:36) CENSORED: you can just use that instead of creating a new one 

所以我说干就干,创建一个子类:

public class ImageViewCell: UITableViewCell 
{ 
    UIImage cellImage; 

    public ImageViewCell (UIImage image, NSString key) : base(UITableViewCellStyle.Default, key) 
    { 
     cellImage = image; 
     ImageView.Image = cellImage; 
    } 

    public override void LayoutSubviews() 
    { 
     base.LayoutSubviews(); 
     ImageView.Center = ContentView.Center; 
     ImageView.SetNeedsDisplay(); 
    } 
} 

但图像还是有点偏离中心,这里是一个屏幕截图,让你可以我的意思:

enter image description here

enter image description here

我不明白这样做的原因,我检查什么是新的中心和值是正确的(160 X轴..)

enter image description here

+0

那么什么是你究竟想实现,图片的排列或设置一个新的形象(我假设对齐? ) –

+0

对齐,它应该是微不足道的,但图像不居中,我只是希望它在中心。这真的很奇怪,因为坐标是正确的 – Radius

+0

中心不应该是160.屏幕宽度是320,并且从左侧和右侧插入contentview。因此,当单元格显示时contentview宽度不能为320,但应该更小 – svn

回答

2

的问题是,中心在PARENT坐标空间中定义。因此,ContentView的Center属性在它的PARENT(UITableViewCell,它本身就是一个视图)的空间中定义。但ImageView中心是在作为ContentView的imageView的父级的坐标空间中定义的。

此代码应通过计算contentviews中心解决它自己的坐标空间

public override void LayoutSubviews() 
{ 
    base.LayoutSubviews(); 
    ImageView.Center = new PointF(ContentView.Bounds.Width/2,ContentView.Bounds.Height/2); 
    ImageView.SetNeedsDisplay(); 
} 
+0

我会测试并回传,谢谢! – Radius

+0

标记为答案,谢谢! – Radius

相关问题