Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 您将如何构建网格并与之交互,如数独板?_Iphone_Objective C_Cocoa Touch - Fatal编程技术网

Iphone 您将如何构建网格并与之交互,如数独板?

Iphone 您将如何构建网格并与之交互,如数独板?,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,您认为为原生iPhone应用程序实现类似数独板的交互式网格的最佳方式是什么?我在SDK中没有看到满足这种需求的对象 我是否应该为单个单元格创建一个自定义控件,然后在网格形式中初始化所需数量的单元格 (来源:) 欢迎提出任何意见。 谢谢 网格是查看内容的一种手段,而不是存储表示。最终,网格由包含内容的单元格组成,因此,单元格可能是底层模型对象的最佳体现。数独游戏的底层存储设计有多种方法,更大的挑战肯定在于谜题的生成。但是,从中得到的建议是,不要根据模型在屏幕上的显示方式来确定模型-视图层是完全独

您认为为原生iPhone应用程序实现类似数独板的交互式网格的最佳方式是什么?我在SDK中没有看到满足这种需求的对象

我是否应该为单个单元格创建一个自定义控件,然后在网格形式中初始化所需数量的单元格


(来源:)

欢迎提出任何意见。
谢谢

网格是查看内容的一种手段,而不是存储表示。最终,网格由包含内容的单元格组成,因此,单元格可能是底层模型对象的最佳体现。数独游戏的底层存储设计有多种方法,更大的挑战肯定在于谜题的生成。但是,从中得到的建议是,不要根据模型在屏幕上的显示方式来确定模型-视图层是完全独立的,因此像将电路板存储为二维阵列这样的操作是个坏主意。

您可以使用UIView或CALayers作为主superview的子视图来执行此操作。至少需要81个(数独网格中的每个数字对应一个)。层的重量更轻,资源消耗更少,但视图的功能更多一些。你选择哪一个取决于你想做什么。

有一篇关于如何实现数独解算器的文章。我认为它使用了如下数据结构:

  • 网格有81个单元
  • 单元格有三种组成员身份:一列、一行和一个框
  • 一个组有9个单元格(参考)
单元还有一些属性,具体取决于您希望对结构执行的操作:

  • 价值
  • 隐藏
    标志(用于游戏)
  • 一组可能的值(用于解算器)

对于这样一个完全统一的网格,我将创建一个
UIView
的子类,并让它通过一个简单的计算来确定用户接触过的行和列:

int touchedRow = 9 * touch.x / [self bounds].width; int touchedCol = 9 * touch.y / [self bounds].width; int touchedRow=9*touch.x/[self-bounds].宽度; int touchedCol=9*touch.y/[self-bounds].宽度;
我认为在内存中创建81个单独的对象没有多大好处,而一个对象就足够了。

我以前玩过数独游戏,我在一个视图中绘制了网格线和数字。这并不是因为内存限制(使用单个控件和可重用单元内存应该不太重要),而是因为计算网格和数字的位置只需要一些简单的数学运算,而且编程视图一开始会更容易。如果以后您开始对视图类中大量的绘图和事件处理代码感到不知所措,那么您可能希望创建一个可重用的单元对象来完成大部分工作,类似于UITableView

如果您需要或不需要动画,核心动画肯定也可以在这里使用。数独板可能不会有太多的动画,但如果你有(可能是滑动“选择”框?),这可能是更好的选择。

我一直在使用。这是一个伟大的“进入”的乐趣和不幸的网格。我将其与一个算法相结合,该算法查看“所需”对象和可用“帧”的数量,并告诉我最佳列/行数。想想模<代码>整数%int

- (void)awakeFromNib {
    self.wantsLayer = YES;
    CALayer *grid = self.layer;
    grid.backgroundColor = CGColorCreateGenericRGB(0.1, 0.1, 0.4, .8);
    grid.layoutManager = [CAConstraintLayoutManager layoutManager];   
    int rows = 8;    int columns = 8;
    for (int r = 0; r < rows; r++) {
        for (int c = 0; c < columns; c++) {
            CALayer *cell = [CALayer layer];
            cell.borderColor = CGColorCreateGenericGray(0.8, 0.8);
            cell.borderWidth = 1;  cell.cornerRadius = 4;
            cell.name = [NSString stringWithFormat:@"%u@%u", c, r];
            [cell addConstraint:
            [CAConstraint constraintWithAttribute: kCAConstraintWidth
                relativeTo: @"superlayer"
                attribute: kCAConstraintWidth
                scale: 1.0 / columns  offset: 0]];
            [cell addConstraint:
            [CAConstraint constraintWithAttribute: kCAConstraintHeight
                relativeTo: @"superlayer"
                attribute: kCAConstraintHeight
                scale: 1.0 / rows   offset: 0]];
            [cell addConstraint:
            [CAConstraint constraintWithAttribute: kCAConstraintMinX
                relativeTo: @"superlayer"
                attribute: kCAConstraintMaxX
                scale: c / (float)columns   offset: 0]];
            [cell addConstraint:
            [CAConstraint constraintWithAttribute: kCAConstraintMinY
                relativeTo: @"superlayer"
                attribute: kCAConstraintMaxY
                scale: r / (float)rows    offset: 0]];
        [grid addSublayer:cell];
}   }   }
-(void)从NIB唤醒{
self.wantsLayer=是;
CALayer*网格=self.layer;
grid.backgroundColor=CGColorCreateGenericRGB(0.1,0.1,0.4,8);
grid.layoutManager=[CAConstraintLayoutManager layoutManager];
int行=8;int列=8;
对于(int r=0;r

非常简单。我将gridView用作UiViewController类,并在gridView.m中添加以下代码

#import "SudokuClass.h"
#import "GridView.h"

@interface GridView ()

@end

@implementation GridView


-(void)createNumberButton {

    int cellWidth = 34;
    int cellHeight = 34;
    int xSta = 7 - cellWidth;
    int ySta = 50 - cellHeight;
    //NSMutableDictionary *buttonTable = [[NSMutableDictionary alloc] initWithCapacity:81];
    for (int i = 1; i < 10; i++) {
        xSta = xSta + cellWidth;
        for (int j = 1 ; j < 10; j++) {
            ySta = ySta + cellHeight;
            CGRect pos = CGRectMake(xSta, ySta, cellWidth, cellHeight);
            UIButton *b = [SudokuClass createSudokuButtonForView:self atPos:pos 
                                                           withTag:j*10+i forAction:@selector(numButtonPressed:)];
            NSString *picName = @"ButtonPic.jpg";
            [b setBackgroundImage:[[UIImage imageNamed:picName] stretchableImageWithLeftCapWidth:0 topCapHeight:0]  forState:0];
            [self.view addSubview:b];
            //[numButtons addObject:b];
        }
        ySta = 50 - cellHeight;
    }}
-(void)viewDidLoad
{

    [self createNumberButton];
    [super viewDidLoad];
}
@end

希望所有人都觉得它有用:)

这是一个很好的答案,但我不知道如何使用所有这些灰色和黑色边框+选择部分时的缩放功能来实现。。!查看我下面的帖子,了解更多我想做的事情。。谢谢我认为这是一个合理的答案,但我不知道如何利用UITableViewCell实现我需要添加的数独网格+缩放功能。。请查看我下面的帖子了解更多详情,如果有任何答案,请告诉我。。谢谢是的。。。。。!我们需要在网格上添加滑动和缩放功能。。你能告诉我怎么做吗?请帮帮我。。!我曾使用n x n UIImageView来实现这些功能,但当我缩放时,自动调整大小无法正常工作,一些图像会拉伸。。。而且,动画很慢。。。!顺便说一句,我把网格构造逻辑放在ViewDidLoad()中,所以导航是p
+(UIButton *)createSudokuButtonForView:(UIViewController *)view atPos:(CGRect)position withTag:(int)tag forAction:(SEL)action {
UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
[b setFrame:position];
[b.titleLabel setFont:[UIFont boldSystemFontOfSize:15]];
[b setTag:tag];
[b addTarget:view action:action forControlEvents:UIControlEventTouchDown];
[b setTitle:@"" forState:0];
[b setTitleColor:[UIColor blackColor] forState:0];
//b.layer.frame = CGRectMake(xSta-1, ySta-1, 31, 31);
//[b.layer setBorderWidth:borderWidth];


b.userInteractionEnabled = YES;
return b;}