Tôi thích Ahmed Khalaf's answer, nhưng nó xảy ra với tôi rằng bạn cũng có thể chỉ cần viết ra một vài chức năng C ... lợi thế chính là nó sẽ được dễ dàng hơn để theo dõi lỗi trong trường hợp bạn đang sử dụng sai kiểu.
Có nói rằng, tôi đã viết một file .h với những tuyên bố chức năng:
CGRect CGRectSetWidth(CGRect rect, CGFloat width);
CGRect CGRectSetHeight(CGRect rect, CGFloat height);
CGRect CGRectSetSize(CGRect rect, CGSize size);
CGRect CGRectSetX(CGRect rect, CGFloat x);
CGRect CGRectSetY(CGRect rect, CGFloat y);
CGRect CGRectSetOrigin(CGRect rect, CGPoint origin);
Và một file .m tương ứng với các chức năng hiện thực:
CGRect CGRectSetWidth(CGRect rect, CGFloat width) {
return CGRectMake(rect.origin.x, rect.origin.y, width, rect.size.height);
}
CGRect CGRectSetHeight(CGRect rect, CGFloat height) {
return CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, height);
}
CGRect CGRectSetSize(CGRect rect, CGSize size) {
return CGRectMake(rect.origin.x, rect.origin.y, size.width, size.height);
}
CGRect CGRectSetX(CGRect rect, CGFloat x) {
return CGRectMake(x, rect.origin.y, rect.size.width, rect.size.height);
}
CGRect CGRectSetY(CGRect rect, CGFloat y) {
return CGRectMake(rect.origin.x, y, rect.size.width, rect.size.height);
}
CGRect CGRectSetOrigin(CGRect rect, CGPoint origin) {
return CGRectMake(origin.x, origin.y, rect.size.width, rect.size.height);
}
Vì vậy, bây giờ, để làm những gì bạn muốn, bạn chỉ có thể làm:
self.frame = CGRectSetWidth(self.frame, 50);
Nhận thậm chí Fancier (cập nhật tôi đã thực hiện một năm sau)
Điều này có dư thừa self.frame
trong đó. Để khắc phục điều đó, bạn có thể thêm một category
trên UIView
với các phương pháp mà trông như thế này:
- (void) setFrameWidth:(CGFloat)width {
self.frame = CGRectSetWidth(self.frame, width); // You could also use a full CGRectMake() function here, if you'd rather.
}
Và bây giờ bạn có thể chỉ cần gõ vào:
[self setFrameWidth:50];
Hoặc, thậm chí tốt hơn:
self.frameWidth = 50;
Và chỉ để bạn có thể làm điều gì đó như sau:
self.frameWidth = otherView.frameWidth; // as opposed to self.frameWidth = otherView.frame.size.width;
Bạn sẽ cũng cần phải có điều này trong thể loại của bạn:
- (CGFloat) frameWidth {
return self.frame.size.width;
}
Thưởng thức.
Tự xem là UIView? Nếu vậy, thì thuộc tính frame không chỉ đọc. [Tài liệu] (https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816) nói rằng nếu bạn đặt , nó sẽ vẽ lại. Bạn sẽ có thể chỉ cập nhật một trường trong đó. – user1118321