2014-04-25 7 views
5

co starałem było to: -UIButton zajmuje swój własny rozmiar autoLayout

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; 
[self.view addSubview:btn]; 
btn.translatesAutoresizingMaskIntoConstraints = NO; 
[btn addTarget:self action:@selector(bringUpNextViewController:) 
        forControlEvents:UIControlEventTouchUpInside]; 
btn.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:14]; 
[btn setTitle:@"8" forState:UIControlStateNormal]; 
[self.view layoutIfNeeded]; 

NSLog(@"button size : %@", NSStringFromCGSize(btn.frame.size)); 

jako wyjście, mam to:

button size : {30, 29} 

Potem dał setTitle ciąg niczym. Szerokość przycisku była nadal 30

Dlaczego tak jest zawsze?

Próbowałem również dać high compression resistance priority i high content hugging priority. Nie kurczy się do niczego.

Problem polega również na tym, że chcę zmniejszyć szerokość przycisku w prosty sposób w oparciu o jego zawartość, bez podawania stałej szerokości.

Mogę wziąć szerokość tekstu i nadać mu szerokość, ale nie powinienem tego robić, jeśli przycisk przybierał szerokość treści.

Edycja:

jej nie wstawki albo powodującemu szerokość być 30. Wartość Ghost.

Odpowiedz

6

Przycisk wykonany jest z kilku subviews. Bardzo prawdopodobne jest, że wewnętrzny układ przycisku ma pewne domyślne dopełnienie między etykietą a samym widokiem przycisku.

Making przycisk jak twoje i bada ograniczenia zawiera następujące informacje:

button constraints (
"<NSContentSizeLayoutConstraint:0x8c40a60 H:[UIButton:0x8f29840(30)] Hug:250 CompressionResistance:750>", 
"<NSContentSizeLayoutConstraint:0x8c55280 V:[UIButton:0x8f29840(29)] Hug:250 CompressionResistance:750>" 
) 

30 i 29 związać się z wartościami wielkości widzisz. Własna właściwość wielkości treści przycisku zwraca również 30,29. Zasadniczo jest to minimalny rozmiar przycisku, pod nieobecność czegokolwiek innego.

Nie jest całkiem jasne, czego chcesz lub dlaczego się tym przejmuje. Wszystko, co mniejsze, będzie słabym celem dotykowym, a przycisk bez etykiety lub obrazu będzie niewidoczny. Jeśli dodasz dłuższy tytuł, przycisk zwiększy się. Jeśli dodasz inne wiązania, aby wymusić określone rozmiary, to zastąpią one wewnętrzny rozmiar treści.

Jeśli chcesz, aby przycisk stał się niewidoczny, gdy nie ma tytułu, powinieneś go wyraźnie ukryć. Dzięki temu twoje intencje w kodzie są znacznie wyraźniejsze i zapobiegną przypadkowemu naciśnięciu przycisku, którego naprawdę nie widzą.

+0

Ah, ok, miałem rację w moim założeniu :-) dobra odpowiedź. – Fogmeister

+0

Hmm, okay. Brzmi już dobrze. Ale jak wspomniałem w pytaniu: "Problem polega również na tym, że chcę zmniejszyć szerokość przycisku w prosty sposób w oparciu o jego zawartość, bez podawania jakiejkolwiek stałej szerokości. A" 30 "dla domyślnego rozmiaru treści wydawało się odrobinę zbyt duże, po prostu nie chciałem, aby przycisk pojawiał się w ogóle. Tak byłoby lepiej. – esh

+0

@ BlackFlam3 Apple HIG stwierdza, że ​​minimalny obszar dotykowy przycisku powinien mieć 44 x 44 punkty. 30 jest już zbyt mały, aby przycisk ułatwiał jego stukanie. Zmniejszenie jego rozmiaru jeszcze bardziej nie ma sensu. – Fogmeister

0

Czy próbowałeś [button sizeToFit];?

przypadku niestandardowych przycisków, myślę, że trzeba będzie zastąpić:

- (CGSize)sizeThatFits:(CGSize)size; 

Wreszcie, jeśli nic innego dzieła, zawsze można spróbować dając przycisk szerokość od rozmiaru tekstu jak tak

CGSize textsize = [yourText sizeWithFont:[UIFont fontWithName:@"HelveticaNeue" size:14]]; 
[button setFrame:CGRectMake(0,0,textsize.width, textsize.height)]; 
+0

kilka punktów. a) Używam 'Autolayout' (bez ramki). b) "sizeWithFont' jest przestarzałe. Musisz użyć do tego celu 'boundingRectWithSize '(przyszły dowód). – esh

+0

I ostatecznie używam szerokości tekstu, używając autolayout. To tylko rzeczy związane z Apple. – esh

+0

Ok. Te metody nie są kompatybilne z autolayout, ale skontaktuję się z Tobą, jeśli coś znajdę. – aksh1t

0

Najpierw należy zdefiniować ograniczenie rozmiaru przycisku w scenorysie.

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *buttonSizeConst; 

Po tym możesz ustawić jego rozmiar na to, co chcesz.

self.buttonSizeConst.constant = 65.0; 

enter image description here

Edit: Dzięki tej metodzie trzeba obliczyć szerokość przycisku, ale myślę, że nie chcesz tego robić. Musisz autorejestrować UIButton, aby zawierał jego zawartość. W tym celu należy podać ograniczenia takie jak obrazek poniżej. Zostanie rozwinięty w prawo, gdy zmienisz tytuł.

enter image description here

+0

Jego rzeczy związane z Apple. Zastanawiasz się, skąd się wzięło to "30". Znam tę metodę już. – esh

1

Zastanawiam się, czy istnieje minimalna wewnętrzna wielkość zawartości dla uibutton?

Zresztą, spróbuj robić ...

[button invalidateIntrinsicContentSize]; 
+1

Społeczność wiki? Skończyłeś zbierać przedstawiciela? – jrturton

+0

Huh? Och ... Musiałem to przez pomyłkę zaznaczyć. Lol! Był na moim iPadzie, kiedy odpowiedziałem. – Fogmeister