Swift drawRect function will not update drawing - ios

I want the stepper in my view controller to update a variable that determines the color of the circle in my UIView. My variables are getting updated, but the circle in my updateColor function is not getting drawn.
ViewController:
var colors = UIView1();
#IBOutlet var redValue: UILabel!
#IBOutlet var greenValue: UILabel!
#IBOutlet var blueValue: UILabel!
#IBOutlet var redStepper: UIStepper!
#IBOutlet var greenStepper: UIStepper!
#IBOutlet var blueStepper: UIStepper!
#IBOutlet var v: UIView1!
override func viewDidLoad()
{
super.viewDidLoad()
}
override func didReceiveMemoryWarning()
{
super.didReceiveMemoryWarning()
}
#IBAction func redChange(sender: UIStepper)
{
redValue.text = Int(sender.value).description;
colors.redd1 = (Double(sender.value))*30;
colors.updateColor()
}
#IBAction func greenChange(sender: UIStepper)
{
greenValue.text = Int(sender.value).description;
colors.greenn1 = (Double(sender.value))*30;
colors.updateColor()
}
#IBAction func blueChange(sender: UIStepper)
{
blueValue.text = Int(sender.value).description;
colors.bluee1 = (Double(sender.value))*30;
colors.updateColor()
}
UIView:
var redd1 = 0.0;
var greenn1 = 0.0;
var bluee1 = 0.0;
override init(frame: CGRect)
{
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
override func drawRect(rect: CGRect)
{
let circle2 = UIView(frame: CGRect(x: -25.0, y: 10.0, width: 100.0, height:100.0))
circle2.layer.cornerRadius = 50.0
let startingColor2 = UIColor(red: (CGFloat(redd1))/255, green: (CGFloat (greenn1))/255, blue: (CGFloat(bluee1))/255, alpha: 1.0)
circle2.backgroundColor = startingColor2;
addSubview(circle2);
}
func updateColor()
{
let circle = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))
circle.layer.cornerRadius = 50.0;
let startingColor = UIColor(red: (CGFloat(redd1))/255, green: (CGFloat(greenn1))/255, blue: (CGFloat(bluee1))/255, alpha: 1.0)
circle.backgroundColor = startingColor;
addSubview(circle);
}

You need to call the method setNeedsDisplay() on your view. That will call drawRect
So - add the method after you addSubview(circle)

Related

The Border and Padding styles in the text field do not apply in swift5

I am currently working on the iOS project. My problem is that nothing in the textfield changes me. It's hard to find an answer to what's wrong. How should I change it?
import Foundation
import UIKit
class passwrodCheckAlertController : UIViewController {
#IBOutlet weak var passModalAlert: UITextView!
#IBOutlet weak var passTextfield: UITextField!
#IBOutlet weak var cancelbutton: UIButton!
#IBOutlet weak var okButton: UIButton!
// let color = UIColor.init(red: 0, green: 0, blue: 0, alpha: 0.5)
let color = UIColor.red
let insets = UIEdgeInsets.init(top: 31.7, left: 0.0, bottom: 0.0, right: 0.0)
override func viewDidLoad() {
super.viewDidLoad()
self.passModalAlert.layer.cornerRadius = 8
self.passTextfield.layer.cornerRadius = 3
self.passTextfield.layer.borderColor = color.cgColor
self.passModalAlert.textContainerInset = insets
changeViewFont()
}
}
class PaddingTextField : UITextField {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
bounds.inset(by: UIEdgeInsets(top: 0, left: 100, bottom: 0, right: 15))
return bounds
}
}
MainStoryboard
Screen not change
CornerRadius in text view works very well.
Thanks in advance
Edit start
I listened to the comments and used the leftview. And the gap problem was solved. But still my Border style doesn't change.
let paddingView = UIView(frame: CGRect.init(x: 0, y: 0, width: 10, height: self.passTextfield.frame.height))
self.passTextfield.leftView = paddingView
self.passTextfield.leftViewMode = .always
self.passTextfield.layer.cornerRadius = 3
self.passTextfield.layer.borderColor = color.cgColor
self.passModalAlert.textContainerInset = insets
Border style doesn't change.
Edit Second start
#IBOutlet weak var passTextfield: PaddingTextField!
...
class PaddingTextField : UITextField {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func awakeFromNib() {
//set your border style here
self.layer.cornerRadius = 3
self.layer.borderColor = UIColor.red.cgColor
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
bounds.inset(by: UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 15))
return bounds
}
}
But this has not changed anything changed.
Your issue seems to be your setUp when you created the outlet you should select PaddingTextField instead of UITextField as UITextField is a superclass and does not know anything about the additional functionality that it's children have.
Delete the IBOutlet
#IBOutlet weak var passTextfield: UITextField!
and recreate it it should look like this:
#IBOutlet weak var passTextfield: PaddingTextField!
hope this helps.
In regards to the border:
class PaddingTextField : UITextField {
override func awakeFromNib() {
//set your border style here
self.layer.cornerRadius = 3
// Add borderWidth as otherwise you are having a 0 point wide border
self.layer.borderWidth = 5
self.layer.borderColor = UIColor.red.cgColor
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
bounds.inset(by: UIEdgeInsets(top: 0, left: 100, bottom: 0, right: 15))
return bounds
}
}
runs as expected:

pass value from embeded viewcontroller to the Homecontroller

I have the UITextField in the embedded viewcontroller and the button in the main homecontroller. i want to pass the values from the input field to the home controller so that i can check for null values on button click.
the value of UserId and Password should be passed to the HomeController
following is my code
import Foundation
import UIKit
class HomeController: UIViewController, UITextFieldDelegate {
#IBOutlet weak
var loginContainerShadow: UIView!#IBOutlet weak
var login: UIButton!
#IBAction func login(_ sender: Any) {
let myObj: ViewController = self.children.last as!ViewController;
let userid: UITextField = myObj.UserId!as UITextField;
print(userid)
}
override func viewDidLoad() {
super.viewDidLoad()
loginContainerShadow.layer.cornerRadius = 10
loginContainerShadow.layer.shadowColor = (UIColor(red: 0 / 255.0, green: 0 / 138.0, blue: 0 / 140.0, alpha: 7).cgColor)
loginContainerShadow.layer.shadowOffset = CGSize(width: 0, height: 1.75)
loginContainerShadow.layer.shadowRadius = 1
loginContainerShadow.layer.shadowOpacity = 0.45
login.setGradientBackground(colorOne: UIColor(red: 172.0 / 255.0, green: 146.0 / 255, blue: 236.0 / 255.0, alpha: 100), colorTwo: UIColor(red: 109.0 / 255.0, green: 71.0 / 255, blue: 204.0 / 255, alpha: 100))
login.layer.cornerRadius = 25
}
override func touchesBegan(_ touches: Set < UITouch > , with event: UIEvent ? ) {
self.view.endEditing(true)
}
}
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
var checked = "no";
#IBOutlet
var loginContainerShadow: UIView!
#IBOutlet weak
var UserId: UITextField!{
didSet {
UserId.setBottomBorder()
UserId.delegate = self
}
}
#IBOutlet weak
var Password: UITextField!{
didSet {
Password.setBottomBorder()
Password.delegate = self
}
}
#IBOutlet
var UserIdValidate: UIImageView!#IBOutlet
var PasswordValidate: UIImageView!
override func touchesBegan(_ touches: Set < UITouch > , with event: UIEvent ? ) {
self.view.endEditing(true)
}
override func viewDidLoad() {
super.viewDidLoad()
}
#IBAction func UserIdChanged(_ sender: Any) {
if UserId.text == "" {
UserId.setBottomBorder()
} else {
UserId.setPurpleBottomBorder()
}
}
#IBAction func PasswordChanged(_ sender: Any) {
if Password.text == "" {
Password.setBottomBorder()
} else {
Password.setPurpleBottomBorder()
}
}
#IBOutlet weak
var RememberMe: UIButton!
#IBAction func RemenberMe(_ sender: Any) {
if (checked == "no") {
RememberMe.setImage(UIImage(named: "radio_button_unchecked"),
for: UIControl.State.normal)
checked = "yes"
} else if (checked == "yes") {
RememberMe.setImage(UIImage(named: "proper"),
for: UIControl.State.normal)
checked = "no"
}
}
}

Collection Cell Content Size

I added a view as parent red view in CollectionViewCell and the next blue subview at the center of the parent view. It works correctly and the sub view goes at the center of the parent view before collection cell size is not changed. But, The cell size is changed by conforming the method from UICollectionViewDelegateFlowLayout protocol and the view is not centered of the cell correctly. How I can solve this issue ?
class ItemCollectionViewCell: UICollectionViewCell {
var parentView: UIView!
var circularView: UIView!
var itemImage: UIImageView!
var itemName: UILabel!
override init(frame: CGRect) {
super.init(frame: frame)
// self.updateView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.updateView()
}
func updateView(){
self.clipsToBounds = true
self.parentView = UIView(frame: CGRect(x: 0.0, y: 0.0, width:
self.frame.size.width, height: self.frame.size.height))
self.parentView.backgroundColor = UIColor.red
self.circularView = UIView(frame: CGRect(x: 0, y: 0, width:
self.parentView.frame.size.width / 4 , height:
self.parentView.frame.size.width / 4 ))
self.circularView.backgroundColor = UIColor.blue
self.addSubview(parentView)
self.parentView.addSubview(self.circularView)
self.circularView.center = self.parentView.center
}
}
1]2
Try this code
self.circularView.center = CGPoint(x: self. parentView.bounds.midX, y: self. parentView.bounds.midY)
self.parentView.addSubview(self.circularView)
self.addSubview(parentView)
Try doing:
self.circularView.center = CGPointMake(CGRectGetMidX(self.parentView.bounds), CGRectGetMidY(self.parentView.bounds))
Why this should work? Try checking values of self.parentView.center for each cell, they might not be what you want them to be, because center property gives values with respect to parent view coordinate system.
Remove the following line from updateView()
self.circularView.center = self.parentView.center
Please add it to the following method:
override func layoutSubviews() {
super.layoutSubviews()
self.circularView.center = self.parentView.center
}
e.g.
class ItemCollectionViewCell: UICollectionViewCell {
var parentView: UIView!
var circularView: UIView!
var itemImage: UIImageView!
var itemName: UILabel!
override init(frame: CGRect) {
super.init(frame: frame)
// self.updateView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.updateView()
}
func updateView(){
self.clipsToBounds = true
self.parentView = UIView(frame: CGRect(x: 0.0, y: 0.0, width:
self.frame.size.width, height: self.frame.size.height))
self.parentView.backgroundColor = UIColor.red
self.circularView = UIView(frame: CGRect(x: 0, y: 0, width:
self.parentView.frame.size.width / 4 , height:
self.parentView.frame.size.width / 4 ))
self.circularView.backgroundColor = UIColor.blue
self.addSubview(parentView)
self.parentView.addSubview(self.circularView)
}
override func layoutSubviews() {
super.layoutSubviews()
self.circularView.center = self.parentView.center
}
}

Swift - not detect the event of moving the Slider in Custom Cell

I am developing an application in swift 3 with the following interface:
I have to add some details about the legend. The legend consists of two views (firstView and secondView). Where a default "layout" is 0, until we click on it and that is when the detail of the cell is opened. Bells, a legend like this appears:
Currently the slider send events are as follows:
The interface consists of two views. The map that is the view of the bottom ("MainMapVC") that if we make a "swipe" to the right appears the legend of the map "LefSideViewController" formed by custom cells ("customCell").
I enclose the code of the three classes:
The "customCell":
import UIKit
protocol customCellDelegate {
func didTappedSwicht(cell: customCell)
func didMoveSlider(cell: customCell)
}
class customCell: UITableViewCell {
//MARK: OUTLETS VIEW 1
#IBOutlet weak var firstView: UIView!
#IBOutlet weak var firstViewLabel: UILabel!
#IBOutlet weak var swichtActiveLayer: UISwitch!
//MARK: OUTLETS VIEW 2
#IBOutlet weak var secondView: UIView!
#IBOutlet weak var secondViewLabel: UILabel!
#IBOutlet weak var secondHeightConstraint: NSLayoutConstraint!
#IBOutlet weak var idDeliveryResponse: UILabel!
#IBOutlet weak var minRangeDeliveryResponse: UILabel!
#IBOutlet weak var maxRangeDeliveryResponse: UILabel!
#IBOutlet weak var initialMinDeliveryResponse: UILabel!
#IBOutlet weak var initialMaxDeliveryResponse: UILabel!
#IBOutlet weak var sliderOpacity: UISlider!
// MARK: VARIABLES
var delegate: customCellDelegate!
override func awakeFromNib() {
super.awakeFromNib()
}
func setupWithModel(model: deliveriesLeftTableModel){
firstViewLabel.text = model.firstViewLabel
secondViewLabel.text = model.secondViewLabel
idDeliveryResponse.text = model.idDeliveryResponse
minRangeDeliveryResponse.text = model.minRangeDeliveryResponse
maxRangeDeliveryResponse.text = model.maxRangeDeliveryResponse
initialMinDeliveryResponse.text = model.initialMinDeliveryResponse
initialMaxDeliveryResponse.text = model.initialMaxDeliveryResponse
swichtActiveLayer.setOn(model.swichtActiveLayer, animated: true)
sliderOpacity.value = model.sliderOpacity
}
#IBAction func swichtValueChanged(_ sender: Any) {
delegate.didTappedSwicht(cell: self)
}
#IBAction func primaryActionTrigger(_ sender: Any){
print("primaryActionTrigger")
}
#IBAction func touchUpInside(_ sender: Any){
print("touchUpInside")
}
/*#IBAction func sliderValueChanged(_ sender: Any) {
delegate.didMoveSlider(cell: self)
}*/
var showsDetails = false {
didSet {
secondHeightConstraint.priority = showsDetails ? 250 : 900
}
}
}
 
The "LefSideViewController" is:
import UIKit
protocol customCellDelegate {
func didTappedSwicht(cell: customCell)
func didMoveSlider(cell: customCell)
}
class customCell: UITableViewCell {
//MARK: OUTLETS VIEW 1
#IBOutlet weak var firstView: UIView!
#IBOutlet weak var firstViewLabel: UILabel!
#IBOutlet weak var swichtActiveLayer: UISwitch!
//MARK: OUTLETS VIEW 2
#IBOutlet weak var secondView: UIView!
#IBOutlet weak var secondViewLabel: UILabel!
#IBOutlet weak var secondHeightConstraint: NSLayoutConstraint!
#IBOutlet weak var idDeliveryResponse: UILabel!
#IBOutlet weak var minRangeDeliveryResponse: UILabel!
#IBOutlet weak var maxRangeDeliveryResponse: UILabel!
#IBOutlet weak var initialMinDeliveryResponse: UILabel!
#IBOutlet weak var initialMaxDeliveryResponse: UILabel!
#IBOutlet weak var sliderOpacity: UISlider!
// MARK: VARIABLES
var delegate: customCellDelegate!
override func awakeFromNib() {
super.awakeFromNib()
}
func setupWithModel(model: deliveriesLeftTableModel){
firstViewLabel.text = model.firstViewLabel
secondViewLabel.text = model.secondViewLabel
idDeliveryResponse.text = model.idDeliveryResponse
minRangeDeliveryResponse.text = model.minRangeDeliveryResponse
maxRangeDeliveryResponse.text = model.maxRangeDeliveryResponse
initialMinDeliveryResponse.text = model.initialMinDeliveryResponse
initialMaxDeliveryResponse.text = model.initialMaxDeliveryResponse
swichtActiveLayer.setOn(model.swichtActiveLayer, animated: true)
sliderOpacity.value = model.sliderOpacity
}
#IBAction func swichtValueChanged(_ sender: Any) {
delegate.didTappedSwicht(cell: self)
}
#IBAction func sliderValueChanged(_ sender: Any) {
delegate.didMoveSlider(cell: self)
}
var showsDetails = false {
didSet {
secondHeightConstraint.priority = showsDetails ? 250 : 900
}
}
}
And the last one "MainMapVC":
import UIKit
import GoogleMaps
import MapKit
import ObjectMapper
//MARK: GLOBAL VARIABLES
let showLegend = UserDefaults.standard
let showLegendInformation = "showLegend"
var fields:WFSModel = WFSModel()
var allFields:[Field] = [Field]()
var total_parcels:[Parcel] = [Parcel]()
var poligons: [GMSPolygon] = []
var holes: [GMSMutablePath] = []
var snapShotsLegend : SnapshotsLegendModel = SnapshotsLegendModel()
var allDeliveries: [GMSURLTileLayer] = [GMSURLTileLayer]()
class MainMapVC: UIViewController, UISearchBarDelegate, CLLocationManagerDelegate, GMSMapViewDelegate {
//OUTLETS:
#IBOutlet weak var dragLegend: NSLayoutConstraint!
#IBOutlet weak var iconDragLegend: UIImageView!
#IBOutlet weak var mapView: GMSMapView!
#IBOutlet weak var timer: UIActivityIndicatorView!
#IBOutlet weak var dragLengendView: UIView!
#IBOutlet weak var iconBarLegend: UIBarButtonItem!
//MARK: VARIABLES
let layer: WMSTileOverlay
var window: UIWindow?
var centerContainer: MMDrawerController?
var url = ""
let locationManager = CLLocationManager()
var coordenatesCellSelected: [Double] = [Double]()
var hole = GMSMutablePath()
var wfs:WFSModel = WFSModel()
var rect = GMSMutablePath()
let start = NSDate();
var polygonSelect = GMSPath()
var posSelecteTable:Int = 0
var menu_vc: LeftSideViewController!
//MARK:VIEWS
override func viewWillAppear(_ animated: Bool) {
super.viewDidLoad()
if coordenatesCellSelected.count != 0 {
let bounds = GMSCoordinateBounds(path: poligons[posSelecteTable].path!)
self.mapView!.animate(with: GMSCameraUpdate.fit(bounds, withPadding: 15.0))
poligons[posSelecteTable].fillColor = UIColor(red: 8/256, green: 246/255, blue: 191/255, alpha: 0.9)
poligons[posSelecteTable].strokeColor = .blue
poligons[posSelecteTable].strokeWidth = 2
poligons[posSelecteTable].map = mapView
}
if showLegend.bool(forKey: showLegendInformation) == true {
//self.dragLengendView.isHidden = false
self.iconBarLegend.isEnabled = true
}
}
override func viewDidLoad() {
super.viewDidLoad()
menu_vc = self.storyboard?.instantiateViewController(withIdentifier: "LeftSideViewController") as! LeftSideViewController
menu_vc.delegate = self
self.timer.startAnimating()
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
mapView.isMyLocationEnabled = true
mapView.settings.myLocationButton = true
url = ""
let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToGesture))
swipeRight.direction = UISwipeGestureRecognizerDirection.right
let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToGesture))
swipeRight.direction = UISwipeGestureRecognizerDirection.left
self.view.addGestureRecognizer(swipeRight)
self.view.addGestureRecognizer(swipeLeft)
if showLegend.bool(forKey: showLegendInformation) == false {
self.iconBarLegend.tintColor = UIColor.clear
self.iconBarLegend.isEnabled = false
}
if !allFields.isEmpty{
drawFields()
}
if allFields.isEmpty{
self.getCardfromGeoserver()
}
self.mapView.mapType = .satellite
}
#IBAction func menu_action(_ sender: UIBarButtonItem) {
if AppDelegate.menu_bool{
show_menu_left()
}else{
close_menu_left()
}
}
func show_menu_left(){
UIView.animate(withDuration: 0.6) { ()->Void in
self.menu_vc.view.frame = CGRect(x: 0, y: 60, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
self.menu_vc.view.backgroundColor = UIColor.black.withAlphaComponent(0.6)
self.addChildViewController(self.menu_vc)
self.view.addSubview(self.menu_vc.view)
AppDelegate.menu_bool = false
}
}
func close_menu_left(){
UIView.animate(withDuration: 0.6, animations: { ()->Void in
self.menu_vc.view.frame = CGRect(x: -UIScreen.main.bounds.size.width, y: 60, width: -UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
}) { (finished) in
self.menu_vc.view.removeFromSuperview()
}
AppDelegate.menu_bool = true
}
func respondToGesture(gesture: UISwipeGestureRecognizer){
switch gesture.direction{
case UISwipeGestureRecognizerDirection.right:
show_menu_left()
case UISwipeGestureRecognizerDirection.left:
close_on_swipe()
default:
break
}
}
func close_on_swipe(){
if AppDelegate.menu_bool{
show_menu_left()
}else{
close_menu_left()
}
}
//MARK: FUNCITIONS
required init?(coder aDecoder: NSCoder) {
self.layer = WMSTileOverlay(urlArg: url)
super.init(coder: aDecoder)
}
func getCardfromGeoserver() {
mapView.clear()
//mapView.camera = GMSCameraPosition(target: CLLocationCoordinate2D(latitude: 40.4256572451179, longitude: -3.18201821297407), zoom: 5.5, bearing: 0, viewingAngle: 0)
//MAP POSITION WITH DIFERENTS LAYERS
mapView.camera = GMSCameraPosition(target: CLLocationCoordinate2D(latitude: 39.59955969890008, longitude: -0.6421281303940684), zoom: 18.0, bearing: 0, viewingAngle: 0)
let WFS_JSON = "http://192.168.0.160:8080/geoserver/LordWor/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=LordWor:hemav-fincas&maxFeatures=1721&outputFormat=json"
if allFields.isEmpty {
let mapsFacade = MapsFacade()
mapsFacade.coordinatesWFS(url: WFS_JSON,
callbackFuncionOK: coordinatesWFSOK,
callbackFunctionERROR: coordinatesWFSOKERROR)
}
}
func coordinatesWFSOK( WFS_Response: WFSModel) {
let fields = WFS_Response.copyFieldswfs()
wfs = WFS_Response
for feature in 1...(wfs.features.count) {
//MARK: INSERT DATA FIELDS
DataBaseManagement.shared.addFields(inputPropertyIDFarming : wfs.features[feature - 1].properties.propertyIDFarming,
inputPropertyProducer : wfs.features[feature - 1].properties.propertyProducer,
inputPropertyVariety : wfs.features[feature - 1].properties.propertyVariety,
inputPropertyLand : wfs.features[feature - 1].properties.propertyLand)
for parcel in 1...(wfs.features[feature - 1].geometry.coordinates.count) {
if wfs.features[feature - 1].geometry.coordinates[parcel - 1].count == 1{//MARK: Without Hole
for poligon in 1...(wfs.features[feature - 1 ].geometry.coordinates[parcel - 1].count) {
//MARK: INSERT DATA FIELDS
DataBaseManagement.shared.addParcels(inputId_field: feature, inputCoordinatesJSON: String(describing: wfs.features[feature - 1].geometry.coordinates[0][0]))
}
}else{
for id in 1...(wfs.features[feature - 1].geometry.coordinates[parcel - 1].count) {//MARK: With Hole
if id == 1{
//MARK: INSERT COOERDENATES PARCEL
DataBaseManagement.shared.addParcels(inputId_field: feature, inputCoordinatesJSON: String(describing: wfs.features[feature - 1].geometry.coordinates[0][0]))
}else{
//MARK: this row contains all points for create a hole
//DataBaseManagement.shared.addHoles(inputId_hole: parcel, inputCoordinatesJSON: String(describing: wfs.features[feature - 1].geometry.coordinates[0][id - 1]))
//print("-------FIN PARCELA HOLE \(id - 1)---------")
}
}
}
}
}
//MARK: Get all group of Parcels
if allFields.count == 0 {
allFields = DataBaseManagement.shared.showAllFields()
total_parcels = DataBaseManagement.shared.showAllParcels()
}
drawFields()
}
func deleteAllParcels(){
for i in 0...total_parcels.count - 1 {
DataBaseManagement.shared.deleteAllParcels(inputId: i)
}
}
func deleteAllFields(){
for i in 0...allFields.count - 1 {
DataBaseManagement.shared.deleteAllFields(inputId: i)
}
}
func drawFields(){
//MARK: Field All Array wiht all (properrties for field and yours parcels)
for i in 0...allFields.count - 1{
let arr = try! JSONSerialization.jsonObject(with: total_parcels[i]._json_Parcel.data(using: .utf8)!, options: []) as! [[Double]]
allFields[i]._parcel.append(total_parcels[i]._json_Parcel);
//MARK: SAVE LATITUDE AND LONGITUDE IN ARRAY
for j in 0...arr.count - 1{
let longitude = arr[j][0]//latitud
let latitude = arr[j][1]//longitud
rect.add(CLLocationCoordinate2D(latitude: latitude, longitude: longitude))
}
//MARK: DRAW ON THE MAP
let polygon = GMSPolygon()
polygon.path = rect
poligons.append(polygon)
rect = GMSMutablePath()
polygon.fillColor = UIColor(red: 8/256, green: 246/255, blue: 191/255, alpha: 0.3)
polygon.strokeColor = .blue
polygon.strokeWidth = 2
polygon.map = mapView
}
let end = NSDate()
self.timer.stopAnimating()
print("TIME CHARGE 'MAIN MAP'")
print(start)
print(end)
}
let urlSnapshot = "..."
func getDeliverablesForField(){
let deliverablesFacade = DeliverablesFacade()
deliverablesFacade.snapshots(url: urlSnapshot,
callbackFuncionOK: snapshotsOK,
callbackFunctionERROR: snapshotsERROR)
}
func snapshotsOK( snapshotsResponse: SnapshotsLegendModel) {
snapShotsLegend = snapshotsResponse.copySnapshots()
print("end recover fields")
}
func snapshotsERROR(_ httpCode: Int,nsError: NSError) {
if httpCode == -1 {
print(nsError)
print(httpCode)
}else{
print(nsError)
print(httpCode)
}
}
var onlyOnetime = 0
func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D) {
for polygon in poligons{
if (GMSGeometryContainsLocation(CLLocationCoordinate2D(latitude: coordinate.latitude, longitude: coordinate.longitude), polygon.path!, true)) {
onlyOnetime = onlyOnetime + 1
if onlyOnetime == 1{
getDeliverablesForField()
showLegend.setValue(true, forKey: showLegendInformation)
let bounds = GMSCoordinateBounds(path: polygon.path!)
self.mapView!.animate(with: GMSCameraUpdate.fit(bounds, withPadding: 15.0))
self.iconBarLegend.isEnabled = true
self.iconBarLegend.tintColor = UIColor.black
}
polygon.fillColor = UIColor(red: 8/256, green: 246/255, blue: 191/255, alpha: 0.9)
polygon.strokeColor = .blue
polygon.strokeWidth = 2
polygon.map = mapView
//self.viewDidLoad()
}
else{
polygon.fillColor = UIColor(red: 8/256, green: 246/255, blue: 191/255, alpha: 0.3)
polygon.strokeColor = .blue
polygon.strokeWidth = 2
polygon.map = mapView
}
}
}
func coordinatesWFSOKERROR(_ httpCode: Int,nsError: NSError) {
if httpCode == -1 {
print(nsError)
print(httpCode)
}else{
print(nsError)
print(httpCode)
}
}
#IBAction func goToAdvancedSearch(_ sender: Any) {
let advancedSearch: AdvancedSearchVC = UIStoryboard(name: "AdvancedSearch", bundle: nil).instantiateViewController(withIdentifier: "AdvancedSearchVC") as! AdvancedSearchVC
self.navigationController?.pushViewController(advancedSearch, animated: false)
}
}
extension MainMapVC: LeftSideDelegate {
func sendShapeDelivery(deliveryPos : Int){
if feedModelDeliveries[deliveryPos].swichtActiveLayer == true {
if true {
print("Not exist deliverable -> call WMS")
let nameDelivery = snapShotsLegend.legendEntries[0].deliverables[deliveryPos].url_layer
let urls: GMSTileURLConstructor = { (x: UInt, y: UInt, zoom: UInt) -> URL in
let bbox = self.layer.bboxFromXYZ(x, y: y, z: zoom)
let urlKN = "http://192.168.0.160:8080/geoserver/LordWor/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&tiled=true&STYLES=line&layers=LordWor:\(nameDelivery)&styles=&WIDTH=256&HEIGHT=256&SRS=EPSG:3857&BBOX=\(bbox.left),\(bbox.bottom),\(bbox.right),\(bbox.top)"
print("PETICION WMS DEL LALER: \(nameDelivery)")
return URL(string: urlKN)!
}
let tileLayer: GMSURLTileLayer = GMSURLTileLayer(urlConstructor: urls)
allDeliveries.append(tileLayer)
tileLayer.opacity = 0.5
tileLayer.map = self.mapView
}else{
let tileLayer: GMSURLTileLayer = allDeliveries[deliveryPos]
tileLayer.opacity = 0.5
tileLayer.map = self.mapView
}
}else{
let tileLayer: GMSURLTileLayer = allDeliveries[deliveryPos]
tileLayer.opacity = 0
tileLayer.map = self.mapView
}
}
}
The application communicates with protocols and delegates. For example, when we click on the swicht of the legend, the class "customCell" is able to detect the event "swichtValueChanged" and send it to a "didTappedSwicht" delegate of "LeftSideViewController", but when we move the slider the "customCell" class is not Able to detect the event "sliderValueChanged" and takes the event to close the view (because the legend on the left is closed with a swipe on the left).
How can I make it to detect the event of the slider and not to close the view?
Thank you
You should bind your Slider with two Events "Primary Action Triggered" and "Touch Up Inside"
Here I attached Image for your reference
and remove left swipe and right swipe gesture on this method
Method Description and code
1 "Primary Action Triggered"
When You click on slider the method will call "Primary Action Triggered"
Note : Disable your gesture
(UISwipeGestureRecognizerDirection.right and UISwipeGestureRecognizerDirection.left)
2 Touch Up Inside
Note : Enable your gesture both gesture
(UISwipeGestureRecognizerDirection.right and UISwipeGestureRecognizerDirection.left)

Swift UIView custom view won't update after ViewController action

I want the stepper in the View Controller to update the color in my custom UIView every time it is clicked. I'm not sure if the problem is due to the instance of the class or that the values of the variables (redd1, greenn1, and bluee1) are not being changed.
This is my first file:
class ViewController: UIViewController {
var colors = UIView1();
#IBOutlet var redStepper: UIStepper!
#IBOutlet var greenStepper: UIStepper!
#IBOutlet var blueStepper: UIStepper!
#IBAction func redChange(sender: UIStepper)
{
redValue.text = Int(sender.value).description;
colors.redd1 = Double(sender.value);
//self.view.setNeedsDisplay()
}
#IBAction func greenChange(sender: UIStepper)
{
greenValue.text = Int(sender.value).description;
colors.greenn1 = Double(sender.value);
//self.view.setNeedsDisplay()
}
#IBAction func blueChange(sender: UIStepper)
{
blueValue.text = Int(sender.value).description;
colors.bluee1 = Double(sender.value);
//self.view.setNeedsDisplay()
}
}
This is my second file:
class UIView1: UIView {
var redd1 = 0.0;
var greenn1 = 0.0;
var bluee1 = 0.0;
override init(frame: CGRect)
{
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
override func drawRect(rect: CGRect)
{
let circle = UIView(frame: CGRect(x: -75.0, y: -40.0, width: 200.0, height: 200.0))
circle.layer.cornerRadius = 50.0;
let startingColor = UIColor(red: (CGFloat(redd1))/255, green: (CGFloat(greenn1))/255, blue: (CGFloat(bluee1))/255, alpha: 1.0)
circle.backgroundColor = startingColor;
addSubview(circle);
}
}
drawRect is only called when the view is being added, so in your example, drawRect is called once, and not after changing the stepper.
Instead, change your stepper file to:
#IBOutlet var redStepper: UIStepper!
#IBOutlet var greenStepper: UIStepper!
#IBOutlet var blueStepper: UIStepper!
#IBAction func redChange(sender: UIStepper) {
redValue.text = Int(sender.value).description;
colors.redd1 = Double(sender.value);
updateColor()
}
#IBAction func greenChange(sender: UIStepper) {
greenValue.text = Int(sender.value).description;
colors.greenn1 = Double(sender.value);
updateColor()
}
#IBAction func blueChange(sender: UIStepper) {
blueValue.text = Int(sender.value).description;
colors.bluee1 = Double(sender.value);
updateColor()
}
And then add the updateColor function to your UIView1 class:
class UIView1: UIView {
var redd1 = 0.0;
var greenn1 = 0.0;
var bluee1 = 0.0;
func updateColor() {
let circle = UIView(frame: CGRect(x: -75.0, y: -40.0, width: 200.0, height: 200.0))
circle.layer.cornerRadius = 50.0;
let startingColor = UIColor(red: (CGFloat(redd1))/255, green: (CGFloat(greenn1))/255, blue: (CGFloat(bluee1))/255, alpha: 1.0)
circle.backgroundColor = startingColor;
addSubview(circle);
}
}

Resources