#iphone #xcode
#iPhone #xcode
Вопрос:
Я новичок в iphone и xcode. Возможно, это очень простой вопрос, но я не смог найти пример кода в книгах. Я хочу сделать следующее:
- На экране должно быть 2 UIView
- Каждый вид будет переходить по цвету радуги (красный / оранжевый / желтый / зеленый / синий / индиго / фиолетовый) с помощью средства распознавания жестов, например, если текущий цвет зеленый, если пользователь проводит пальцем вверх, UIView меняется на желтый, если пользователь проводит пальцем вниз, UIView меняется на синий.
- Следовательно, каждый вид должен будет сохранять текущий цвет и соответствующим образом реагировать на пролистывания.
Я понимаю, как реализовать обнаружение пролистываний с помощью распознавателя жестов, но я не знаю, как заставить каждое представление сохранять отдельную переменную для текущего цвета. Мне нужен универсальный код, потому что в моем приложении будет более 2 UIViews, как только я выясню, как это делается.
Заранее спасибо.
Ответ №1:
Вы можете создать подкласс UIView
, чтобы включить любые переменные, которые вам нравятся:
ColorSwiperView.h
@interface ColorSwiperView : UIView
{
ColorType currentColor;
}
@property (nonatomic, assign) ColorType currentColor;
@end
ColorSwiperView.m
@implementation ColorSwiperView
@synthesize currentColor;
- (id)initWithFrame:(CGRect)frameRect
{
if ((self = [super initWithFrame:frameRect]) == nil) { return nil; }
currentColor = red;
return self;
}
@end
Будет использоваться следующим образом:
#import "ColorSwiperView"
...
ColorSwiperView * cView = [[ColorSwiperView alloc] initWithFrame:...];
cView.currentColor = green;
Примечание: предполагается, что вы определили перечисление для цветов:
typedef enum
{
red = 0,
green = 1,
...
}
ColorType;
Ответ №2:
возможно, определение подкласса UIView что-то вроде:
@interface RainbowView : UIView {
UIColor *currentColor;
}
@property (nonatomic, retain) UIColor *currentColor;
@end
и создание 2 (или более) представлений этого класса в вашем контроллере просмотра в качестве выходных данных (если вы используете interface Builder):
@class RainbowView;
@interface RainBowViewController : UIViewController {
RainbowView *rainbowView1;
RainbowView *rainbowView2;
}
@property (nonatomic, retain) IBOutlet RainbowView *rainbowView1;
@property (nonatomic, retain) IBOutlet RainbowView *rainbowView2;
@end
Ответ №3:
Так как вы собираетесь поддерживать массив цветов, скажем colorsArray
, и назначать представлениям их цвет из этого выбора. Вы можете сделать это в обработчике прокрутки.
- (void)handleSwipe:(UISwipeGestureRecognizer*)swipeGesture {
UIView *view = swipeGesture.view;
NSInteger currentColorIndex = [colorsArray indexOfObject:view.backgroundColor];
NSInteger nextColorIndex = currentColorIndex 1;
if ( nextColorIndex == [colorsArray count] ) {
nextColorIndex = 0;
}
view.backgroundColor = [colorsArray objectAtIndex:nextColorIndex];
}
Таким образом, вам не нужно создавать подклассы.
Создание подклассов
Вы можете создать подкласс UIView
и добавить в него свои собственные переменные экземпляра. Скажите,
@interface RainbowView: UIView {
NSInteger currentColorIndex;
}
@property (nonatomic, assign) NSInteger currentColorIndex;
...
@end
@implementation RainbowView
@synthesize currentColorIndex;
...
@end
В вашем методе обработки жестов,
- (void)handleSwipe:(UISwipeGestureRecognizer*)swipeGesture {
RainbowView *aView = (RainbowView*)swipeGesture.view;
// Get the next color index to aView.currentColorIndex;
aView.backgroundColor = [colorsArray objectAtIndex:nextColorIndex];
aView.currentColorIndex = nextColorIndex;
}