2017-01-19 2 views
1

У меня есть пользовательская ячейка для моего UITableView. Если пользователь выбрал изображение для ячейки элемента будет показывать изображение: enter image description hereИспользуйте UIImageView или UIView для рисования в swift

если нет, то я буду показывать первые два символа имени элемента: enter image description here

Я использую следующий код из кода краски сделать прямоугольник:

public class CircleStyleKit : NSObject { 

    //// Drawing Methods 

    public dynamic class func drawCanvas1(frame targetFrame: CGRect = CGRect(x: 0, y: 0, width: 38, height: 38), resizing: ResizingBehavior = .aspectFit, circleLable: String = "DR", circleSize: CGSize = CGSize(width: 38, height: 38), textSize: CGFloat = 17) { 
     //// General Declarations 
     let context = UIGraphicsGetCurrentContext()! 

     //// Resize to Target Frame 
     context.saveGState() 
     let resizedFrame: CGRect = resizing.apply(rect: CGRect(x: 0, y: 0, width: 38, height: 38), target: targetFrame) 
     context.translateBy(x: resizedFrame.minX, y: resizedFrame.minY) 
     context.scaleBy(x: resizedFrame.width/38, y: resizedFrame.height/38) 
} // It's too long 

Я показал часть кода, потому что это слишком долго.

Затем я использовал UIView, чтобы сделать этот прямоугольник:

import UIKit 

class CirclyStyleView: UIView { 

    override func draw(_ rect: CGRect) { 
     CircleStyleKit.drawCanvas1() 
     } 

    } 

} 

Есть две проблемы:

Во-первых, если я использую UIImageView в моем раскадровки я просто рисовать образ и Я не знаю, могу ли я рисовать прямоугольник с моим кодом или нет. Однако I проверял, что он не работает.

Во-вторых, если я использую UIView, я могу нарисовать прямоугольник, но если я хочу нарисовать изображение, я должен использовать UIColor(patternImage: UIImage(named: "picName")!), но я не могу изменить этот кадр изображения так, как я сделал для просмотра изображения. Например, сделайте это круг, как я показал на картинке.

Вопрос в том, могу ли я использовать UIImageView, и есть ли способ сделать мой прямоугольник в UIImageView Или я могу использовать UIView и есть ли способ установить свой собственный образ. Я имею в виду изменение размера изображения и рамки.

ответ

1

Используйте один UIImageView и создайте на вашей модели метод, который возвращает UIImage с учетом его условий. Когда изображение нужно нарисовать, нарисуйте «контекст изображения».

Я не скор автором, так и в почти-стрижа ...

func imageForThisItem(item : AnyObject) -> UIImage { 
    // not really "AnyObject", use the object type in your data source array 
    // even better, make this a method on that model object 

    if (/* item has an image, like the sailboat */) { 
     return UIImage(named:"SailboatImage") // or however you got the sailboat image 
    } else { 
     // initialize "size" to be the same size as the sailboat images 
     UIGraphicsBeginImageContextWithOptions(size, false, 0) 

     // do your circle and text drawing here within the rect (0,0,size.width,size.height) 
     UIColor.greenColor().setFill() 
     let bezier = UIBezierPath(rect : rect) 
     bezier.fill() 

     let initials = item.initials() // however you get this 
     // even better, if this is a model method, then self.initials() 

     let attributes = // an attribute dictionary, see link below 
     initials.drawInRect(rect, withAttributes: attributes) 
     // or use CGOffsetRect to provide a little margin 

     var image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image 
    } 
} 

Here's an example текста атрибутов стрижа.

Еще одна отличная причина, по которой сделать этот метод на вашей модели, заключается в том, что вы, вероятно, должны кэшировать результат этого метода, чтобы вам не приходилось его вычислять каждый раз. Ленточный шаблон инициализатора идеально подходит для этого.

lazy var imageForThisItem: [UIImage] = { 
    // code as above, using "self" rather than item 
}() 
Смежные вопросы