UISegmentedControl with Image and Title

后端 未结 6 2163
滥情空心
滥情空心 2020-12-15 13:45

I am using a UISegmentedControl inside a UIToolBar as button. I can\'t use a normal UIButtonBarItem, because I need to set the t

相关标签:
6条回答
  • 2020-12-15 14:31

    Swift 3

    extension UIImage{
    
    
    class func textEmbededImage(image: UIImage, string: String, color:UIColor, imageAlignment: Int = 0, segFont: UIFont? = nil) -> UIImage {
        let font = segFont ?? UIFont.systemFont(ofSize: 16.0)
        let expectedTextSize: CGSize = (string as NSString).size(attributes: [NSFontAttributeName: font])
        let width: CGFloat = expectedTextSize.width + image.size.width + 5.0
        let height: CGFloat = max(expectedTextSize.height, image.size.width)
        let size: CGSize = CGSize(width: width, height: height)
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        let context: CGContext = UIGraphicsGetCurrentContext()!
        context.setFillColor(color.cgColor)
        let fontTopPosition: CGFloat = (height - expectedTextSize.height) / 2.0
        let textOrigin: CGFloat = (imageAlignment == 0) ? image.size.width + 5 : 0
        let textPoint: CGPoint = CGPoint.init(x: textOrigin, y: fontTopPosition)        
        string.draw(at: textPoint, withAttributes: [NSFontAttributeName: font])
        let flipVertical: CGAffineTransform = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: size.height)
        context.concatenate(flipVertical)
        let alignment: CGFloat =  (imageAlignment == 0) ? 0.0 : expectedTextSize.width + 5.0
        context.draw(image.cgImage!, in: CGRect.init(x: alignment, y: ((height - image.size.height) / 2.0), width: image.size.width, height: image.size.height))
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!
    }
    
    }
    
    0 讨论(0)
  • 2020-12-15 14:32

    For Swift.

    segFont is the font for the embedded text.

    imageAlignment is the alignment of the image appearing left or right of the text.

    set imageAlignment to 0 for left alignment (image will appear to the left of the text) and 1 for right alignment (image will appear to the right of the text)

    class func textEmbededImage(image: UIImage, string: String, color:UIColor, imageAlignment: Int = 0, segFont: UIFont? = nil) -> UIImage {
    
    let font = segFont ?? UIFont.systemFontOfSize(16.0)
    
    let expectedTextSize: CGSize = (string as NSString).sizeWithAttributes([NSFontAttributeName: font])
    
    let width: CGFloat = expectedTextSize.width + image.size.width + 5.0
    
    let height: CGFloat = max(expectedTextSize.height, image.size.width)
    
    let size: CGSize = CGSizeMake(width, height)
    
    UIGraphicsBeginImageContextWithOptions(size, false, 0)
    
    let context: CGContextRef = UIGraphicsGetCurrentContext()!
    
    CGContextSetFillColorWithColor(context, color.CGColor)
    
    let fontTopPosition: CGFloat = (height - expectedTextSize.height) / 2.0
    
    let textOrigin: CGFloat = (imageAlignment == 0) ? image.size.width + 5 : 0
    let textPoint: CGPoint = CGPointMake(textOrigin, fontTopPosition)
    
    
    string.drawAtPoint(textPoint, withAttributes: [NSFontAttributeName: font])
    let flipVertical: CGAffineTransform = CGAffineTransformMake(1, 0, 0, -1, 0, size.height)
    CGContextConcatCTM(context, flipVertical)
    
    let alignment: CGFloat =  (imageAlignment == 0) ? 0.0 : expectedTextSize.width + 5.0
    CGContextDrawImage(context, CGRectMake(alignment, ((height - image.size.height) / 2.0), image.size.width, image.size.height), image.CGImage)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    return newImage
    }
    
    0 讨论(0)
  • 2020-12-15 14:35

    You can do it:

    add category for UIImage:

    in UIImage+UISegmentIconAndText.h

    @interface UIImage (UISegmentIconAndText)
    
    + (id) imageFromImage:(UIImage*)image string:(NSString*)string color:(UIColor*)color;
    + (id) imageFromImage:(UIImage*)image string:(NSString*)string color:(UIColor*)color position:(NSString*)position;
    
    @end
    

    in UIImage+UISegmentIconAndText.m

    #import "UIImage+UISegmentIconAndText.h"
    
    @implementation UIImage (UISegmentIconAndText)
    + (id) imageFromImage:(UIImage*)image string:(NSString*)string color:(UIColor*)color
    {
        UIFont *font = [UIFont systemFontOfSize:16.0];
        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 + 5, 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){ {0, (height - image.size.height) / 2}, {image.size.width, image.size.height} }, [image CGImage]);
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return newImage;
    }
    @end
    

    in your code implement Segment:

    UIImage *imageWithText = [UIImage imageFromImage:[UIImage imageNamed:@"images/jobaids_tab_icon"] string:@"Hello", nil) color:[UIColor whiteColor]];
    
    [_segmentedController setImage:imageWithText forSegmentAtIndex:0];
    
    0 讨论(0)
  • 2020-12-15 14:36

    Swift 4

    extension UIImage {
    
    class func textEmbededImage(image: UIImage, string: String, color:UIColor, imageAlignment: Int = 0, segFont: UIFont? = nil) -> UIImage {
        let font = segFont ?? UIFont.systemFont(ofSize: 16.0)
        let expectedTextSize: CGSize = (string as NSString).size(withAttributes: [NSAttributedStringKey.font: font])
        let width: CGFloat = expectedTextSize.width + image.size.width + 5.0
        let height: CGFloat = max(expectedTextSize.height, image.size.width)
        let size: CGSize = CGSize(width: width, height: height)
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        let context: CGContext = UIGraphicsGetCurrentContext()!
        context.setFillColor(color.cgColor)
        let fontTopPosition: CGFloat = (height - expectedTextSize.height) / 2.0
        let textOrigin: CGFloat = (imageAlignment == 0) ? image.size.width + 5 : 0
        let textPoint: CGPoint = CGPoint.init(x: textOrigin, y: fontTopPosition)
        string.draw(at: textPoint, withAttributes: [NSAttributedStringKey.font: font])
        let flipVertical: CGAffineTransform = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: size.height)
        context.concatenate(flipVertical)
        let alignment: CGFloat =  (imageAlignment == 0) ? 0.0 : expectedTextSize.width + 5.0
        context.draw(image.cgImage!, in: CGRect.init(x: alignment, y: ((height - image.size.height) / 2.0), width: image.size.width, height: image.size.height))
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    
        return newImage!
    }
    }
    
    0 讨论(0)
  • 2020-12-15 14:41

    try this:

    UISegmentedControl* searchButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"", nil]];
    [searchButton insertSegmentWithImage:[UIImage imageNamed:@"up_button.png"] atIndex:0 animated:YES];
    [searchButton insertSegmentWithImage:[UIImage imageNamed:@"down_button.png"] atIndex:1 animated:YES];
    searchButton.segmentedControlStyle = UISegmentedControlStyleBar;
    searchButton.tintColor = [UIColor colorWithRed:0.27 green:0.60 blue:0.20 alpha:1.00];
    [searchButton setMomentary:YES];
    
    0 讨论(0)
  • 2020-12-15 14:48

    Swift 5

    For those of us who like to use modern API wherever it is possible:

    extension UIImage {
        static func textEmbeded(image: UIImage,
                               string: String,
                    isImageBeforeText: Bool,
                              segFont: UIFont? = nil) -> UIImage {
            let font = segFont ?? UIFont.systemFont(ofSize: 16)
            let expectedTextSize = (string as NSString).size(withAttributes: [.font: font])
            let width = expectedTextSize.width + image.size.width + 5
            let height = max(expectedTextSize.height, image.size.width)
            let size = CGSize(width: width, height: height)
    
            let renderer = UIGraphicsImageRenderer(size: size)
            return renderer.image { context in
                let fontTopPosition: CGFloat = (height - expectedTextSize.height) / 2
                let textOrigin: CGFloat = isImageBeforeText
                    ? image.size.width + 5
                    : 0
                let textPoint: CGPoint = CGPoint.init(x: textOrigin, y: fontTopPosition)
                string.draw(at: textPoint, withAttributes: [.font: font])
                let alignment: CGFloat = isImageBeforeText
                    ? 0
                    : expectedTextSize.width + 5
                let rect = CGRect(x: alignment,
                                  y: (height - image.size.height) / 2,
                              width: image.size.width,
                             height: image.size.height)
                image.draw(in: rect)
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题