2017-05-18 6 views
0

Ich erstelle ein System von Filtern.Swift - Button Image + Padding unten

Ich versuche, das zu tun: enter image description here

Derzeit verwende ich die setBackgroundImage func, und ich habe nicht dieses kleine rect unter dem Bild ...

filterButton.setBackgroundImage(imageForButton, for: .normal) 

I versucht, Funktionen wie diese:

filterButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 20, right: 0) 

Aber es ist nicht wirksam, wenn ich die setBackgroundImage func halten ...

Wenn ich setImage() verwenden, die Ergebnisse sind gut, aber der Klick ist nicht mehr wirksam ...

filterButton.setImage(imageForButton, for: UIControlState.normal) 

Haben Sie eine Idee haben, was ich möchte?

Vielen Dank im Voraus!

Der vollständige Code-Schnipsel:

for i in 0 ..< CIFilterNames.count { 
     itemCount = i 

     // Button properties 
     let filterButton = UIButton(type: .custom) 
     // filterButton.frame = CGRectMake(xCoord, yCoord, buttonWidth, buttonHeight) 
     filterButton.frame = CGRect(x: xCoord, y: yCoord, width: buttonWidth, height: buttonHeight) 
     filterButton.tag = itemCount 
     filterButton.addTarget(self, action: #selector(self.filterButtonTapped(_:)), for: .touchUpInside) 
//   filterButton.layer.cornerRadius = 6 
//   filterButton.clipsToBounds = true 

     let ciContext = CIContext(options: nil) 
     let coreImage = CIImage(image: originalImage.image!) 
     let filter = CIFilter(name: "\(CIFilterNames[i])") 
     filter!.setDefaults() 
     filter!.setValue(coreImage, forKey: kCIInputImageKey) 
     let filteredImageData = filter!.value(forKey: kCIOutputImageKey) as! CIImage 
     let filteredImageRef = ciContext.createCGImage(filteredImageData, from: filteredImageData.extent) 
     let imageForButton = UIImage(cgImage: filteredImageRef!) 
     filterButton.backgroundColor = UIColor.red 
     filterButton.setImage(imageForButton, for: UIControlState.normal) 
     //filterButton.imageEdgeInsets = UIEdgeInsets(top: 0,left: 0,bottom: 15,right: 0) 
     //filterButton.setBackgroundImage(imageForButton, for: .normal) 
     filterButton.setTitle("A\(i)", for: .normal) 
     // filterButton.backgroundImage.contentMode = .scaleAspectFill 
     filterButton.setTitleColor(UIColor(red: 22/255, green: 21/255, blue: 22/255, alpha: 1), for: .normal) 
     filterButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 20, right: 0) 
     filterButton.titleEdgeInsets.top = 140 

     // Add Buttons in the Scroll View 
     xCoord += buttonWidth + gapBetweenButtons 
     filtersScrollView.addSubview(filterButton) 

     } 
+0

Sind das Bild und die Filtertaste zwei separate Elemente? Können Sie ein größeres Code-Snippet teilen? – Stephen

+0

Danke für Ihre Antwort, und ja, es sind zwei verschiedene Elemente. Ich bearbeitet meine Frage mit mehr Code (es ist eine Funktion, mehrere Tasten zu zeigen) – KevinB

Antwort

1

Es sieht aus wie Sie versuchen, alles in einem einzigen UIButton zu tun. Ich würde vorschlagen, ein benutzerdefiniertes Element zu erstellen, um damit umzugehen. Es gibt ein paar Möglichkeiten, wie Sie kann Setup ein benutzerdefiniertes UI-Elements mit der Funktionalität, die Sie wollen:

  1. Verwenden Sie einen UILabel das „A1“ Label mit dem farbigen Hintergrund angezeigt werden und das Bild selbst in einem separaten UIImageView anzuzeigen. Diese könnten mit einer unsichtbaren UIB-Taste überlagert werden, um das Ereignis "touchUpInside" zu empfangen und an Ihren Controller zu übergeben.
  2. Alternativ können Sie ein benutzerdefiniertes UIControl-Add erstellen und ein UILabel und UIImageView als Subviews hinzufügen. Durch das Deaktivieren von userInteraction für die Unteransichten sollte UIControl die Touch-Ereignisse erhalten können. Dies könnte in einer einzelnen wiederverwendbaren Klasse enthalten sein, als ob es ein UI-Element wäre.
+0

Tatsächlich war es so einfach ... Ich fühle mich dumm ... Ich habe gerade zweite Tasten mit dem gleichen Ziel erstellt ... Vielen Dank! – KevinB

+1

Ehrfürchtig. Das ist noch einfacher als das, was ich vorgeschlagen habe. Manchmal ist einfach das Beste. – Stephen