在Xcode 5中,我创建了a single view iPhone app并将其检入GitHub。

我想显示5个带有随机字母及其值的可拖动图块。

我更喜欢在情节提要板中定义图块,然后从那里实例化(5次)-因为这样我可以轻松编辑图块(例如,在图块内部移动标签)。

当前,我的项目如下所示(此处为fullscreen of Xcode):



目前,情节提要中只有一个磁贴,并且可以拖动:



我添加了一个Tile类,但是不知道如何连接其出口(因为我只能ctrl拖动到ViewController.h,而不能拖动到Tile.h):

在这里Tile.h

@interface Tile : UIView

// XXX How to connect the outlets?
@property (weak, nonatomic) IBOutlet UIImageView *background;
@property (weak, nonatomic) IBOutlet UILabel *letter;
@property (weak, nonatomic) IBOutlet UILabel *value;

@end


Tile.m

#import "Tile.h"

static NSString* const kLetters =  @"ABCDEFGHIJKLMNOPQRSTUWVXYZ";
static UIImage* kTile;
static UIImage* kDragged;

@implementation Tile

+ (void)initialize
{
    // do not run for derived classes
    if (self != [Tile class])
        return;

    kTile    = [UIImage imageNamed:@"tile"];
    kDragged = [UIImage imageNamed:@"dragged"];
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        NSString* randomLetter = [kLetters substringWithRange:[kLetters rangeOfComposedCharacterSequenceAtIndex:random()%[kLetters length]]];
        int randomInteger = (int)arc4random_uniform(10);

        _background.image = kTile;
        _letter.text = randomLetter;
        _value.text = [NSString stringWithFormat:@"%d", randomInteger];
    }
    return self;
}

@end


最后ViewController.m

#import "ViewController.h"

static int const kNumTiles = 5;

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

    for (int i = 0; i < kNumTiles; i++) {
        // TODO: add a Tile to the VC here
    }
}

- (IBAction)dragTile:(UIPanGestureRecognizer *)recognizer
{
    UIView *tile = recognizer.view;

    if (recognizer.state == UIGestureRecognizerStateBegan ||
        recognizer.state == UIGestureRecognizerStateChanged) {

        CGPoint translation = [recognizer translationInView:[tile superview]];

        [tile setCenter:CGPointMake(tile.center.x + translation.x,
                                    tile.center.y + translation.y)];

        [recognizer setTranslation:CGPointZero inView:tile.superview];

        // TODO: instead of tile.png display dragged.png with shadow
    }
}

@end


在后一个文件中,我不知道


如何从情节提要中实例化5个图块?
拖动图块时如何显示阴影(dragged.png)?


更新:

正如Fogmeister所建议的(谢谢!),我添加了一个新文件Tile.xib

(在Xcode菜单中选择:文件->新建->文件...->用户界面->视图)

然后,将自定义类设置为Tile,但是在哪里可以设置(正方形)尺寸?



(此处fullscreen

更新2:

对于Tile.xib,我已将Size设置为“自由格式”,将Drawing设置为“不透明”,并且尺寸设置为100 x 100(此处为fullscreen):



为什么我的自定义UIView会有白角?如何使背景透明?



我也想知道,如何在Interface Builder中切换电池的显示?

最佳答案

如何从情节提要中实例化5个图块。

我认为在这里要意识到的是,故事板并不是所有解决方案的解决方案,而应该与已经存在的工具套件一起使用。

例如。以这种方式创建视图的多个实例并不是使用Storyboard可以很好地完成的。故事板应被视为提供应用程序的整体骨干。

为此,我可以采用以下两种方法之一...

第一路

创建一个名为Tile.xib的新NIB文件,并在其中布局单个Tile视图。将插座连接到Tile类文件。现在在您的视图控制器中,您可以使用笔尖加载Tile类进行布局...

Tile *tile = [[[NSBundle mainBundle] loadNibNamed:@"Tile" owner:self options:nil] firstObject];
tile.frame = //blah
[self.view addSubview:tile];


第二路

或忘记笔尖,然后在Tile.m文件的代码中全部加载Tile视图。然后像加载...

Tile *tile = [[Tile alloc] initWithFrame:someFrame];
[self.view addSubview:tile];


拖动图块时如何显示阴影(draged.png)?

为此,您需要在平铺视图的图层上设置阴影。

tile.layer.shadowColor = [UIColor blackColor].CGColor;
tile.layer.shadowRadius = 4.0;
// etc...


您可以在此处阅读有关阴影的更多信息...

https://developer.apple.com/library/mac/documentation/graphicsimaging/reference/CALayer_class/Introduction/Introduction.html#//apple_ref/doc/uid/TP40004500-CH1-SW78

评论后编辑

为此,我将在Tile.h上拥有一个BOOL属性,其名称类似于isDragging。甚至是带有TileStateTileStateDragging的名为TileStateStatic的枚举。

然后有一个方法...

- (void)setDragging:(BOOL)dragging
{
    _dragging = dragging;

    if (_dragging) {
        //set to the shadow image.
    } else {
        //set the none shadow image.
    }
}


其他注意事项

当前,您在initWithFrame类的Tile中包含代码,但是您正在使用笔尖(在这种情况下为storyboard)加载类。这将运行方法initWithCoder而不是initWithFrame,因此该代码将永远不会运行。

如果要在创建类时运行代码,则最好使用方法awakeFromNib

关于ios - 从Storyboard实例化几个可拖动的图块-测试代码和屏幕截图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22148835/

10-12 02:39