【问题标题】:Centering image and vertically in UISegmentControl ios?在 UISegmentControl ios 中居中图像和垂直?
【发布时间】:2014-12-17 14:11:55
【问题描述】:

所以我试图将图像和文本都插入到 UISegmentControl 中。现在在这个 segmentControl 中,我希望将图像放在顶部,将文本放在底部。所以我在 UIImage 上使用一个类别来放置标题如下所示。但是经过大量努力后,我的图像和文字仍然放错了位置。以前有人正确地做到过吗?感谢您的帮助。

 + (id)imageFromImage:(UIImage*)image string:(NSString*)string color:(UIColor*)color
{

  UIFont *font = [UIFont fontWithName:@"Helvetica" size:16];
  CGSize expectedTextSize = [string sizeWithAttributes:@{NSFontAttributeName: font}];
  int width = expectedTextSize.width + image.size.width + 5;
  int height = MAX(expectedTextSize.height, image.size.width);
  CGSize size = CGSizeMake((float)width, (float)height);
  UIGraphicsBeginImageContextWithOptions(size, NO, 0);

  CGContextRef context = UIGraphicsGetCurrentContext();

  CGContextSetFillColorWithColor(context, color.CGColor);

  int fontTopPosition = (height + expectedTextSize.height) / 2;

  CGPoint textPoint = CGPointMake(image.size.width/2, fontTopPosition);

  [string drawAtPoint:textPoint withAttributes:@{NSFontAttributeName: font}];
  // Images upside down so flip them
  CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, size.height);
  CGContextConcatCTM(context, flipVertical);

  CGContextDrawImage(context, (CGRect){ {50,0},{image.size.width-10,image.size.height-10}}, [image CGImage]);

  UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return newImage;
}

【问题讨论】:

  • 放错地方怎么办?你能描述一下出了什么问题吗?我很高兴运行您的代码并查看它的作用,但我应该寻找什么问题?毕竟,图像和字符串可能正好放置在您的代码放置它们的位置,那么如果您的代码没有表达它,我怎么知道您的意图呢?
  • 实际上我的标题远低于该段,所以几乎使它不可见......并且对于图像我给出 x = 50 值。所以它不理想不是吗? .我的意思是给出硬编码的值。但我现在还不知道另一种方法。
  • 好的,所以问题不在于图像和字符串被绘制“错位”,而是整个东西不能很好地适合一个片段?
  • 请问:你为什么用CGContextDrawImage?如果您只是告诉 UIImage 自己绘制,您可以避免整个“翻转”问题。不会简单很多吗?然后放置图像也会更容易。
  • 这真的是您的意思吗:int height = MAX(expectedTextSize.height, image.size.width); 您想将图像的height 基于原始图像的width?真的吗?

标签: ios cocoa-touch cgcontextdrawimage


【解决方案1】:

我不会为你重写你的代码,但我肯定想告诉你走出困境的方法。第一步是停止使用CGContextDrawImage,因为这会涉及到“翻转”和转换的复杂性。你应该摆脱这一切。要将图像绘制到图像中,只需绘制它!使用 UIImage 方法drawAtPoint: 或(如果您需要随时调整大小)drawInRect:。然后,您可以轻松地将图像准确地放置在您想要的位置。

我还关心你的最终图像应该有多大的整个问题。您正在创建图像的最终尺寸:

CGSize size = CGSizeMake((float)width, (float)height);
UIGraphicsBeginImageContextWithOptions(size, NO, 0);

因此,如果图像的尺寸错误,您需要更改计算 widthheight 的方式。我建议你做的与你现在做的正好相反。与其让图像和文本告诉您该做什么,不如从您真正想要的大小开始,让图像很好地适合您的片段,然后在您绘制时将图像和文本放入其中。

【讨论】:

  • 请参阅我书中的这一部分:apeth.com/iOSBook/ch15.html#_uiimage_drawing - 特别注意第二个示例,我通过计算其大小和位置,将调整大小的绘图精确放置在我想要的位置原尺寸。
猜你喜欢
  • 2010-12-30
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多