2013-02-05 38 views
10

Tôi đang làm việc trên một trò chơi bài. Tôi muốn thẻ quay lại để hiển thị hình ảnh và mặt trước của thẻ để hiển thị nội dung thẻ. Tôi đã nhận được hình ảnh để hiển thị trên lưng, nhưng tôi không thể tìm ra cách để xóa nó khi nó được chọn. (Tất cả thời gian chuẩn này-ma-khi-Nó rất chọn mã đang chạy, vì vậy tôi biết nó không phải là một vấn đề không thực sự thay đổi trạng thái.) Dưới đây là mã của tôi:Làm cách nào để xóa hình ảnh của UIButton cho một số trạng thái nhất định?

-(void)updateUI { 
for (UIButton *cardButton in self.cardButtons) { 
    Card *card = [self.game cardAtIndex:[self.cardButtons indexOfObject:cardButton]]; 
    [cardButton setTitle:card.contents forState:UIControlStateSelected]; 
    [cardButton setTitle:card.contents forState:UIControlStateSelected | UIControlStateDisabled]; 
    [cardButton setImage:[UIImage imageNamed:@"cardback.png"] forState:UIControlStateNormal]; 

//I've tried various permutations of the following three lines, but the image never disappears. 

    [cardButton setImage:nil forState:UIControlStateSelected]; 
    [cardButton setImage:nil forState:UIControlStateSelected | UIControlStateHighlighted]; 
    [cardButton setImage:nil forState:UIControlStateNormal]; 

    cardButton.selected = card.faceUp; 
    cardButton.alpha=(card.unplayable ? 0.3:1.0); 
    [self.scoreLabel setText:[NSString stringWithFormat:@"Score: %d",self.game.score]]; 
} 
} 

Bất kỳ suy nghĩ về những gì tôi làm sai?

+2

Paul Hegarty tuyệt vời: D –

Trả lời

6

tôi đoán vấn đề của bạn là thế này (từ tài liệu của Apple cho setImage:forState:):

Nói chung, nếu thuộc tính không được chỉ định cho một trạng thái, mặc định là sử dụng giá trị UIControlStateNormal. Nếu giá trị UIControlStateNormal không được đặt, thì thuộc tính mặc định là giá trị hệ thống. Do đó, ở mức tối thiểu, bạn nên đặt giá trị cho trạng thái bình thường.

Vì vậy, bạn không thể chỉ đơn giản là bỏ đặt hình ảnh cho một số tiểu bang vì hình ảnh mặc định sẽ được sử dụng.

tôi nhìn thấy một vài giải pháp cho vấn đề này:

  1. Sử dụng hình ảnh trong suốt cho các tiểu bang mà bạn muốn hiển thị thông qua chứ không phải là nil
  2. Đưa thẻ của bạn một subview UIImageView mà bạn thiết lập để thẻ hình ảnh trở lại. Nếu thẻ đang úp xuống, hãy sử dụng setHidden: để hiển thị chế độ xem phụ. Nếu thẻ đang hướng lên trên, hãy sử dụng setHidden: để ẩn chế độ xem phụ. Tôi có lẽ sẽ sử dụng phương pháp – addTarget:action:forControlEvents: trong lớp nút tùy chỉnh của bạn để đăng ký một phương thức tùy chỉnh hiển thị hoặc ẩn subview thẻ trở lại.

Note mà bạn có thể dễ dàng đưa phương án 2 là một bước xa hơn bằng cách hiển thị mặt trước của thẻ trong một subview cũng và sau đó bạn có thể dễ dàng động một sự chuyển tiếp lật giữa hai subviews để các thẻ "flips "over khi nhấn.

+0

Điều đó đã làm điều đó Cảm ơn bạn –

0

Bạn có thể sử dụng các thẻ:

Ví dụ:

- (IBAction)btnClicked:(id)sender { 

if([sender tag]==1){ 

//do something 

} 
if([sender tag]==2){ 

//do something else 
} 

chắc chắn rằng bạn thiết lập thẻ khác nhau cho các nút bằng cách vào Attributes Inspector và thay đổi giá trị mặc định từ 0 đến cái gì khác ...

Hope this helps ...

+0

Cảm ơn, nhưng vấn đề không phải là hình ảnh đang bị xóa hoặc không bị xóa vì các nút sai - đó là hình ảnh không bị xóa đối với bất kỳ nút nào, bất kể trạng thái của họ. :( –

6

Một cách nhanh chóng để tạo ra một hình ảnh trong suốt cho các tiểu bang khác, kể từ con số không sẽ mặc định giá trị của UIControlStateNormal, là để phân bổ và giao một hình ảnh trống:

UIImage *cardBackImage = [UIImage imageNamed:@"cardback.png"]; 
UIImage *cardFrontImage = [[UIImage alloc] init]; 
[cardButton setImage:cardBackImage forState:UIControlStateNormal]; 
[cardButton setImage:cardFrontImage forState:UIControlStateSelected]; 
[cardButton setImage:cardFrontImage forState:UIControlStateSelected|UIControlStateDisabled]; 
+0

Tôi không bao giờ nhìn thấy 'UIImage * cardFrontImage = [UIImage alloc];' tại sao chúng ta không thực hiện init? Không có một sai lầm? Tôi mới bắt đầu, bạn có thể giải thích? Và tại sao chúng ta không thể làm điều này: 'UIImage * cardFrontImage = nil;' –

+0

cũng vậy, nó giúp tôi. Tôi nghĩ 'UIImage * cardFrontImage = [[UIImage alloc] init];' là một cách thích hợp. Paul Hegarty nhân tiện , nhiều lần, phân bổ đó không bao giờ được sử dụng mà không có init –

+0

Ah, bắt tốt, init bị bỏ qua do nhầm lẫn – Kokaubeam

1

Nếu bạn sử dụng setBackgroundImage, rằng ý chí tốt. đây là mã của tôi.

- (void)updateUI 
{ 
    for (int i=0; i < self.cardButtons.count; i++) { 
     Card *card = [self.game cardAtIndex:i]; 
     UIButton *cardButton = self.cardButtons[i]; 
     [cardButton setTitle:card.contents forState:UIControlStateSelected]; 
     [cardButton setTitle:card.contents forState:UIControlStateSelected|UIControlStateDisabled]; 
     cardButton.selected = card.isFaceup; 
     cardButton.enabled = !card.isUnplayable; 
     cardButton.alpha = card.isUnplayable ? 0.3 : 1.0; 
     //handle flipcard backgroundimage changes; 
     UIImage *backgroundImage = (!cardButton.selected) ? [CardGameViewController cardBackgroundImage] : nil; 
     [cardButton setBackgroundImage:backgroundImage forState:UIControlStateNormal]; 
     [self updateScoreLabel:self.game.score]; 
     NSArray *matchCards = [self.game.matchCards lastObject]; 
     if (matchCards) { 
      UIColor *color = [self getOneMatchColor]; 
      for (NSNumber *matchCardIndex in matchCards) { 
       NSUInteger index = [matchCardIndex integerValue]; 
       UIButton *matchCardButton = self.cardButtons[index]; 
       if (color) matchCardButton.backgroundColor = color; 
      } 
      [self.game.matchCards removeLastObject]; 
     } 
    } 
} 
0

Giải pháp đơn giản nhất tôi thấy là kiểm tra xem nút có được gắn cờ như đã chọn hay không. Nếu không, áp dụng một hình nền, nếu không thì áp dụng một UIImage rỗng.

0

Kết thúc buổi tiệc và tôi không thể bỏ phiếu cho câu trả lời của MultiColour Pixel hoặc nhận xét về nó, tôi đoán vì tôi mới ở đây và không có bất kỳ danh tiếng nào. Nhưng đó thực sự là cách tiếp cận tốt nhất và đơn giản nhất; không cần hình ảnh trong suốt hoặc chế độ xem bổ sung.

Tôi đang tham gia cùng một khóa học ngay bây giờ, dưới dạng OP và chạy vào cùng một vấn đề. Giải pháp là khi nút được chọn, bạn vẫn thiết lập các hình ảnh cho không được chọn bang (để nil):

UIImage *image = [UIImage imageNamed:@"cardback.png"]; 
// ... 
[cardButton setImage:(card.isFaceUp ? nil : image) forState:UIControlStateNormal]; 

Và bạn đừng bao giờ thiết lập một hình ảnh cho bất cứ tiểu bang khác.

Các vấn đề liên quan