Jeśli trzeba ustawić stałą wartość dziesiętną w serii ujęć, które nie są zależne od skali ekranu, można użyć user defined runtime attributes
, na przykład do ograniczenia stały byłoby:
Key Ścieżka: constant
Typ: Number
Wartość: 0,5
Jeśli chcesz złożyć ogranicznik, dokonując pogląd o szerokości 1 piksela na @ 2x i @ urządzeń 3x można stosować ograniczenia który ustawia widoku danych, szerokość/wysokość i ustawienie swoją klasę do swojej podklasa ograniczenia. Przykładem takiej podklasy: OnePixelWidthConstraint.h:
#import <UIKit/UIKit.h>
@interface OnePixelWidthConstraint : NSLayoutConstraint
@end
OnePixelWidthConstraint.m:
#import "OnePixelWidthConstraint.h"
@implementation OnePixelWidthConstraint
- (CGFloat)constant {
return 1./[UIScreen mainScreen].scale;
}
@end
Aby obliczyć wartość tylko jeden raz:
- (CGFloat)constant {
static CGFloat onePixel = 0;
return onePixel?:(onePixel = 1./[UIScreen mainScreen].scale);
}
To by zmienić 'constant' z przymusu za każdym razem widok układy swoje poglądy (wiele razy). "Stała" powinna być ustawiona tylko raz, a następnie automatycznie wyrysować na "layoutSubviews". Czy może czegoś brakuje? –
Ustawienie stałej nie wyzwala układu. Dokumentacja Apple mówi: "Zastąp metody viewWillLayoutSubviews lub layoutSubviews, aby zmodyfikować wyniki zwracane przez silnik układu." [link] (https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/ModifyingConstraints.html#//apple_ref/doc/uid/TP40010853-CH29-SW4) – adamup
Może wyraziłem się źle . Chodzi mi o to, że powinieneś wywołać 'constraint.constant = value;' ** once **, a następnie wywołać '[self.view setNeedsLayout];' i pozwolić systemowi na wykonanie swojej rzeczy. Po co ponownie ustawiać wartość w każdym cyklu układu? –