Мне понравился ответ Ахмеда Халафа, но мне пришло в голову, что вы можете просто написать несколько функций C... главное преимущество заключается в том, что будет легче отслеживать ошибки, если вы используете неправильный тип.
Сказав это, я написал файл .h с этими объявлениями функций:
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);
И соответствующий файл .m с этими реализациями функций:
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);
}
Итак, теперь, чтобы делать то, что вы хотите, вы можете просто сделать:
self.frame = CGRectSetWidth(self.frame, 50);
Стать еще Fancier (обновление, которое я сделал год спустя)
Однако в нем есть избыточный self.frame
. Чтобы исправить это, вы можете добавить category
к UIView
с помощью методов, которые выглядят следующим образом:
- (void) setFrameWidth:(CGFloat)width {
self.frame = CGRectSetWidth(self.frame, width); // You could also use a full CGRectMake() function here, if you'd rather.
}
И теперь вы можете просто ввести:
[self setFrameWidth:50];
Или, что еще лучше:
self.frameWidth = 50;
И просто так вы можете сделать что-то вроде этого:
self.frameWidth = otherView.frameWidth; // as opposed to self.frameWidth = otherView.frame.size.width;
Вам также необходимо иметь это в своей категории:
- (CGFloat) frameWidth {
return self.frame.size.width;
}
Наслаждаться.
person
ArtOfWarfare
schedule
02.01.2013
.offsetBy
stackoverflow.com/a/43380510/5790492. - person Nik Kov   schedule 21.04.2020