2013-05-12 5 views
5

Ich habe eine UIImageView, die ein Bild zeigt. Wenn er angetippt und gehalten wird, möchte ich, dass er sich verdunkelt, solange der Benutzer den Finger über die Bildansicht hält. Grundsätzlich möchte ich, dass es sich wie ein UIButton verhält.Wie mache ich eine UIImageView dunkler, wenn markiert (getappt)?

ich es derzeit haben dies mit einem UIGestureRecognizer:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] 
             initWithTarget:self 
             action:@selector(pictureViewTapped)]; 
    singleTap.numberOfTapsRequired = 1; 
    singleTap.numberOfTouchesRequired = 1; 
    [self.pictureImageView addGestureRecognizer:singleTap]; 
    [self.pictureImageView setUserInteractionEnabled:YES]; 
} 

und in meinem pictureViewTapped, ich habe diese (bis jetzt):

- (void)pictureViewTapped { 
    NSLog(@"Picture view was tapped!"); 
} 

Wie kann ich die UIImageView dunkler zu machen? Jede Hilfe wird geschätzt.

+1

Wenn Sie sich wie eine Schaltfläche verhalten möchten, warum verwenden Sie keine Schaltfläche? – danypata

Antwort

15

Der einfachste Weg ist Schichten im Rahmen Quartz zu verwenden:

add: QuartzCore.framework in den Projekteinstellungen add Projektdatei .h: #import

erstellen Geste für lange drücken statt Hahn wie die Verhaltensweisen, wie Sie beschrieben:

self.longTap = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(darkenImage)]; 
    [self.imageView setUserInteractionEnabled:YES]; 
    [self.imageView addGestureRecognizer:self.longTap]; 

Methode aufgerufen, wenn Geste aktiv:

-(void)darkenImage { 
    switch (self.longTap.state) { 
     case UIGestureRecognizerStateBegan: // object pressed 
     case UIGestureRecognizerStateChanged: 
      [self.imageView.layer setBackgroundColor:[UIColor blackColor].CGColor]; 
      [self.imageView.layer setOpacity:0.9]; 
      break; 
     case UIGestureRecognizerStateEnded: // object released 
      [self.imageView.layer setOpacity:1.0]; 
      break; 
     default: // unknown tap 
      NSLog(@"%i", self.longTap.state); 
      break; 
    } 
} 
+0

Das hat funktioniert, danke! – swiftcode

+7

'[self.imageView.layer setBackgroundColor: [UIColor blackColor] .CGColor]; [self.imageView.layer setOpacity: 0.9]; ' Ist die Absicht, dass der Hintergrund durchscheinen wird, wenn Sie die gesamte imageViews-Deckkraft auf 0.9 setzen? Sollte der Hintergrund nicht von der Opazitätsänderung betroffen sein? Jedenfalls funktioniert das nicht für mich. :( – Toydor

+0

@Toydor Ich stimme zu, ich empfehle zukünftige Leser versuchen stattdessen mit der '.tintColor' Eigenschaft. –

0

Swift-Lösung:

@IBOutlet weak var imageViewExport: UIImageView! 
var tapGestureExport = UILongPressGestureRecognizer() 

override func viewDidLoad() { 
     super.viewDidLoad() 

     imageViewExport.userInteractionEnabled = true 

     tapGestureExport = UILongPressGestureRecognizer(target: self, action: "tapGestureExportAction:") 
     imageViewExport.addGestureRecognizer(tapGestureExport) 
    } 

    func tapGestureExportAction(sender: UITapGestureRecognizer) { 

     switch(tapGestureExport.state) { 
     case UIGestureRecognizerState.Began, 
       UIGestureRecognizerState.Changed: 
      imageViewExport.backgroundColor = UIColor.blackColor() 
      imageViewExport.layer.opacity = 0.9 

     case UIGestureRecognizerState.Ended:  // released 
      imageViewExport.layer.opacity = 1.0 

      default: break // unknown tap 
      } 
} 
0

In meinem Fall wird Hintergrund durchscheinen, wenn Image der Ebenendeckkraft auf 0,9 gesetzt.

Ich verwende Lösung, die neue Schicht verwenden.

let coverLayer = CALayer() 
coverLayer.frame = imageView.bounds; 
coverLayer.backgroundColor = UIColor.blackColor().CGColor 
coverLayer.opacity = 0.0 
imageView.layer.addSublayer(coverLayer) 

// when tapped 
coverLayer.opacity = 0.1 
Verwandte Themen