3

Generig Monotouch.Dialog要素をコーディングして画像(画像ピッカーを表示しない)を表示します。UIViewElementとImageElementのコードを再利用し、いくつかのパラメーターを追加して、たとえばログイン画面で使用できるようにします(会社のロゴなどを表示)。

私はこれまでにこれを持っています:

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

これで、ContentViewの境界はセルの境界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 ();
    }
}

しかし、画像はまだ少し中心から外れています。これがスクリーンショットなので、私が言っていることを理解できます。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

その理由がわかりません。新しい中心が何であるかを確認し、値が正しいことを確認しました(X軸で160)。

ここに画像の説明を入力してください

4

1 に答える 1

2

問題は、中心が親座標空間で定義されていることです。したがって、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 ();
}
于 2012-12-13T12:37:51.470 に答える