我现在已经添加了一笔奖金,奖励给任何可以拍摄下面三张图片的人,并制作UITableView的工作实现,模仿游戏中心的外观和感觉在游戏标签上。实现必须使用非分组的tableview,但是演示四个单元格变体(顶部,中间,底部和单个)中的每一个
有人能否了解Apple如何实现游戏标签上出现的游戏中心 tableview格式?
我特别指的是他们如何绘制边框,以及它们如何使其与底层的绿色噪音纹理混合。
我尝试使用Quartz 2D绘制自己的边框,但似乎无法获得接近相同质量的任何地方,我认为使用具有低alpha分量的颜色绘制将实现纹理混合但这似乎不是这样的。
如果有人可以放弃任何光线,或者甚至分享任何适当的代码,我将会非常感激。
编辑:
我注意到的一点是tableview不符合通常的行为。在正常分组的tableview中,背景是静止的,单元格在其上滚动,但在Game Center(,特别是tableview我关注)中,背景与单元格一起滚动。这让我相信桌面视图根本没有分组,这只是混合Quartz 2D绘图和图像的错觉。
编辑:
所以我做了一点点,看起来好像Apple通过使用标准的tableviewcell,无缝纹理,边框纹理和单元掩码来创建分组tableview的错觉。所有这些结合起来就消除了这种错觉,并支持我的理由,即为什么背景会随着细胞滚动(到目前为止我还无法复制)。
游戏中心单元格背景纹理(无缝)
游戏中心单元格边框纹理
游戏中心单元格面具
现在我必须弄清楚他们如何将所有这些结合起来以消除这种错觉。任何帮助将不胜感激。
实际的游戏中心表和下面提到的@psycho解决方案之间的差异,你可以看到它还有一段距离;单元格宽度太窄,边框太薄,圆角半径太大。
答案 0 :(得分:2)
他们正在删除所有默认的绘图/边框,只使用带有自己图像的自定义单元格。
关于你的编辑:这是不正确的。我也实现了这种行为。 ,之前,我不记得我是怎么做到的,我想我直接在桌面视图上设置了背景图片,而不是背后的视图。(参见下面的代码。)
修改强>
这是我用来模仿单元格“拖动”部分背景的行为的代码:
- (void)viewDidLoad {
[super viewDidLoad];
[self.tableView setRowHeight:65.0];
[self.tableView setBackgroundColor:[UIColor clearColor]];
[self.tableView setBackgroundView:nil];
[self.view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"metal_settings.png"]]];
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
[self setContentSizeForViewInPopover:CGSizeMake(300, 300)];
}
我把它放在一个UITableViewController子类中,并在几个实例中继承了它。仔细观察,细胞外的“颜色”/纹理随细胞一起移动。
答案 1 :(得分:1)
我不确定是否回答了你所要求的内容,因为我使用了分组的tableView,但是在测试时它似乎可以解决问题,并且背景会随着单元格滚动,因为它可以在游戏中心看到。 / p>
顺便说一句,抱歉,我不使用目标C而是使用Monotouch和C#,但我从经验中知道,当找到用另一种语言编写的有趣技巧时,从一个到另一个找到绑定并不是那么难。
好吧,停止bab呀学语,这是代码。
public class test : UIScrollView {
UIImage _borderTexture = null;
int _paddingTop = 10;
public test (RectangleF frame) : base (frame) {
//setting the green background for the whole view
BackgroundColor = UIColor.FromPatternImage(new UIImage("bg.png"));
//initializing texture for borders
_borderTexture = new UIImage("bt.png");
//adding some various-sized tables
addTable(new string[] {"lonely cell"});
addTable(new string[] {"top cell", "middle cell 1", "middle cell 2", "bottom cell"});
addTable(new string[] {"this", "is", "a", "quite", "long", "table", "for", "an", "exemple"});
//and then we adjust the scroll size to contents
ContentSize = new SizeF(frame.Size.Width, _paddingTop);
}
void addTable(string[] contents) {
// approximately keeping track of content's heights to adjust scrollView size
// the table must be AT LEAST as high as its content to avoid its own scroll
int approximativeHeight = contents.Length * 44 + 25;
UITableView t = new UITableView(new RectangleF(10, _paddingTop, Frame.Width - 20, approximativeHeight), UITableViewStyle.Grouped);
_paddingTop += approximativeHeight;
//make the tableView's background invisible
t.BackgroundColor = UIColor.FromWhiteAlpha(0, 0);
//setting the yellow texture for cell borders
t.SeparatorColor = UIColor.FromPatternImage(_borderTexture);
//using our own data source to customize cells at creation
t.DataSource = new testTVDataSource(contents);
//finally, add the custom table to the scroll view
AddSubview(t);
}
}
public class testTVDataSource : UITableViewDataSource {
string[] _contents = null;
string _cellID = "reuse";
public testTVDataSource(string[] contents) {
_contents = contents;
}
public override int RowsInSection (UITableView tableView, int section) {
return _contents.Length;
}
public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath) {
var cell = tableView.DequeueReusableCell (_cellID);
if (cell == null) {
cell = new UITableViewCell (UITableViewCellStyle.Default, _cellID);
//make all backgrounds of the cell and its subviews to be invisible
cell.BackgroundColor = UIColor.FromWhiteAlpha(0, 0);
cell.TextLabel.BackgroundColor = UIColor.FromWhiteAlpha(0, 0);
//avoid the blue highlighting when selected
cell.SelectionStyle = UITableViewCellSelectionStyle.None;
}
//just some content for test
cell.TextLabel.Text = _contents[indexPath.Row];
return cell;
}
}
所以主要的调整在于使你的tableView透明且高度足以让它不需要滚动,并将其粘贴到scrollView中,它将滚动其背景及其内容(这里是tableViews。)