iOS - Swift рисует фигуру внутри текущего контроллера вида - PullRequest
0 голосов
/ 17 сентября 2018

Я не совсем уверен, с чего начать, и искал, может ли кто-нибудь указать мне правильное прямое направление.

Я строю над следующим проектом: https://github.com/hoiberg/HM10-BluetoothSerial-iOS

Моя цель - нарисовать большой прямоугольник в середине экрана в верхней части окна, в котором отображаются последовательные сообщения (SerialViewController.swift) [Позже я удалю эти сообщения, поскольку они остаются для целей отладки] и иметь возможность окрашивать верхнюю половину прямоугольника и нижнюю половину прямоугольника независимо (они будут установлены, когда сообщение достигнет определенного условия, которое я уже реализовал).

Я хочу иметь возможность манипулировать как верхней, так и нижней половиной прямоугольника с помощью следующей функции:

func uiColorFromHex(rgbValue: Int) -> UIColor {

// &  binary AND operator to zero out other color values
// >>  bitwise right shift operator
// Divide by 0xFF because UIColor takes CGFloats between 0.0 and 1.0

let red =   CGFloat((rgbValue & 0xFF0000) >> 16) / 0xFF
let green = CGFloat((rgbValue & 0x00FF00) >> 8) / 0xFF
let blue =  CGFloat(rgbValue & 0x0000FF) / 0xFF
let alpha = CGFloat(1.0)

return UIColor(red: red, green: green, blue: blue, alpha: alpha)

}

Так что тогда я могу манипулировать цветом областей соответственно. Т.е.:

let myColorValue = 10

self.topHalfRectangle.hexStringToUIColor(myColorValue)

Буду признателен за любую помощь, чтобы направить меня в правильном направлении, поскольку я не могу заставить что-либо работать!

1 Ответ

0 голосов
/ 17 сентября 2018

Попробуйте это в вашем ViewController ...

// Set a couple of constants to hold the shapes

let topHalfRectangle = CAShapeLayer()
let bottomHalfRectangle = CAShapeLayer()

override func viewDidLoad() {
    super.viewDidLoad()

    // Create shape layer paths for the top and bottom rectangles
    // Note that these will fill the entire view,
    // inset as necessary.
    topHalfRectangle.path = UIBezierPath(rect: CGRect(x: 0.0, y: 0.0, width: view.frame.size.width, height: view.frame.midY)).cgPath
    bottomHalfRectangle.path = UIBezierPath(rect: CGRect(x: 0.0, y: view.frame.midY, width: view.frame.size.width, height: view.frame.midY)).cgPath

    // Add the shape layers to the view
    view.layer.addSublayer(topHalfRectangle)
    view.layer.addSublayer(bottomHalfRectangle)
}

Чтобы установить цвет:

topHalfRectangle.fillColor = uiColorFromHex(myColorValue).cgColor

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

import UIKit

extension UIColor {

    /// Create color from RGB hex
    ///
    /// - Parameter fromHexValue: Hexadecimal integer value

    convenience init(fromHexValue: Int) {

        // &  binary AND operator to zero out other color values
        // >>  bitwise right shift operator
        // Divide by 0xFF because UIColor takes CGFloats between 0.0 and 1.0

        let red =   CGFloat((fromHexValue & 0xFF0000) >> 16) / 0xFF
        let green = CGFloat((fromHexValue & 0x00FF00) >> 8) / 0xFF
        let blue =  CGFloat(fromHexValue & 0x0000FF) / 0xFF
        let alpha = CGFloat(1.0)

        self.init(red: red, green: green, blue: blue, alpha: alpha)
    }
}

Тогда просто используйте его по let color = UIColor(fromHexValue: 10).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...