Cutsom UITableViewCell基于UITableViewCellStyleSubtitle

时间:2015-10-02 09:22:14

标签: c# ios uitableview xamarin uiimageview

我对iOS SDK很陌生,所以我正在努力学习如何正确地做事,所以请随意指出除了我的问题之外我正在做的事情的任何缺陷。我也使用Xamarin框架,但我可以或多或少地将Obj-C翻译成我正在做的事情,所以答案都很好。

我正在创建一个与UITableViewCellStyleSubtitle非常相似的自定义单元格。事实上唯一的区别是我想要一个稍高的单元格大小和单元格右侧的日历图标。要做日历图标,我有2个UIL用于充当日历的上半部分和下半部分。通过这种方式,我可以动态地将文本放入月份和日期:

public pendingMessagesCell (NSString cellId) : base(UITableViewCellStyle.Subtitle, cellId)
    {

        _calendarBottom = new UILabel () {
            TextColor       = UIColor.White,
            BackgroundColor = UIColor.Gray,
            TextAlignment   = UITextAlignment.Center
        };

        _calendarTop    = new UILabel () {
            TextColor       = UIColor.White,
            BackgroundColor = UIColor.DarkGray,
            TextAlignment   = UITextAlignment.Center
        };

按照this堆栈溢出问题中的指南,我在EstimatedRowHeigh中使用UITableView.AutomaticDimensionTableViewController

public class pendingMessageTableViewController : UITableViewController
{
    /// <summary>
    /// Parent Controller.
    /// </summary>
    private pendingViewController _controller;
    /// <summary>
    /// Messages pending 
    /// </summary>
    private IList<Message> pendingMessages;


    /// <summary>
    /// Initializes a new instance of the <see cref="SaltAndPepper.ios.pendingMessageTableViewController"/> class.
    /// </summary>
    public pendingMessageTableViewController (UITableViewStyle style) : base(style)
    {

    }

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        pendingMessages     = new List<Message> ();
        pendingMessages     = MessageManager.GetMessages ();
        var source          = new pendingTableMessageViewSource (pendingMessages);
        TableView.Source    = source;
        TableView.RowHeight = UITableView.AutomaticDimension;
        TableView.EstimatedRowHeight = 66;
        TableView.TableFooterView = new UIView(CoreGraphics.CGRect.Empty);
        this.AutomaticallyAdjustsScrollViewInsets = false;
    }

然后在我的UITableViewSource子类中,我重写了GetCell:

public override UITableViewCell GetCell (UITableView tableView, Foundation.NSIndexPath indexPath)
    {
        var row                 = indexPath.Row;
        var cell    = tableView.DequeueReusableCell (_Cell) as pendingMessagesCell;

        if (cell == null) {
            cell = new pendingMessagesCell ((NSString)_Cell);
        }

        UIImage img = GetContactInfo ();
        cell.UpdateCell (_data [indexPath.Row].Recipient.ToString (), _data [indexPath.Row].Text.ToString (), "Aug", "12", img);
        cell.SetNeedsUpdateConstraints ();
        return cell;

    }

最后在我的UITableViewCell子类中,我在构造函数中声明:

TextLabel.TranslatesAutoresizingMaskIntoConstraints        = false;
DetailTextLabel.TranslatesAutoresizingMaskIntoConstraints  = false;
_calendarTop.TranslatesAutoresizingMaskIntoConstraints     = false;
_calendarBottom.TranslatesAutoresizingMaskIntoConstraints  = false;

DetailTextLabel.LineBreakMode = UILineBreakMode.TailTruncation;
ContentView.AddSubviews (new UIView[]{ _calendarBottom, _calendarTop });

然后,我继续在动态单元格高度上面提到的stackoverflow链接之后添加约束。

我的问题是这样的:我一直在尝试使用自动布局使整个类具有约束,但对于ImageView的特定情况,我不想使用约束,因为我喜欢默认实现(类型) UITableViewCells ImageView。首先,我想要一个圆形图像,而不是UITableViewCell.ImageView的默认方形图像。如果我继续使用:

ImageView.Layer.CornerRadius = ImageView.Frame.Size.Width / 2;
ImageView.ClipsToBounds = true;

在我的Cell子类中的LayoutSubview中,图像(从联系人thumbnailImageData获取)是圆形的,但对我来说有点大:

Large Thumbnails

所以我尝试将TextLabel和DetailedTextLabel上的约束添加到ImageView左侧并调整帧大小     ImageView.Frame = new CoreGraphics.CGRect(         ImageView.Frame.X,         (ContentView.Frame.Height / 2) - ((ImageView.Frame.Height * .75)/ 2),         ImageView.Frame.Width * .75,         ImageView.Frame.Height * .75);

然后bam图像以我想要的大小为中心。 (在UpdateConstraints中完成约束,在LayoutSubViews中完成图像大小调整):

Working Image Resize and Constraints

当我查看关于此的表单信息时,我遇到了一个SO问题HERE,它说我不应该使用TextLabel等单元格的Style项目的约束,所以我很困惑如何去做这件事。我喜欢Subtitle Cell Style的大部分定位,只是想进行一些小的调整。我是以一种糟糕的方式解决这个问题,还是应该用自建的UILables限制自己的一切。如果是这样,是否有关于字幕细胞样式默认定位的文档供我参考?我还没找到。

1 个答案:

答案 0 :(得分:0)

因此,如果您想要一个更简单的路线,而不是重新创建一个全新的Cell,只需将Accessory视图分配给您自己的自定义视图,即日历视图。会自动调整一切。

如果您想继续按现在的方式行事,只需保留自定义单元格,但再次将日历移动到附件视图中。只要你先设定它的尺寸,它就会很完美。