#iphone #uiscrollview #uibutton #uipagecontrol
#iPhone #uiscrollview #uibutton #uipagecontrol
Вопрос:
Используя пример просмотра прокрутки Эрики Садун, я создал проект. Теперь у меня есть вид прокрутки и элемент управления страницей в моем проекте. Я создаю новый вид для каждой страницы и добавляю его в свой вид прокрутки, как показано ниже. В каждом представлении есть 5 кнопок, поэтому я могу прокручивать 5 на 5. Однако кнопки, похоже, не включены. Есть идеи, почему?
// Create the scroll view and set its content size and delegate
sv = [[[UIScrollView alloc] initWithFrame:CGRectMake(0.0f, 200.0f, 300.0f, 60.0f)] autorelease];
sv.contentSize = CGSizeMake(NPAGES * 300.0f, sv.frame.size.height);
sv.pagingEnabled = YES;
sv.delegate = self;
// Load in all the pages
for (int i = 0; i < NPAGES; i )
{
UIView *menuView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 300.0f, 60.0f)];
for (int j = 0; j < 5 * (i 1); j )
{
UIImage *menuImage = [UIImage imageNamed:@"menuimage.png"];
UIImage *menuImage2 = [UIImage imageNamed:@"menuimageselected.png"];
UIButton *menuButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
menuButton.frame = CGRectMake(j * 60.0f, 0.0f, 60.0f, 60.0f);
[menuButton addTarget:self action:@selector(menuButtonClicked) forControlEvents:UIControlEventTouchUpInside];
menuButton.tag = j 5 * i;
menuButton.backgroundColor = [UIColor clearColor];
[menuButton setImage:menuImage forState:UIControlStateNormal];
[menuButton setImage:menuImage2 forState:UIControlStateSelected];
[menuButton setImage:menuImage2 forState:UIControlStateHighlighted];
[menuButton setEnabled:YES];
[menuImage release];
[menuButton release];
[menuView addSubview:menuButton];
}
[sv addSubview:menuView];
[sv bringSubviewToFront:menuView];
[menuView release];
}
[self.view addSubview:sv];
Комментарии:
1. Как вы говорите, что они не включены?
2. Здесь вы не внедрили никакого селектора, так как же вы можете сказать, что кнопка не включена? И снова, пожалуйста, уточните, что на самом деле вы хотите сделать.
3. в этом коде так много ошибок 1. никогда не пытайтесь сохранить кнопку 2. Я не думаю, что вы получите что-либо на своей второй странице, потому что ваш MenuView.frame.origin.x всегда равен 0 3. вам нужно добавить цель для вашего события нажатия кнопки
4. @7KV7: не включено, я имею в виду, что изображение не меняется, когда я касаюсь кнопки.
5. @rptwsthi: теперь я внедрил селектор. это все еще не работает. но даже если бы я не реализовал селектор, он все равно должен был подсвечиваться, когда я касался его. предпринятое действие не связано с тем, как оно выглядит. поскольку это кнопка, у нее уже должна быть функциональность для выделения при касании. верно?
Ответ №1:
Чтобы изменить изображение при касании, используйте
[menuButton setImage:menuImage2 forState:UIControlStateHighlighted];
Также убедитесь, что у вас есть menubutton.showTouchOnHighlight = YES;
и
menuButton.adjustImageWhenHighlighted = YES;
Возможно, ScrollView принимает события касания. Попробуйте эти
scrollView.delaysContentTouches = NO;
scrollView.canCancelContentTouches = NO;
Комментарии:
1. извините, но даже если вы не добавляете отдельное изображение для выделения или включения, кнопки по умолчанию поставляются с одним изображением.
Ответ №2:
Я решил эту проблему, изменив рамку представления, которое я добавляю к своему виду прокрутки. Итак, вместо этой строки:
UIView *menuView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 300.0f, 60.0f)];
Теперь я заставляю представление менять свой фрейм каждый раз, когда меняю страницу:
UIView *menuView = [[UIView alloc] initWithFrame:CGRectMake(i * 300.0f, 0.0f, 300.0f, 60.0f)];
Таким образом, причина была связана с расположением рамки вида, который я добавлял к виду прокрутки. Эта проблема, по-видимому, возникает, когда вид прокрутки используется вместе с подкачкой. Когда страница изменится, убедитесь, что вид внутри scrollview также перемещается в тот же фрейм.
Ответ №3:
Пожалуйста, внедрите этот код в свой ScrollView
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(X, Y, Width, Height);
btn.tag = //your tag Number;
[btn addTarget:self action:@selector(showGameDetail:) forControlEvents:UIControlEventTouchUpInside];
И добавьте этот метод
-(IBAction)showGameDetail:(id)sender
{
//Your Code
}
Ответ №4:
[menuImage release];
menuImage
не должно быть release. Это происходит из `[UIImage imageNamed:], и это автоматически выпущенный объект. Это приведет к перезапуску изображения.
Ответ №5:
Просто попробуйте это, и я не уверен, сработает ли это в вашем случае.
[scrollView bringSubviewToFront:button];
Ответ №6:
попробуйте этот код
for (int i = 0; i < NPAGES; i )
{
UIView *menuView = [[[UIView alloc] initWithFrame:CGRectMake(i * 300.0f, 0.0f, 300.0f, 60.0f)] autorelease];
for (j = 0; j < 5 ; j )
{
UIImage *menuImage = [UIImage imageNamed:@"menuimage.png"];
UIImage *menuImage2 = [UIImage imageNamed:@"menuimageselected.png"];
UIButton *menuButton = [UIButton buttonWithType:UIButtonTypeCustom];
menuButton.frame = CGRectMake(j * 60.0f, 0.0f, 60.0f, 60.0f);
menuButton.backgroundColor = [UIColor clearColor];
[menuButton setImage:menuImage forState:UIControlStateNormal];
[menuButton setImage:menuImage2 forState:UIControlStateHighlighted];
[menuButton setEnabled:YES];
[menuButton addTarget:self action:@selector(someSelector) forControlEvents:UIControlEventTouchUpInside];
[menuView addSubview:menuButton];
}
[sv addSubview:menuView];
}
и, пожалуйста, убедитесь, что два изображения с именами menuimage.png
и menuimageselected.png
присутствуют.
Комментарии:
1. извините, но это ничего не делает для работы кнопки. меняется только то, где будут находиться кнопки. это не связано с моим вопросом
2. тот же код отлично работает со мной, его просто проверили, изменив два изображения
3. попробуйте это [Меню настройки кнопки:menuImage2 для состояния:UIControlStateHighlighted];
Ответ №7:
-
Я бы объявил «J» внутри круглых скобок «for».
-
Вы сохраняете UIButton, а затем отпускаете его. Вам не нужно делать ни того, ни другого, потому что вы не выделяете его.
-
Вы не должны выпускать «menuImage».
-
Вы присваиваете «menuImage2» выбранному состоянию UIButton. Это должно быть UIControlStateHighlighted.
Редактировать:
Не делайте этого:
[menuImage release];
[menuButton release];
Также попробуйте это:
- (недействительно) menuButtonClicked: (идентификатор) отправителя { UIButton *btn = (UIButton *)отправитель; NSLog(@"нажал %d", [тег btn]); }
Комментарии:
1. Смотрите код, который я обновил, на самом деле это не имеет значения, если кнопка не реагирует на касания..
2. На самом деле это важно. попробуйте «for (int j = 0; j < 5 * (i 1); j )» и убедитесь сами.
3. Я вижу. Но все равно это работает не для всех кнопок. но только для тех, что на первой странице. когда вы добавите эти строки в функцию menuButtonClicked, вы увидите. — (IBAction) menuButtonClicked: (id) отправитель { UIButton *btn = отправитель; NSLog(@»нажал %d», [тег отправителя]); }
4. также следует изменить тег следующим образом: MenuButton.tag = j 5 * i;
5. Можете ли вы обновить свой пост с помощью нового кода. Я думал, вы используете селектор. попробуйте -(void)menuButtonClicked: (id) отправитель не IBAction, поскольку вы создаете кнопки во время выполнения.