UIView+RTL.m 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. @implementation UIView (RTL)
  2. - (void)setRtlOverturned:(BOOL)rtlOverturned {
  3. objc_setAssociatedObject(self, @selector(rtlOverturned), @(rtlOverturned), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  4. }
  5. - (BOOL)rtlOverturned {
  6. return [objc_getAssociatedObject(self, @selector(rtlOverturned)) boolValue];
  7. }
  8. - (CGFloat)leading {
  9. NSAssert(self.superview != nil, @"使用leading必须当前view添加到superView!");
  10. if ([self isRTL]) {
  11. return self.superview.width - self.right;
  12. }
  13. return self.left;
  14. }
  15. - (void)setLeading:(CGFloat)leading {
  16. NSAssert(self.superview != nil, @"使用leading必须当前view添加到superView!");
  17. if ([self isRTL]) {
  18. self.right = self.superview.width - leading;
  19. } else {
  20. self.left = leading;
  21. }
  22. }
  23. - (CGFloat)trailing {
  24. NSAssert(self.superview != nil, @"使用trailing必须当前view添加到superView!");
  25. if ([self isRTL]) {
  26. return self.leading + self.width;
  27. }
  28. return self.right;
  29. }
  30. - (void)setTrailing:(CGFloat)trailing {
  31. NSAssert(self.superview != nil, @"使用trailing必须当前view添加到superView!");
  32. if ([self isRTL]) {
  33. self.right = self.superview.width - trailing + self.width;
  34. } else {
  35. self.left = trailing - self.width;
  36. }
  37. }
  38. - (void)checkOverturn {
  39. // 避免重复翻转
  40. if (self.rtlOverturned) {
  41. return;
  42. }
  43. self.rtlOverturned = YES;
  44. // 基于transform翻转
  45. self.transform = CGAffineTransformScale(self.transform, -1, 1);
  46. }
  47. -(BOOL)isRTL
  48. {
  49. return [UIView appearance].semanticContentAttribute == UISemanticContentAttributeForceRightToLeft;
  50. }
  51. @end