2015-07-17 22 views
16

Chcę wyświetlić obraz po lewej stronie mojego paska nawigacji w trybie szybkim.obraz dla przycisku nawigacyjnego item swift

Próbowałem dodać element przycisku paska nawigacji i ustawić tam obraz.

Problem polega na tym, że muszę użyć naprawdę małego obrazu, aby ładnie pasował do paska nawigacji. Ale zrobienie tak małego obrazu prowadzi do pikselizacji, zwłaszcza na większym telefonie iPhone 6 i 6 Plus.

Czy istnieje sposób, aby użyć obrazu dobrej jakości, a następnie ustawić ramkę tak, aby mieściła się w granicach paska nawigacji?

Moja próba:

var image = UIImage(named: "Harp.png") 

image = image?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) 

self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: image, style: UIBarButtonItemStyle.Plain, target: nil, action: nil) 
self.navigationItem.leftBarButtonItem.frame = CGRectMake(0, 0, 53, 31) 
//image.frame = CGRectMake(0, 0, 53, 31) 

Próbowałem oddanie ramkę na zdjęcie, a następnie na pozycję Pasek przycisków. Ale to powoduje błąd:

Rodzaj wyrażenia jest niejednoznaczny bez większej ilości kontekstów.

+0

dlaczego nie korzystać z katalogu aktywów? –

+0

Vinay ma rację. Korzystanie z katalogu zasobów jest łatwe i automatyczne. Popraw mnie, jeśli się mylę, ale używam @ 1, @ 2, @ 3 następujących rozdzielczości: 44x44, 88x88 i 132x132 pikseli. RÓWNIEŻ, czasami potrzebuję poprawić rozmiar za pomocą wstawek obrazu (jeśli masz przycisk w IBuilderze, możesz go skasować). – MLBDG

Odpowiedz

40

Try This

let button = UIButton(type: UIButtonType.Custom) 
button.setImage(UIImage(named: "yourImageName.png"), forState: UIControlState.Normal) 
button.addTarget(self, action:Selector("callMethod"), forControlEvents: UIControlEvents.TouchDragInside) 
button.frame=CGRectMake(0, 0, 30, 30) 
let barButton = UIBarButtonItem(customView: button) 
self.navigationItem.leftBarButtonItems = [newBackButton,barButton] 

Dla Swift 3

let button = UIButton.init(type: .custom) 
button.setImage(UIImage.init(named: "yourImageName.png"), for: UIControlState.normal) 
button.addTarget(self, action:#selector(ViewController.callMethod), for:.touchUpInside) 
button.frame = CGRect.init(x: 0, y: 0, width: 30, height: 30) //CGRectMake(0, 0, 30, 30) 
let barButton = UIBarButtonItem.init(customView: button) 
      self.navigationItem.leftBarButtonItem = barButton 

Oto działanie

func callMethod() { 
//do stuff here 
} 
+1

jeden problem, akcja nie jest wyzwalana? Mam akcję "tryLogout" i func tryLogout(), ale funkcja wylogowania nie jest uruchamiana? – user2363025

+2

o przepraszam, widzę, że to tylko typ wydarzenia, który musi się zmienić – user2363025

+0

Czy jesteś pewien, że drugi jest dla Swift 3? Przypomniałem, że w Swift 3 wszystkie parametry metody będą miały etykietę.Ale twój 'button.addTarget (self ...' nie ma etykiety dla pierwszego parametru –

1

Istnieje sposób użycia obrazów o różnych rozmiarach, w zależności od urządzenia. To się nazywa katalog zasobów. Prawdopodobnie będziesz już mieć jeden w swoim projekcie, lub jeśli nie, możesz go dodać z File > New > File > Resource > Asset Catalogue.

W swoim katalogu zasobów możesz mieć wiele "Zestawów obrazów" (zostaną one wyświetlone po lewej stronie). Dodaj nowy zestaw zdjęć z "+" na dole. Dla każdego zestawu obrazów możesz dostarczać różne obrazy (na przykład o różnych rozmiarach) dla każdego z @ 1x, @ 2x i @ 3x.

Następnie, aby użyć jednego z tych obrazów w kodzie, należy po prostu użyć UIImage(named: "name_of_image_set") - notatka bez rozszerzenia. W zależności od urządzenia zostanie załadowany prawidłowy obraz.

Mam nadzieję, że to pomoże!

+0

Problem polegał na tym, że większe obrazy przekraczały pasek nawigacji. Rozumiemy to dzięki rozwiązaniu Avijita – user2363025

2

użyć tego kodu:

self.navigationItem.leftBarButtonItem = nil 

let button = UIButton(type: .custom) 
button.setImage(UIImage (named: "ChatTab"), for: .normal) 
button.frame = CGRect(x: 0.0, y: 0.0, width: 35.0, height: 35.0) 
//button.addTarget(target, action: nil, for: .touchUpInside) 
let barButtonItem = UIBarButtonItem(customView: button) 

let button2 = UIButton(type: .custom) 
button2.setImage(UIImage (named: "ActivityTab"), for: .normal) 
button2.frame = CGRect(x: 0.0, y: 0.0, width: 35.0, height: 35.0) 
//button.addTarget(target, action: nil, for: .touchUpInside) 

let barButtonItem2 = UIBarButtonItem(customView: button2) 
self.navigationItem.rightBarButtonItems = [barButtonItem, barButtonItem2] 

wyjściowa: enter image description here

Powiązane problemy