简体   繁体   English

iOS如何在表格视图单元格Swift中调整图像大小

[英]iOS How to resize image at table view cell Swift

I work with multi platform application, and i have issues, i want that when app is load in iPad for that i want to change image size at tableview cell. 我使用多平台应用程序,但遇到问题,我希望在iPad上加载应用程序时要更改tableview单元格的图像大小。

Now i have auto-layout: 现在我有自动布局:

https://i.stack.imgur.com/yMeGN.png

I detect at which device app run use this code: 我检测到运行哪个设备应用程序时使用以下代码:

public extension UIDevice {

static let modelName: String = {
    var systemInfo = utsname()
    uname(&systemInfo)
    let machineMirror = Mirror(reflecting: systemInfo.machine)
    let identifier = machineMirror.children.reduce("") { identifier, element in
        guard let value = element.value as? Int8, value != 0 else { return identifier }
        return identifier + String(UnicodeScalar(UInt8(value)))
    }

    func mapToDevice(identifier: String) -> String { // swiftlint:disable:this cyclomatic_complexity
        #if os(iOS)
        switch identifier {
        case "iPod5,1":                                 return "iPod Touch 5"
        case "iPod7,1":                                 return "iPod Touch 6"
        case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
        case "iPhone4,1":                               return "iPhone 4s"
        case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
        case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
        case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
        case "iPhone7,2":                               return "iPhone 6"
        case "iPhone7,1":                               return "iPhone 6 Plus"
        case "iPhone8,1":                               return "iPhone 6s"
        case "iPhone8,2":                               return "iPhone 6s Plus"
        case "iPhone9,1", "iPhone9,3":                  return "iPhone 7"
        case "iPhone9,2", "iPhone9,4":                  return "iPhone 7 Plus"
        case "iPhone8,4":                               return "iPhone SE"
        case "iPhone10,1", "iPhone10,4":                return "iPhone 8"
        case "iPhone10,2", "iPhone10,5":                return "iPhone 8 Plus"
        case "iPhone10,3", "iPhone10,6":                return "iPhone X"
        case "iPhone11,2":                              return "iPhone XS"
        case "iPhone11,4", "iPhone11,6":                return "iPhone XS Max"
        case "iPhone11,8":                              return "iPhone XR"
        case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
        case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad 3"
        case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad 4"
        case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad Air"
        case "iPad5,3", "iPad5,4":                      return "iPad Air 2"
        case "iPad6,11", "iPad6,12":                    return "iPad 5"
        case "iPad7,5", "iPad7,6":                      return "iPad 6"
        case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad Mini"
        case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad Mini 2"
        case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad Mini 3"
        case "iPad5,1", "iPad5,2":                      return "iPad Mini 4"
        case "iPad6,3", "iPad6,4":                      return "iPad Pro (9.7-inch)"
        case "iPad6,7", "iPad6,8":                      return "iPad Pro (12.9-inch)"
        case "iPad7,1", "iPad7,2":                      return "iPad Pro (12.9-inch) (2nd generation)"
        case "iPad7,3", "iPad7,4":                      return "iPad Pro (10.5-inch)"
        case "iPad8,1", "iPad8,2", "iPad8,3", "iPad8,4":return "iPad Pro (11-inch)"
        case "iPad8,5", "iPad8,6", "iPad8,7", "iPad8,8":return "iPad Pro (12.9-inch) (3rd generation)"
        case "AppleTV5,3":                              return "Apple TV"
        case "AppleTV6,2":                              return "Apple TV 4K"
        case "AudioAccessory1,1":                       return "HomePod"
        case "i386", "x86_64":                          return "Simulator \(mapToDevice(identifier: ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "iOS"))"
        default:                                        return identifier
        }
        #elseif os(tvOS)
        switch identifier {
        case "AppleTV5,3": return "Apple TV 4"
        case "AppleTV6,2": return "Apple TV 4K"
        case "i386", "x86_64": return "Simulator \(mapToDevice(identifier: ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "tvOS"))"
        default: return identifier
        }
        #endif
    }

    return mapToDevice(identifier: identifier)
}()  
}

My idea is, at table view 我的想法是,在表格视图

if modelName.range(of:"iPad") != nil 如果modelName.range(of:“ iPad”)!=无

i want to change image size, for example 200x200; 我想更改图像尺寸,例如200x200;

Resizing your image will not affect your constraints. 调整图像大小不会影响您的约束。 So you may want to update them aswell. 因此,您可能还需要更新它们。 for now-- you can resize images by doing so: 目前-您可以通过以下方式调整图像大小:

import UIKit
extension UIImage {

    /// Returns a image that fills in newSize

   func resizedImage(newSize: CGSize) -> UIImage {

      guard self.size != newSize else { return self }
      UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0);
      self.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
      let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
      UIGraphicsEndImageContext()
      return newImage
   }

    /// Returns a resized image that fits in rectSize, keeping it's aspect ratio
    /// Note that the new image size is not rectSize, but within it.
    func resizedImageWithinRect(rectSize: CGSize) -> UIImage {
        let widthFactor = size.width / rectSize.width
        let heightFactor = size.height / rectSize.height

        var resizeFactor = widthFactor
        if size.height > size.width {
            resizeFactor = heightFactor
        }
        let newSize = CGSize(width: size.width/resizeFactor, height: size.height/resizeFactor)
        let resized = resizedImage(newSize)
        return resized
    }

}

I'm still using this code in my apps. 我仍在我的应用程序中使用此代码。 So rest assured 所以放心

// Tests
guard let url = NSURL(string: "http://placehold.it/300x150") else { fatalError("Bad URL") }
guard let data = NSData(contentsOfURL: url) else { fatalError("Bad data") }
guard let img = UIImage(data: data) else { fatalError("Bad data") }

let outImageFit = img.resizedImageWithinRect(CGSize(width: 200, height: 200))
let outImageFill = img.resizedImage(CGSize(width: 200, height: 200))

You can use Auto layout for the same. 您可以使用自动布局。 Just create IBOutlet for the height and width constraint of ImageView. 只需为ImageView的高度和宽度约束创建IBOutlet。

public func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

   //check for iPad and set the constraint values to 200*200
   if modelName.range(of:"iPad") != nil
   {
        cell.imageViewHeightConstraint.constant = 200
        cell.imageViewWidthConstraint.constant = 200
   }
   else
   {
        cell.imageViewHeightConstraint.constant = 100
        cell.imageViewWidthConstraint.constant = 100
   }
}

You can even do the same from storyboard by just selecting the height or width constraint and add another constant for iPad. 您甚至可以从情节提要中执行相同操作,只需选择高度或宽度约束,然后为iPad添加另一个常量。

----Please check the below screenshots on how to add constant for iPad in storyboard. ----请检查以下屏幕截图,了解如何在情节提要中为iPad添加常量。 1. Select the constraint. 1.选择约束。 Click on + icon from right properties menu. 从右侧的属性菜单中单击+图标。 2. Select Compact compact for all types of iPad and add variation. 2.为所有类型的iPad选择“紧凑型紧凑型”并添加变形。 3. Set the constant value for iPad. 3.设置iPad的常数。 在此处输入图片说明

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM