2015-03-23 2 views
0

Пожалуйста, не сразу дискредитируйте это дубликат, я был на stackoverflow, как 2 дня, пытаясь всеми способами сделать это, прочитал много статей в блогах (которые возможно, были слегка датированы) и до сих пор не повезло.Проблема с созданием прокручиваемого UIView (swift + Interface Builder)

В принципе, у меня есть пользовательский UIView, который предназначен для рисования большого количества кругов (это только отправная точка), и я не могу получить представление, чтобы прокрутить вниз до тех, что были за исключением видимых кругов при начальной загрузке. Я сделал цикл for около 200 из них, чтобы убедиться, что есть что-то прокрутить.

вот мой взгляд код:

import UIKit 

class Draw2D: UIView { 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder); 

    } 

    override func drawRect(rect: CGRect) { 

     let context = UIGraphicsGetCurrentContext(); 

     CGContextSetLineWidth(context, 2.0); 

     let colorSpace = CGColorSpaceCreateDeviceRGB(); 
     let components: [CGFloat] = [0.0, 0.0, 1.0, 1.0]; 
     let color = CGColorCreate(colorSpace, components); 

     CGContextSetStrokeColorWithColor(context, color); 

     var ctr = 0; 
     var ctr2 = 0; 
     for(var i:Int = 1; i<200; i++){ 

      var ii: CGFloat=CGFloat(10+ctr); 
      var iii: CGFloat = CGFloat(30+ctr2); 
     CGContextStrokeEllipseInRect(context, CGRectMake(ii, iii, 33, 33)); 

      if(ctr<200) 
      { 
      ctr+=160; 
      }else{ 
       ctr=0; 
       ctr2+=50; 
      } 
     } 

     CGContextStrokePath(context); 

    } 
} 

В интерфейсе строитель, установить класс представления в Draw2D и контроллер для моего пользовательского класса ViewController. Класс контроллера вида в настоящее время является стандартным, без добавления дополнительных параметров.

Я попытался перетащить вид прокрутки на экране, я попробовал удалить стандартный вид, добавив прокрутку, а затем нарисовал вид Draw2D поверх этого, и это не сработало. Я попытался изменить размер прокрутки, чтобы сделать его меньше, чем мой контент (draw2d), и ничего. Я попытался снять флажок с автоматической компоновки, а также изменить симулированный размер на произвольную форму в соответствии с определенными учебниками, которые я нашел в Интернете.

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

ответ

2

Во-первых, вы можете наследовать от UIScrollView непосредственно:

class Draw2D: UIScrollView { 

Далее вам нужно установить размер содержимого UIScrollView на высоту элементов вставленных. Например, предположим, что у вас есть 4 круга:

let radius: CGFloat = 200 
var contentHeight: CGFloat = 0 

for i in 0...4 { 
    // initialize circle here 
    var circle = UIView() 

    // customize the view 
    circle.layer.cornerRadius = radius/2 
    circle.backgroundColor = UIColor.redColor() 

    // set the frame of the circle  
    circle.frame = CGRect(x: 0, y: CGFloat(i)*radius, width: radius, height: radius) 

    // add to scroll view 
    self.addSubview(circle) 

    // keep track of the height of the content 
    contentHeight += radius 
} 

На данный момент у вас есть 4 круга один за другим, подводя до 800 пикселей по высоте. Таким образом, вы должны установить размер содержимого представления прокрутки следующим образом:

self.contentSize = CGSize(width: self.frame.width, height: contentHeight) 

Насколько contentHeight> устройство высоты экрана, то ваш вид будет прокручиваться.

Полный рабочий код ниже:

import UIKit 
import Foundation 

class Draw2D: UIScrollView { 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     let radius: CGFloat = 200 
     var contentHeight: CGFloat = 0 

     for i in 0...4 { 
      // initialize circle here 
      var circle = UIView() 

      // customize the view 
      circle.layer.cornerRadius = radius/2 
      circle.backgroundColor = UIColor.redColor() 

      // set the frame of the circle 
      circle.frame = CGRect(x: 0, y: CGFloat(i)*radius, width: radius, height: radius) 

      // add to scroll view 
      self.addSubview(circle) 

      // keep track of the height of the content 
      contentHeight += radius 
     } 

     self.contentSize = CGSize(width: self.frame.width, height: contentHeight) 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

} 
+0

Должен ли я создать этот класс программно в контроллере представления? Дело в том, что я использую раскадровку. В таком случае следует перетащить представление или просмотреть прокрутку? Когда я делаю это, вызывается требуемый init, вызывающий ошибку, поэтому я спрашиваю, нужно ли мне создавать это представление в коде или есть ли способ сделать это из раскадровки с помощью init (frame) называется? –

+1

Я не слишком много работаю с раскадными версиями, но если вы использовали это в своем ViewController, просто добавьте следующее в метод viewDidLoad: var draw: Draw2D = Draw2D (frame: self.view.frame) self .view.addSubview (draw) –

+0

работал отлично. Благодаря ! –

Смежные вопросы