Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UISegmentedControl截断段标题_Iphone_Uisegmentedcontrol_Ios7 - Fatal编程技术网

Iphone UISegmentedControl截断段标题

Iphone UISegmentedControl截断段标题,iphone,uisegmentedcontrol,ios7,Iphone,Uisegmentedcontrol,Ios7,我的iPhone应用程序中有一个分段控件,它在ios6上运行得很好,但在ios7上,分段平铺被截断(有足够的空间容纳文本,但无论如何它都会截断它们) 对如何解决这个问题有什么建议吗?为什么它可以在ios6上正常工作,而在ios7上截断标题 这是导致问题的代码 UIImage *unselectedBackgroundImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapIns

我的iPhone应用程序中有一个分段控件,它在ios6上运行得很好,但在ios7上,分段平铺被截断(有足够的空间容纳文本,但无论如何它都会截断它们)

对如何解决这个问题有什么建议吗?为什么它可以在ios6上正常工作,而在ios7上截断标题

这是导致问题的代码

      UIImage *unselectedBackgroundImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1)];
    /* Selected background */
    UIImage *selectedBackgroundImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1)];
    /* Image between two unselected segments */
    UIImage *bothUnselectedImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 0, 1, 0)];
     /* Image between segment selected on the left and unselected on the right */
    UIImage *leftSelectedImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 0, 1, 0)];
    /* Image between segment selected on the right and unselected on the right */
    UIImage *rightSelectedImage = [[UIImage imageNamed:@"product_details_segmentBckg"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 0, 1, 0)];

    if ([UIImage instancesRespondToSelector:@selector(imageWithRenderingMode:)]) {
#ifdef __IPHONE_7_0
        unselectedBackgroundImage = [unselectedBackgroundImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        selectedBackgroundImage = [selectedBackgroundImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        bothUnselectedImage = [bothUnselectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        leftSelectedImage = [leftSelectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        rightSelectedImage = [rightSelectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
#endif
    }


    [[UISegmentedControl appearance] setBackgroundImage:unselectedBackgroundImage
                                               forState:UIControlStateNormal
                                             barMetrics:UIBarMetricsDefault];

    [[UISegmentedControl appearance] setBackgroundImage:selectedBackgroundImage
                                               forState:UIControlStateSelected
                                             barMetrics:UIBarMetricsDefault];

    [[UISegmentedControl appearance] setDividerImage:bothUnselectedImage
                                 forLeftSegmentState:UIControlStateNormal
                                   rightSegmentState:UIControlStateNormal
                                          barMetrics:UIBarMetricsDefault];

    [[UISegmentedControl appearance] setDividerImage:leftSelectedImage
                                 forLeftSegmentState:UIControlStateSelected
                                   rightSegmentState:UIControlStateNormal
                                          barMetrics:UIBarMetricsDefault];

    [[UISegmentedControl appearance] setDividerImage:rightSelectedImage
                                 forLeftSegmentState:UIControlStateNormal
                                   rightSegmentState:UIControlStateSelected
                                          barMetrics:UIBarMetricsDefault];
如果我把它注释掉,标签会显示得很好。。。但是我需要背景图片。。。。
那么,我如何保持ios6的兼容性,同时在ios7上拥有定制的分段控件呢?我通过为所选状态设置与正常状态相同的标题文本属性来解决这个问题。 在iOS 6中,这就足够了:

NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   someUIFont, UITextAttributeFont,
                                   nil];

[self.segmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];
现在我必须添加以下内容才能使其适用于iOS 7:

[self.segmentedControl setTitleTextAttributes:attributes forState:UIControlStateSelected];

我尝试了一些解决方案,以避免重新计算所有的段大小。
为了解决我的问题,我将此代码放在分段控件的
valueChange
操作上:

for(int i=0;i<setControl.subviews.count; i++){
  NSString *title=[segControl titleForSegmentAtIndex:i];
  [segControl setTitle:title forSegmentAtIndex:i];
}

for(inti=0;i经过一些研究,下面是我对这个问题的解决方案(Swift 3,iOS 10)


我正在更新标题,它被截断了,因为原始标题的长度小于新标题。
因此,我添加了永久不间断空格
\u{00a0}
在原始标题的文本中,所以匹配标题前后的长度。

同样的事情,兄弟!只是我没有将任何图像用于标签标题。最奇怪的是,当应用程序启动时,所有标题看起来都很好,但如果你转到主屏幕并返回到应用程序,那么当你点击分段控制按钮时,这个b的标题utton将被截断。这是iPad应用程序。嗯,我想我通过设置标题的字体修复了它…所以,似乎你有不同的问题。对不起,公认的答案是这个问题的解决方案。这对我来说很有效。我发现,只要禁用状态是较大的字体大小,它就不会截断标签。
for(int i=0;i<setControl.subviews.count; i++){
  NSString *title=[segControl titleForSegmentAtIndex:i];
  [segControl setTitle:title forSegmentAtIndex:i];
}
class CustomSegmentedControl: UISegmentedControl {

override func draw(_ rect: CGRect) {

    for segment in subviews {
        for subview in segment.subviews {
            if let segmentLabel = subview as? UILabel {
                segmentLabel.numberOfLines = 0
                segmentLabel.translatesAutoresizingMaskIntoConstraints = false
                segmentLabel.leadingAnchor.constraint(equalTo: segment.leadingAnchor).isActive = true
                segmentLabel.trailingAnchor.constraint(equalTo: segment.trailingAnchor).isActive = true
                segmentLabel.topAnchor.constraint(equalTo: segment.topAnchor).isActive = true
                segmentLabel.bottomAnchor.constraint(equalTo: segment.bottomAnchor).isActive = true
            }
        }
    }
}

override func didMoveToSuperview() {
    self.layer.cornerRadius = 5
    self.clipsToBounds = true
    self.backgroundColor = .white
    self.tintColor = UIColor.orange

    let font = UIFont(name: "Helvetica", size: 12.0)
    self.setTitleTextAttributes([NSFontAttributeName: font!], for: .normal)

    let fontBold = UIFont(name: "Helvetica-Bold", size: 12.0)
    self.setTitleTextAttributes([NSFontAttributeName: fontBold!], for: .selected)
}
}