在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
。甚至是带有TileState
和TileStateDragging
的名为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/