iOS踩过的坑之富文本计算文字高度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS踩过的坑之富文本计算文字高度相关的知识,希望对你有一定的参考价值。

参考技术A 在设置了label中文字的字间距、行间距、段间距后,获取label总的高度,尝试了各种计算方法,最后只发现一种方式是有效的。

每次使用原字符串内容计算完高度时,最后一行都无法显示,

在文章末尾添加一个换行符,然后再计算总高度。

其中,options的枚举值说明:

Swift5 踩过的坑和奇怪的API笔记

踩过的坑和奇怪的API笔记

UINavigationController 导航栏

设置导航栏颜色
	navigationController?.navigationBar.barTintColor =  .blue
去掉导航栏下面的分割线
	navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
	navigationController?.navigationBar.shadowImage = UIImage()
  • 此时导航栏颜色和View背景相同,应该类似吧导航栏设置透明了的效果
  • 使用方法一设置导航栏颜色为.clear 并不能达到相同效果
  • 本方法会导致方法一设置导航栏颜色失效,此时使用以下代码设置导航栏颜色
	navigationController?.navigationBar.backgroundColor = .orange
设置导航栏字体和字体颜色
	self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor:UIColor.black,NSAttributedString.Key.font : UIFont.systemFont(ofSize: 25)]

 
 

UITabBar

UITabBar和导航栏结合使用
	tabBarCtrl = UITabBarController()
    tabBarCtrl.tabBar.tintColor = .DesignGreen
    let view1 = ViewHome()
    view1.tabBarItem.image = UIImage(named: "xiaozujian")
    view1.tabBarItem.title = "组件"   
    let view2 = ViewIcon()
    view2.tabBarItem.image = UIImage(named: "tubiao")
    view2.tabBarItem.title = "图标"

    let view1 = UINavigationController.init(rootViewController: viewHome)
    let view2 = UINavigationController.init(rootViewController: viewIcon)
    tabBarCtrl.addChild(view1)
    tabBarCtrl.addChild(view2)
    tabBarCtrl.selectedIndex = 0 //默认选择
    self.window?.rootViewController = tabBarCtrl
    window?.makeKeyAndVisible()
获取UITabBar的高度
let height = tabBarCtrl.tabBar.bounds.size.height
跳转界面隐藏UITabBar的方案
	override func viewWillDisappear(_ animated: Bool) 
        tabBarCtrl.tabBar.isHidden = true
    

 
 

UITableView

UITableViewCell里点击事件不生效

使用 cell.contentView.addSubview 代替 cell.addSubview

设置分割线内边距
	tableView.separatorInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
隐藏所有分割线分割线
  • 方法一:
	self.separatorStyle = .none
  • 方法二:
	tableView.separatorInset = UIEdgeInsets(top: 0, left: tableView.frame.width, bottom: 0, right: 0)
隐藏底部多余行及分割线
	tableview.tableFooterView = UIView(frame: CGRect.zero)

 
 

UICollectionView & UIScrollView

cell里的按钮区域只能点击无法滑动
使用`UILabel`或`UIImageView`等绑定`UITapGestureRecognizer`  代替`UIButton`
	func InitUI()
		let img = UIImageView(frame:CGRect(xxxxxx))
	    let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(ClickBtn(_:)))
	    img.addGestureRecognizer(singleTapGesture)
	    img.isUserInteractionEnabled = true
    
	@objc func ClickBtn(_ tap:UITapGestureRecognizer)
        
    
允许多选
 	collection.allowsMultipleSelection = true
ScrollView是否显示滑动条
	scrollView.showsHorizontalScrollIndicator = false
	scrollView.showsVerticalScrollIndicator = false
ScrollView使ContentSize小于UIScrollView大小也能滑动
   scrollView.alwaysBounceVertical = true
   scrollView.alwaysBounceHorizontal = true
ScrollView分页滑动
	func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) 
        if (!decelerate)
        
            scrollView.setContentOffset(CGPoint(x: CGFloat(Int(scrollView.contentOffset.x/pageWidth + 0.5))*pageWidth, y: scrollView.contentOffset.y), animated: true)
            selectPage = Int(scrollView.contentOffset.x/pageWidth + 0.5)
        
    
    func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) 
        scrollView.setContentOffset(CGPoint(x: CGFloat(Int(scrollView.contentOffset.x/pageWidth + 0.5))*pageWidth, y: scrollView.contentOffset.y), animated: true)
        selectPage = Int(scrollView.contentOffset.x/pageWidth + 0.5)
    
UIScrollView截长图
///截长图
	extension UIScrollView 
    /// 截长屏Image
    var captureLongImage: UIImage? 
        
        var image: UIImage? = nil
        let savedContentOffset:CGPoint? = contentOffset
        let savedFrame:CGRect? = frame
        
        contentOffset = .zero
        frame = CGRect(x: 0, y: 0,
                       width: contentSize.width,
                       height: contentSize.height)
        UIGraphicsBeginImageContextWithOptions(
            CGSize(width: frame.size.width,
                   height: frame.size.height),
            false,
            0.0)
        layer.render(in: UIGraphicsGetCurrentContext()!)
        image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        
        contentOffset = savedContentOffset ?? contentOffset
        frame = savedFrame ?? frame
        return image
        
    
    
    fileprivate func writeImageToAlbum(_ image: UIImage) 
            
            UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(image:didFinishSavingWithError:contextInfo:)), nil)
    
        
    @objc fileprivate func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo:UnsafeRawPointer) 
            if let _ = error as NSError? 
                print("保存失败,请重试")
             else 
                print("保存成功!")
            
    
    

UIView

截图
	extension UIView 
    /// 截屏Image
    	func captureImage(size:CGSize)-> UIImage? 
        
	        // 参数①:截屏区域  参数②:是否透明  参数③:清晰度
	        UIGraphicsBeginImageContextWithOptions(frame.size, false, 0.0)
	        layer.render(in: UIGraphicsGetCurrentContext()!)
	        let image = UIGraphicsGetImageFromCurrentImageContext()
	        
	        UIGraphicsEndImageContext()
	        return image
	    
	    
	     func captureImageInPos( rect: CGRect) -> UIImage? 
	      UIGraphicsBeginImageContext(rect.size)
	      guard let context = UIGraphicsGetCurrentContext() else  return nil 
	      context.translateBy(x: -rect.minX, y: -rect.minY)
	        self.draw(.zero)
	      let croppedImage = UIGraphicsGetImageFromCurrentImageContext()
	      UIGraphicsEndImageContext()
	      return croppedImage
    	
	
拼接图片
	//拼接图片
	func combinTwoImage(image1:UIImage,image2:UIImage) -> UIImage
	
	    let width = max(image1.size.width, image2.size.width)
	    let height = image1.size.height + image2.size.height
	    let offScreenSize = CGSize.init(width: width, height: height)
	    
	    
	    UIGraphicsBeginImageContextWithOptions(offScreenSize, false, 0.0)
	    let rect = CGRect.init(x:0, y:0, width:width, height:image1.size.height)
	    image1.draw(in: rect)
	    
	    let rect2 = CGRect.init(x:0, y:image1.size.height, width:width, height:image2.size.height)
	    image2.draw(in: rect2)
	    
	    let image:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
	    
	    UIGraphicsEndImageContext();
	    
	    return image;
	
获取当前UIView的UIVIewController
	extension UIView
		func ParentCtrl()->UIViewController
	       var vc:UIResponder = self
	       while vc.isKind(of: UIViewController.self) != true 
	           vc = vc.next!
	       
	       return vc as! UIViewController
		
	

 
 

UIImage

重设图片大小和等比例缩放
	extension UIImage 
	    /**
	     *  重设图片大小
	     */
	    func  reSizeImage(reSize: CGSize )-> UIImage  
	        //UIGraphicsBeginImageContext(reSize);
	        UIGraphicsBeginImageContextWithOptions (reSize, false , UIScreen .main.scale);
	        //绘制图片
	        self.draw(in: CGRect(x: 0,
	                              y: 0,
	                              width: reSize.width,
	                              height: reSize.height))
	        let  reSizeImage: UIImage  =  UIGraphicsGetImageFromCurrentImageContext ()!
	        UIGraphicsEndImageContext ();
	        return  reSizeImage;
	    
	    
	    /**
	     *  等比率缩放
	     */
	    func  scaleImage(scaleSize: CGFloat )-> UIImage  
	        let  reSize = CGSize(width: self .size.width * scaleSize, height: self .size.height * scaleSize)  
	        return  reSizeImage(reSize: reSize)
	    
    
裁切图片
	extension UIImage
	    func crop(_ rect: CGRect) -> UIImage? 
	        let img = self.reSizeImage(reSize: UIScreen.main.currentMode!.size)
	        var newRect = rect
	        let WIDTH:CGFloat = UIScreen.main.bounds.width
			let RELWIDTH = UIScreen.main.currentMode?.size.width

	        let scale = (RELWIDTH!/WIDTH)
	        newRect.origin.x *=  scale*scale
	        newRect.origin.y *= scale*scale
	        newRect.size.width *= scale*scale
	        newRect.size.height *= scale*scale
	        
	        guard let imageRef = img.cgImage?.cropping(to: newRect) else  return nil 
	        return UIImage(cgImage: imageRef)
	    
	
获取纯色UIImage
	extension UIImage 
	    convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) 
	        let rect = CGRect(origin: .zero, size: size)
	        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
	        color.setFill()
	        UIRectFill(rect)
	        let image = UIGraphicsGetImageFromCurrentImageContext()
	        UIGraphicsEndImageContext()
	
	        guard let cgImage = image?.cgImage else  return nil 
	        self.init(cgImage: cgImage)
	    
	
改变颜色
	extension UIImage 
		func changeColor(color:UIColor) -> UIImage 
		           UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
		           let context = UIGraphicsGetCurrentContext()
		           context?.translateBy(x: 0, y: self.size.height)
		           context?.scaleBy(x: 1.0, y: -1.0)//kCGBlendModeNormal
		           context?.setBlendMode(.normal)
		           let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
		           context?.clip(to: rect, mask: self.cgImage!);
		           color.setFill()
		           context?.fill(rect)
		           let newImage = UIGraphicsGetImageFromCurrentImageContext()
		           UIGraphicsEndImageContext()
		           return newImage!
		       
       
获取网络图片
	func GetImgByUrl(path:String)->UIImage
	    
	    let url = NSURL(string: path)!
	
	    let data = NSData(contentsOf: url as URL)!
	
	    return UIImage(data: data as Data,scale: 1.0)!
	

 
 

UIImageView

圆角不生效
	imgView.layer.masksToBounds = true

 
 

UIButton

UIButton中图片和文字的位置变换
	enum ButtonEdgeInsetsStyle 
	   case ButtonEdgeInsetsStyleTop // image在上,label在下
	   case ButtonEdgeInsetsStyleLeft  // image在左,label在右
	   case ButtonEdgeInsetsStyleBottom  // image在下,label在上
	   case ButtonEdgeInsetsStyleRight // image在右,label在左
	
	extension UIButton 
	    func layoutButtonEdgeInsets(style:ButtonEdgeInsetsStyle,space:CGFloat) 
	        let labelWidth : CGFloat = self.titleLabel?.frame.size.height ?? 36
	        let labelHeight : CGFloat = self.titleLabel?.frame.size.width ?? 20
	        var imageEdgeInset =以上是关于iOS踩过的坑之富文本计算文字高度的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序开发过程中踩过的坑集合,没有解决不了的错误,只有踩不完的坑

idea使用心得-踩过的坑

Swift5 踩过的坑和奇怪的API笔记

Swift5 踩过的坑和奇怪的API笔记

Swift5 踩过的坑和奇怪的API笔记

iOS踩过的坑之一个Controller中放两个collectionView